FORTRAN �W
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/12(日) 17:13:35FORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。
・FORTRAN関連情報
お約束だが、まずは自分で調べよう
http://www.google.co.jp/
x86で動作するFortranコンパイラ
http://www.nminoru.jp/~nminoru/programming/x86-fortran.html
The Fortran Company
http://www.fortran.com/
Polyhedron Software
http://www.polyhedron.co.uk/
Google Directory - Fortran
http://directory.google.com/Top/Computers/Programming/Languages/Fortran/
・前スレ
FORTRAN III
http://pc8.2ch.net/test/read.cgi/tech/1104724162/
FORTRAN II
http://pc5.2ch.net/test/read.cgi/tech/1068351911/
Fortran
http://pc2.2ch.net/test/read.cgi/tech/1003214738/
0497デフォルトの名無しさん
2009/02/18(水) 02:22:54PURE 属性はもともと HPF で導入されたものなので、それなりのメーカならコンパイラ
にも最適化のノウハウの蓄積があるはず?
ELEMENTAL も一変数用にサブルーチン書いて、配列を渡せばいいので、DO..LOOPを
あからさまに書かずにすむ。時々ソースがすごくすっきりして楽になることがある。
でも、ついでだから古い人間を擁護してみるかw
FORTRAN77 にも、むきだしの良さがあるw
Fortran90 以降だとソース上は簡潔になっても、影で動的にテンポラリ配列とか取るので
気持ち悪いところもある。長時間並んだJOB がStackOverflow とかで止まっていたり
すると殺してやりたくなる。古い時代の人はその辺が嫌なのかもしれないw
COMMON もグローバル変数だと思うとむかつくだろうが、 自分でガベージコレクション
しながら、変数領域を自由自在に再利用して操っていると思うと、結構気持ち良い。
メモリーが貴重だった時代には、利用価値が高かった。
IMPLICIT に関していえば IMPLICIT NONE をつけた上で、頭文字を守ればいい。
C と違ってローカルスコープの捨て変数が使えないから、頭文字を守らないと
いちいち宣言部に戻って型を確かめないといけないのでめんどい。
Fortran では数値の精度が致命的に重要で、倍精度計算中に1個単精度が混じるだけでも
すべての結果が単精度のゴミになるのだから、数値精度に無頓着の他のおしゃれ言語の
連中の言説を信じると痛い目に会わされるw
0498デフォルトの名無しさん
2009/02/18(水) 13:19:26pure属性付けた他のサブルーチン呼ぶ時には
interfaceで引数部分の性質を教えて置かないといけないんだね。
f77書式で書いてるのに interface intent が
現れるのでムズムズするけどムズムズするだけなのでそのまま。
0499デフォルトの名無しさん
2009/02/26(木) 16:08:37ifort -QParallel でコンパイル+実行するとうまくいくんだけど、
同じソースをifort -Qopenmp でコンパイル+実行すると
Program Exception - stack overflow
っていうエラーが出る
ソース中にOpenMP構文は use omp_lib だけ
これってどうしたらいいのかな?
0500499
2009/02/26(木) 16:22:10-auto_scalar オプションでいけた
0501デフォルトの名無しさん
2009/02/26(木) 16:49:38だたの
-auto
や
-static
でうまく行くこともあるよ。あとは実行時の環境変数の
setenv KMP_STACKSIZE 16M
とかデフォより大きめに取ると幸せなことが多い気がする。
0502デフォルトの名無しさん
2009/02/26(木) 16:50:50ていうか、
-auto_scalar
ってデフォルトになってない?
0503デフォルトの名無しさん
2009/02/26(木) 17:23:54>>499は単にスタック不足なだけでは?
ところで、KMP_STACKSIZEってunlimitedに設定できないの?
0504デフォルトの名無しさん
2009/02/26(木) 17:58:56Fotranの場合ってどういう風に割り当てられるんだろう・・・そういやあまり意識したことなかった。
0505デフォルトの名無しさん
2009/02/27(金) 02:43:33元々はAUTOMATIC変数の類はスタックに、ALLOCATE命令のときはヒープだった気がする。
ただ歴史的経緯のせいでサブルーチン側で巨大な配列をとっているプログラムが多くて
それがSTACKOVERFLOWを引き起こすから、IntelFortranなんかはデフォールトでは
スカラー変数はスタックで、配列の類はヒープで確保するようになった気がする。
インテルの掲示板に、デフォールト・オプション切り替えの話が出ていた旗もするのだが
昔のことなので記憶がはっきりしない。
OpenMPを指定すると、オプションが切り替わってしまう話はこのスレに出ている。
http://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/59627/
FortranはFORTRAN66時代がSTATICに変数をとっていた関係で、
FORTRAN77で規格の上ではサブルーチン類の変数はAUTOMATICでありうるように
なったにもかかわらず、互換性の観点からデフォールトでSTATICに変数を
とっていることが多くて、それはFortran90でもしばらく続いていたという歴史的経緯がある。
0506デフォルトの名無しさん
2009/02/27(金) 11:54:19そのスレのSteveさんが言ってるlocal scalar variablesって、配列じゃない(次元1の)フツーの変数のことだよね?
だとしたら、
If you say /Qopenmp (or /Qopenmp-stubs), this changes to /automatic - ALL local scalar variables are allocated on the stack.
のALL local scalar variablesはALL local variables(つまりローカルスカラ変数だけじゃなく、ローカル配列変数も含む)の間違いじゃないかな?
勘違いしてたらすいません
0507デフォルトの名無しさん
2009/02/27(金) 13:12:01そうなんじゃないかな?
配列までスタックにとるからoverflowしていると考えるとつじつまが合う?
0508506
2009/02/27(金) 13:52:41そうだよね。SteveさんIntelのスタッフなんだし書き間違わないでくれよぉ・・・
OpenMPの場合にデフォルトで全てのローカル変数(スカラも配列も)がスタックになるのは
スレッドセーフのためってあるけど、逆に言えばそれらをstaticに扱ったらスレッドセーフに
ならないってことだよね。それってやっちゃまずいことなんだろうか?
OpenMPまともに使った経験がないもんで・・・識者の方コメントおながいします
0509デフォルトの名無しさん
2009/02/27(金) 14:48:49つけてコンパイルすると、仮にautomaticは嫌いだっと
-noauto
つけても消されるはず。なのでopenMPを読んだ状態だと
有無をいわさずにぜんぶautomaticになる・・・と理解しているけど。
shared属性をつけてかつcommonブロックに貼り付けるとかして
やや無理なことをしないとstatic領域には配置されないと思ふ。
-staticはその名のイメージとは違って共有ライブラリを使わない
(というか実行ファイルに埋め込んじゃう)オプションだし。
spec.orgにあるOMP2001の情報のところに試した人たちが
実際に使ったオプションが載ってるので、自分のところのシステムに
近い(or 同じ)マシンがあったらそれと同じモノをだいたい使っているけど、
まあ大間違いではないと思う。お薦めできるのかは分らないけど・・・。
0510デフォルトの名無しさん
2009/02/27(金) 15:30:30数値計算では馬鹿でかい配列は可能な限りstaticにするのが基本じゃない?
サブルーチン渡る度に配列をコピーとかやってられんでしょ?
その代わりメモリのアロケーションはコーディングする側がきちんと考えてあげないといけないけど。
この辺がリソースをある意味富豪的に使うことが前提とされるJavaやC#などのオブジェクト系言語との違いだね。
0511デフォルトの名無しさん
2009/02/27(金) 16:56:15副プログラムが並列のloop内にあるのか、
副プログラム内で並列のloopがあるのかで答は変わる。
0512510
2009/02/27(金) 19:38:52>>511の両方のケースとも知りたいので、よかったら教えてほしい。
流体とかの数値計算では行列の反復法とかはサブルーチン内でやるけど、
そういうケースでメモリのアロケーションはどうすべきなのか、という視点で興味があります。
0513デフォルトの名無しさん
2009/02/28(土) 00:58:18引数に載ってれば、Fortranは参照呼出しなんだから配列のコピーが生じるはずもない。
CやPASCALとは違う。(まぁ最近はVALUE属性も出来るようになったが)
ここでは副プログラム内で新たに割り付けられる配列の話だろう。
それが動的に取られるとして、スタックに取られるか、ヒープに取られるかの違い。
0514510
2009/02/28(土) 01:28:49>副プログラム内で新たに割り付けられる配列
あ、そういう話か・・・ありがとう。
自分は一時作業用の配列も全部メイン側で用意してやって引数渡ししてるんだけど、
そういうのはサブルーチン内でスタックやヒープで取ってやる方がいいのかな?
皆さんどうしてますか?
0515デフォルトの名無しさん
2009/03/03(火) 06:16:03メイン階層や他の副プログラムに行き渡らせるのが割りと
面倒臭いのでメイン階層でやってる。
メイン階層が長くなるのは正直あまり好みではない、けど
まあ好みの問題なだけなので気にしないようにしている。
allocatable使うと場合によってはプログラム内で明示するサイズより大きいメモリを扱えたり
(コンパイラはハンドルできるメモリサイズ < OSがハンドル出来るメモリサイズ、なので)、
格子数(データ数)の違う処理を同じ実行イメージで出来る(コンパイルしなおさなくて良い)のが
いいけど、最近ではサイズをプログラム内で固定変数で明示していちいちコンパイルしている。
その方がミスは少ない気がする。気のせいかもしれないけど。
0516デフォルトの名無しさん
2009/03/03(火) 12:11:34ブログだけどw
ttp://monologuemidnight.blogspot.com/2009/01/blog-post_03.html
module中の大域的な変数、save属性付きの変数→.bss
allocatable属性な配列→ヒープ
普通にサイズが宣言されている自動配列→スタック
手続き中の変数(mainでも同様)→スタック
ってことらしいが…。
この辺は規格ではないっぽいので、コンパイラの仕様をちゃんと確認したほうがいいな。
0517デフォルトの名無しさん
2009/03/11(水) 18:46:48gforntranでは改行されないんだけど。
real(8) a(5)
write(*,*) a(:)
とするとa(3)とa(4)の間で改行されちゃう。
0518デフォルトの名無しさん
2009/03/12(木) 04:57:59気持ち悪いけど、下記のようにしてもだめかな?
クラシックな書き方だけど。
write(*, '(100f10.5)') a(:)
0519デフォルトの名無しさん
2009/03/12(木) 09:37:42ありがとん。
write(*,'(100f)') a(:)
でいけた。
0520デフォルトの名無しさん
2009/03/15(日) 01:01:35出力するものが決まってるなら、改行してしまう書式の箇所に\(バックスラッシュ)を入れてもいい
0521デフォルトの名無しさん
2009/03/15(日) 11:34:42advanceはフォーマット文がいるから、結局519と同じでは?
0522デフォルトの名無しさん
2009/03/17(火) 03:12:33'(100f)' なんて書くよりはスマートな気がするけど?
ま、どうでもいいことだな
0523デフォルトの名無しさん
2009/03/18(水) 04:24:12write(*, '(f10.5,$)') a(i)
enddo
write(*,*) ''
はダメかな?
改行するなよ、の$は非標準だけどDEC以来ほぼ標準と思っていいのではないだろうか
0524デフォルトの名無しさん
2009/03/18(水) 21:51:40integer::i
integer,parameter::imax=5
real(8)::f(imax)
do i=1,imax ; f(i)=i ; enddo
print *, "print *,f"
print *, f
print *, '---'
print *, "write(*,'(f)') f"
write(*, '(f)') f
print *, '---'
print *, "write(*,'(f)') (f(i),i=1,imax)"
write(*, '(f)') (f(i),i=1,imax)
print *, '---'
print *, "write(*,'(f\)') f"
write(*, '(f\)') f
print *, '---'
print *, "write(*,'(f)',advance='no') f"
write(*, '(f)',advance='no') f
print *, '---'
print *, "write(*,'(f)',advance='no') (f(i),i=1,imax)"
write(*, '(f)',advance='no') (f(i),i=1,imax)
print *, '---'
end
0525>>524の結果
2009/03/18(水) 21:52:341.00000000000000 2.00000000000000 3.00000000000000
4.00000000000000 5.00000000000000
---
write(*,'(f)') f
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000
---
write(*,'(f)') (f(i),i=1,imax)
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000
---
write(*,'(f\)') f
1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 ---
write(*,'(f)',advance='no') f
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000 ---
write(*,'(f)',advance='no') (f(i),i=1,imax)
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000 ---
0526デフォルトの名無しさん
2009/03/18(水) 22:07:03print文かwrite文か、また出力並びをfとするか(f(i),i=1,imax)とするかで、
出力結果が違うのかと思ってやってみたが、違いはないっぽい。
というわけで、>>524をもっとすっきりさせた。
integer::i
real(8)::f(3)
do i=1,3 ; f(i)=i ; enddo
print *, "write(*,*) f"
write(*,*) f
print *, '---'
print *, "write(*,'(f)') f"
write(*,'(f)') f
print *, '---'
print *, "write(*,'(f\)') f"
write(*,'(f\)') f
print *, '---'
print *, "write(*,'(f)',advance='no') f"
write(*,'(f)',advance='no') f
print *, '---'
end
0527デフォルトの名無しさん
2009/03/18(水) 22:19:08write(*,*) f
1.00000000000000 2.00000000000000 3.00000000000000
4.00000000000000 5.00000000000000
---
write(*,'(f)') f
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000
---
write(*,'(f\)') f
1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 ---
write(*,'(f)',advance='no') f
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000 ---
結論
�@書式省略すると、適当な位置で改行してくれる(規格で決まってるんかな?)
�A書式指定すると、書式の中身が終わる度に改行
�B書式に\を付けると改行抑制
�C書式にadvance='no'(デフォルトはyes)を付けるとwrite文が終了したときに行う改行を抑制(�Aとの違いに注意)
って感じかな。
改行抑制の\と改行指定の/が混ざるとどんな出力になるんだろう。
0528デフォルトの名無しさん
2009/03/18(水) 22:20:24real(8)::f(3)
do i=1,3 ; f(i)=i ; enddo
は↓に修正。
real(8)::f(5)
do i=1,5 ; f(i)=i ; enddo
0529デフォルトの名無しさん
2009/03/22(日) 01:30:43コマンドプロンプトの右端で改行だと思う
違うかなー
0530デフォルトの名無しさん
2009/03/22(日) 10:23:20他のコンパイラでは改行しないので、コンパイラのせいだと思います。
>>524-528
ありがとうございます。
参考になりました。
write(*,'(f\)') f
が良さそうですね。
0531デフォルトの名無しさん
2009/03/23(月) 15:14:13Fortranに限らず、プロンプトのサイズは関係ないよ
0532デフォルトの名無しさん
2009/03/27(金) 05:59:41多次元配列の最初の数を入れることが多いです
例
program main
implicit none
integer,parameter :: num = 9
integer :: ii,jj
real :: arry(num,num)
do ii=1,num
do jj = 1,num
arry(ii,jj) = ii*jj
enddo
enddo
write(6,'(<num>F)') arry
end program
0533デフォルトの名無しさん
2009/03/27(金) 09:10:33勉強になった。
ありがとん
0534デフォルトの名無しさん
2009/03/28(土) 00:52:37WindowsはDOS窓のサイズで改行位置が変わるぞ。
0535デフォルトの名無しさん
2009/04/03(金) 21:43:51<>で整数くくるとその数が使えるんだね・・・知らなかった。昔からあった機能?
>>534
そうなんだ。>>531はLinuxの場合ルだけかな
0536デフォルトの名無しさん
2009/04/03(金) 22:09:05<実数変数>でも勝手に整数にキャストしてくれるね。
あと他のところにも、例えば
num1=5
num2=1
write(6,'(<num>F<num1>.<num2>)') arry
みたいにして使えるね。
0537デフォルトの名無しさん
2009/04/04(土) 02:01:36Fortran2008 では、 *( i3, '-' ) 見たいな感じで * が無限反復の指定子になるらしい。
0538デフォルトの名無しさん
2009/04/08(水) 09:50:52を、スキー帽がぶったバカボンのパパっぽい大人と
すました子供に見えるようになると、やばいね。
0539デフォルトの名無しさん
2009/04/08(水) 12:40:580540デフォルトの名無しさん
2009/04/17(金) 23:47:22簡単なプログラムを実行しようとしたんだけど、
ld: crt2.o: No such file: No such file or directory
ってエラーが・・・。ググってもよくわからず・・・。
助けてください。
0541540
2009/04/18(土) 00:12:280542デフォルトの名無しさん
2009/04/18(土) 20:15:44おまえ、プログラムのセンスあるから、今後も缶ばれ!
0543デフォルトの名無しさん
2009/04/19(日) 12:16:56自画自賛?
0544デフォルトの名無しさん
2009/04/23(木) 16:31:22cygwin以外でどうにか出来ますか?
0545デフォルトの名無しさん
2009/04/23(木) 22:10:010546デフォルトの名無しさん
2009/04/24(金) 00:32:48g95だな・・・
0547デフォルトの名無しさん
2009/04/24(金) 23:53:110548デフォルトの名無しさん
2009/05/13(水) 00:24:34reshepe使って一次元に落とし込んで処理しようとしたら、segmentation faultになってしまった。
コードはこんな感じ。
-----------------------------
program main
integer :: arr(3,4,5)
integer :: i,j,k
do i=1,3
do j=1,4
do k=1,5
arr(i,j,k) = i+j+k
enddo
enddo
enddo
call check(arr)
end program main
subroutine check(arr)
integer,intent(in) :: arr(:,:,:)
integer,allocatable :: tmp(:)
integer :: i,elem=1
do i=1,size(ubound(arr))
elem = elem * (ubound(arr,i)-lbound(arr,i)+1)
enddo
allocate(tmp(elem))
tmp = reshape(arr,shape(tmp))
do i=lbound(tmp,1),ubound(tmp,1)
print *,tmp(i)
enddo
end subroutine check
-----------------------------
0549デフォルトの名無しさん
2009/05/13(水) 01:22:27PRINT *, arr
でだめなのか?
0550デフォルトの名無しさん
2009/05/13(水) 20:37:56ほらよ。つーかこれテンプレにしてちょ
・形状引継ぎ配列を引数に使う
・割り付け配列を引数に使う
・ポインタを引数に使う
・引数キーワードやoptional属性を使う
・関数の返値を配列にする
↑をしたいなら、副プログラムは明示的引用仕様にしなきゃならない。
■明示的引用仕様
・副プログラムを内部副プログラムにする(呼び出し側でcontains)
・副プログラムをモジュール副プログラムにする(モジュールでcontains)
・副プログラムが外部副プログラムならば、それを呼び出す側でinterfaceを用意する
■暗黙的引用仕様(FORTRAN77的なやり方)
・副プログラムが外部副プログラムで、それを呼び出す側でinterfaceを用意しない
なお、副プログラムとは関数やサブルーチンを指す。
0551デフォルトの名無しさん
2009/05/13(水) 23:25:40多次元配列を一次元にするには PACK UNPACK を使うのが一般的だと思う。
Fortran90 で導入されている。
例題はマニュアルをみてちょw
0552デフォルトの名無しさん
2009/05/14(木) 23:40:08よくそこでバグがおきるんだ。
0554デフォルトの名無しさん
2009/05/14(木) 23:51:21>>550
0555548
2009/05/14(木) 23:51:43って〜ことは、呼び出し側でinterfaceを用意して、packで一次元化するということか。
------------------------------------------
program main
integer :: arr(3,4,5)
integer :: i,j,k
interface
subroutine check(arr)
integer,intent(in) :: arr(:,:,:)
end subroutine check
end interface
省略
call check(arr)
end program main
subroutine check(arr)
integer,intent(in) :: arr(:,:,:)
integer,allocatable :: tmp(:)
integer :: i
tmp=pack(arr,mask=(arr .ne. 0))
do i=lbound(tmp,1),ubound(tmp,1)
print *,tmp(i)
enddo
end subroutine check
------------------------------------------
これでできました。ありがとうございます。
余談だけど、gfortranでは期待通りに処理されるのに、intel fortranだとダメみたい。
pack()の返り値が壊れてしまうっぽい。バグか?
0556デフォルトの名無しさん
2009/05/15(金) 00:45:08tmpをALLOCATEしてないからかな?
ALLOCATE(tmp(SIZE([arr .ne. 0])))
これを入れておくと動く。
配列を返すものを、未割り当ての割りつけ配列に入れたときの挙動が、
F90の範囲ではプログラム側に問題があって悪いとおもうが、
新しい規格ではかなり自動で調整してくれるようになったので、
これがBugなのかどうか文法書を読み直さないと分からんw
[ ] はF2003で、f90なら(/ /) に対応。
0557556
2009/05/15(金) 00:49:27未割り当てALLOCATABLEに突っ込む例題が載っていた。
Fortran95までは出来なくて、F2003で出来るようになるものだそうだ。
あと、>>556で [ ] は無くても良かったw
0558デフォルトの名無しさん
2009/05/15(金) 01:22:11>新しい規格ではかなり自動で調整してくれる
へーそうなんだ
いちいちallocateしなくてすむのは嬉しい
0559548
2009/05/17(日) 22:24:17フォロー、ありがとうございます。
allocateでintel fortranでも無事動くようになりました。
てか、2003いいね。期待大。
0560デフォルトの名無しさん
2009/05/21(木) 00:38:15FORTRANで他からデータを読み込むのに、そのデータの最初にデータ概要が書いてあるので
読み飛ばす方法があったら教えてください
初心者なので分かりにくくてすみません
0561デフォルトの名無しさん
2009/05/21(木) 01:30:02適当な変数を定義して、読み込みだけさせて、その中身を
使わなければいいぢゃない。嘘データで良いから実例だし
てくれ。
# リアルなのを晒すとマズいかもしれんし。
0562デフォルトの名無しさん
2009/05/21(木) 01:54:07読み込むデータが
○月×日
気象データ
東京都日黒区
0.0001
0.0025
0.0025
0.0105
0.1568
1.5385
1.4657
12.368
こんな感じで数字の部分のみ読み込みをしたいです
0563デフォルトの名無しさん
2009/05/21(木) 02:05:29レコード長が分かってれば指定のレコード部を直接読みに行ける、はず
もっと良い方法あったらフォローよろ
0564563
2009/05/21(木) 02:08:22自信なくなってきた><;
0565デフォルトの名無しさん
2009/05/21(木) 02:15:570566デフォルトの名無しさん
2009/05/21(木) 09:45:54いくつか方法はある。
最初のデータ概要の行数が決まっていて一定ならば簡単で、
CHARACTER TEXT*256
DO i = 1, 4
READ(7, *) TEXT
END DO
的に読み飛ばせばいい。
手抜きな方法としては、数値変数に文字列を読み込むとエラーが出ることを利用して、
10 CONTINUE
READ(7, *, ERR= 10) dat
で無理に読み飛ばすことも出来る。
本物のエラーのときや、データ概要が数値として読めてしまうと困るw
やや高度な方法としては、いったん文字列に読み込んで、その文字列の中身をしらべて
文字列を内部ファイルとして入力に使って数値を読むという方法もある。
データ開始地点まで適当にすすんで、BACKSPACEで適切なところまで戻る手もある。
0567デフォルトの名無しさん
2009/05/21(木) 12:20:072つ目の手抜き法はオイラもよく使う。
念のため、
icount = 1
20 continue
read(7,fmt=*) string
read(string,fmt=*,err=10,end=999) dat(icount)
icount = icount + 1
goto 20
10 write(*,*) string
goto 20
continue 999
みたいに文字列を一度かまして
読み込みは内部ファイルで処理して、
飛ばされたケースは表示させて目でチェックするとか。
あまりほめられないスパゲッチ〜だけど。
0568デフォルトの名無しさん
2009/05/23(土) 20:59:00本気でスピード求めるならdirectアクセスがベストだが
多分あなたの使い方じゃそうじゃなさそうだから、普通に次々読んでいって
使わないデータは破棄しちゃえばいいじゃん
>>562がASCIIデータだとすると、5行目からの数字が欲しいなら、
do i=1,5
read(unit) tmp
enddo
とやって捨てちゃえばいい
0569デフォルトの名無しさん
2009/05/23(土) 21:16:21DO I = 1, 5
READ(NUNIT, *)
END DO
でおk
0570デフォルトの名無しさん
2009/05/23(土) 23:01:200571デフォルトの名無しさん
2009/06/09(火) 12:40:21変数のポインタ値を知る方法はありますか?
0572デフォルトの名無しさん
2009/06/09(火) 12:49:09無いが、サブルーチンに送ればわかる。
つまり、2次元配列を、サブルーチンの1次元形式引数の配列に渡せばよい。
0573デフォルトの名無しさん
2009/06/09(火) 13:18:41順番を知ることはできるのですが、メモリ上の位置を知ることは
できないのですね
0574デフォルトの名無しさん
2009/06/09(火) 13:32:54標準文法ではないが、LOC 関数などがベンダー拡張として用意されていることが多い。
またリンカーでマップを出力させると静的な変数ならばアドレスが分からなくも無い。
配列のならびに関しては、そのままでは分からないが、さらに EQUIVALENCE でも
かければ分かるのかもしれない。
0575デフォルトの名無しさん
2009/06/20(土) 14:16:58OPENMPで並列化してるんだけど、
デュアルコア環境でトータルCPU使用率が50%から上がらない理由わかる?
1コアしか使ってなくて2コア目がアイドルになっちゃう
0576デフォルトの名無しさん
2009/06/20(土) 14:21:55setenv なんたら、
をちゃんとしてる?
0577575
2009/06/21(日) 16:49:20環境はOSがXPProSP3で、Core2DuoE8500
0578デフォルトの名無しさん
2009/06/21(日) 18:23:29自動並列も同じだっけかな?
誰か詳しい人の降臨を待つしかないなw
0579デフォルトの名無しさん
2009/06/22(月) 09:45:02なぜ最初からWinXPだとかけないのだろうか?
自分が使ってるlinux+ifort9.1では、
setenv OMP_NUM_THREADS 8 (最後の8は適当なCPU数に置き換え)
で環境変数で並列数を指定することになってるけどな。Linuxでもシェルごとに違うはずだが。
実機がないのでWinXPだとどの程度違うのかわからんが、Intel提供の例では
setenv を set に換えるだけのようだ。
全体の監視&同期とり用のあまり忙しくないスレッドが1個走るはずだけど、
全部で5つはなんか多い気もするがそんなものかもしれない気もする。
>>578
CPUの位置のバインドは自動並列やらOpenMPの場合、Linuxでは dplace や taskset を使うな。
指定しないとふらふら移動することがあるからややこしい。
まあ詳しいWin機でいじくりまくってる神の降臨を待とう。Winでの並列に興味あるし。
0580575
2009/06/22(月) 17:58:29ProcessExplorerでスレッドの状況を調べてたら、メインスレッド以外無負荷だた
並列化を見直して負荷をかけるようにしたら100%まで掛けられるようになった
迷惑掛けてスマソ
0581デフォルトの名無しさん
2009/06/22(月) 23:05:58WinでのCPUバインドは環境変数でできた。
マニュアルに載っているはず。
イ7でハイパースレッディングの8コア運用していると、ちゃんとバインドしないと
性能が全く出ない。デフォで8スレッド運行してバッティングするし、4スレッドにしても
物理コアに割り当たるとは限らないようで放置プレイでは性能でない。
0582デフォルトの名無しさん
2009/06/23(火) 16:54:00環境変数でCPUバインドっていうのは、別にWindowsに限らず他も同じだと思う。
Intel FortranだとKMP_AFFINITY、PGI FortranだとMP_BLISTかな。
というか、いい加減環境変数の設定とかをユーザにやらせるんじゃないくて、
コンパイラがシステム構成を見ながら勝手に使うCPUを指定してくれればいいのに…。
どういうスレッドの配置が効率がいいかなんて、予想できそうなもんなのに。
0583556
2009/07/09(木) 23:41:32最近になって、Intel掲示板を見ていてようやく分かったが、オプションをつけないと
駄目らしい。
/assume:realloc_lhs
これをつけるとFortran2003解釈、つけないとFortran90/95解釈になるらしい。
0584デフォルトの名無しさん
2009/09/07(月) 13:50:420585デフォルトの名無しさん
2009/09/08(火) 07:43:50お、参考にしよう。
おまけ・・・になるのか知らないけどw
メインがCでFortranコードをサブルーチンとして呼び出してリンクするときは
締めの実行ファイル生成時には icc でリンクして実行ファイルつくってもいいけど、ifort で
ifort -nofor_main -no-ipo
ってやると振る舞いが礼儀正しい事が多い、気がする。
-no-ipo はリンクするときだけね。これがないとifortは無茶をするようだw
0586デフォルトの名無しさん
2009/09/27(日) 01:29:320587デフォルトの名無しさん
2009/09/27(日) 05:35:56gfortranで例えば自己完結している共有オブジェクト(.soファイル)って
作れるもんなの?
一々$(cernlib -G Motif mathlib)をつけてコンパイルするの
面倒くさい。
ライブラリ作ったこと無いんでアレゲな文章だが、もし誰かわかるのなら。
ちなみに、OSはUbuntu8.04な。
0588デフォルトの名無しさん
2009/09/27(日) 07:43:50http://wwwasdoc.web.cern.ch/wwwasdoc/shortwrupsdir/b100/top.html
のラッパーとして
http://gist.github.com/194480
というのを書いて
program main
use FunctionBinom
implicit none
integer::x,y
x=5
y=2
print *,binom(x,y)
end program
でコンパイルしてみると(もち、$(cernlib mathlib)はつけて)
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_integer':
binom.f95:(.text+0x14): undefined reference to `kbinom_'
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_double':
binom.f95:(.text+0x34): undefined reference to `dbinom_'
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_real':
binom.f95:(.text+0x54): undefined reference to `rbinom_'
collect2: ld returned 1 exit status
というエラー出る。何で参照先が無いのかさっぱりわからない。
0589デフォルトの名無しさん
2009/09/29(火) 00:00:44よく知らんが、関数呼び出しの名前規約が食い違っているとか。
エラーメッセージを見る限り、小文字でアンダースコア末尾付与の形式で
オブジェクトを探しに行っているが、確かに存在しているのかね?
名前一覧とか出力させるとか、バイナリエディターで直接のぞいてい見るとか。
0590デフォルトの名無しさん
2009/09/29(火) 03:11:28つけとく、とか
interface 文で前もって引数部を教えてあげるとか、
_binom みたく下付線つけとくとか、かなあ・・・違うな。う〜ん。
0591デフォルトの名無しさん
2009/09/29(火) 22:56:52>関数呼び出しの名前規約が食い違っているとか。
他の関数(例えば、票にもあるATGという関数)だとエラー無くできるし、
自分がマニュアル読む限り名前規約の話もないのよね。
>名前一覧とか出力させるとか、バイナリエディターで直接のぞいてい見るとか。
バイナリエディタは避けたい。名前一覧どうやって出力させればいい?
>>590
モジュラー性上げたいのでexternalを使いたくないのよ。
引用仕様記述は書いてあるよ。
0592デフォルトの名無しさん
2009/09/29(火) 23:04:23CERNLIBとかは使わず、何のライブラリ使っているの?NAG?
フリーであるならそのライブラリのラッパに鞍替えするわ。
0593デフォルトの名無しさん
2009/09/30(水) 10:40:07他人のライブラリなんか遅くて使えないし
0594デフォルトの名無しさん
2009/09/30(水) 12:41:03なぬ。それスパコン業界の一般論?>>593が自作好きというわけじゃなく?
新しいアルゴリズムで作る、というのならわかるのだけれど、
それ以外の速度的にもう上げられないだろう、上げる必要も無いだろう的
関数も自作かい。
0595デフォルトの名無しさん
2009/09/30(水) 15:42:43スパコンのアーキテクチャによって最適なアルゴリズムは違うだろうし。
x86なスパコン(クラスタというべきか?w)なら適当な余所様のライブラリでいいかもしれないけど。
0596デフォルトの名無しさん
2009/10/01(木) 02:38:44>バイナリエディタは避けたい。名前一覧どうやって出力させればいい?
ライブラリアン用のコマンドを使えば、一覧出せると思う。
メインフレームなら出来たw
>>594
ライブラリはその性質からどうしても汎用だから、自分の問題に合わせた
特殊条件を使って早くすることはあるな。
■ このスレッドは過去ログ倉庫に格納されています