[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 10/07 02:37 / Filesize : 345 KB / Number-of Response : 920
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれFORTRAN(超初心者用)その4



1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)その3
pc11.2ch.net/test/read.cgi/tech/1196384126/

くだすれFORTRAN(超初心者用)その2
pc11.2ch.net/test/read.cgi/tech/1164121236/

くだすれFORTRAN(超初心者用)
pc8.2ch.net/test/read.cgi/tech/1138063703/


●関連スレ
FORTRAN W
pc11.2ch.net/test/read.cgi/tech/1163319215/


68 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 19:42:57 ]
>>67
標準出力とエラー出力があるっていうのはUNIXの話だから、
メインフレーム上がりでUNIXをおもちゃと馬鹿にしているおっさんたちは、
そんなもの存在も知らず、相変わらず6番に出力していると思う。



69 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 00:56:09 ]
program mtest
integer, allocatable :: imem(:)
msize = 1000*1000 * 200
call alloc4i(imem, msize)
c :
stop
end

subroutine alloc4i(imem, msize)
integer, allocatable :: imem(:)
if ( .not. allocated(imem) ) then
allocate( imem(msize), stat=ier )
if (ier .ne. 0) stop
else
stop
endif
return
end

こんな感じでメモリ割付をするサブルーチンを作りたいのですが、サブルーチン側の
配列宣言でコンパイルエラーになってしまいます。このように親側でallocatableにした
配列は、サブルーチン側でどのようにallocateするのでしょうか?

70 名前:69 mailto:sage [2009/02/22(日) 00:57:29 ]
>>69
先頭のスペースが全て削除されてしまったようです。
c: の行は無視してください。

71 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 01:47:54 ]
>>69
外部サブルーチンだからエラーが出んじゃない?
内部サブルーチンやモジュールで使ってるけど
エラーは出ないよ

72 名前:69 mailto:sage [2009/02/22(日) 02:58:23 ]
>>71
program memtest
integer, allocatable :: imem(:)
msize = 1000*1000 * 200
call alloc4i
stop

contains
 subroutine alloc4i
  if ( .not. allocated(imem) ) then
   allocate ( imem(msize), stat=ier )
   if (ier .ne. 0) stop
  else
   stop
  endif
  return
 end subroutine
end program

レスどうもです。こんな感じでしょうか?
たしかにコンパイルは通りました。ただ、ライブラリ化
したいため、分割コンパイルしたいのです。何とか
外部プログラムで実現できないでしょうか・・・


73 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 04:39:47 ]
>>72
MODULEに入れるか、本体側でINTERFACEを書けばいいんでね?

ALLOCATABLE属性をつけても、77式に裸にしておくと、引数がマッチしているのか分からんから
怒られるんだと思うが。




74 名前:69 mailto:sage [2009/02/22(日) 09:30:19 ]
>>73
module malloc
 integer, allocatable :: imem(:)
 contains
  subroutine alloc4i(imem, msize)
  integer::imem(:)
  integer::msize
  allocate ( imem(msize), stat=ier )
  if (ier .ne. 0) stop
  return
  end subroutine
end module
program memtest
use malloc
 integer::msize
 msize = 1000*1000 * 200
 call alloc4i(imem, msize)
stop
end program

う〜ん・・・ f90に疎くて、こんなコードしか書けませんでしたorz
ホントは、下みたいな感じで、program側で複数の配列確保に使える
サブルーチンが欲しいのですが・・・

program memtest
  :
 call alloc4i(imem1,msize)
call alloc4i(imem2,msize)
  :


75 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 13:30:21 ]
>>74
やりたいのはこんな感じかな?
MODULE m_test
CONTAINS
subroutine alloc4i(imem, msize)
integer, allocatable, INTENT(OUT) :: imem(:)
integer, INTENT(IN) :: msize
if ( .not. allocated(imem) ) then
allocate( imem(msize), stat=ier )
if (ier .ne. 0) stop
else
stop
endif
return
end subroutine alloc4i
END MODULE m_test

program mtest
USE m_test
integer, allocatable :: imem1(:), imem2(:)
msize = 1000*1000 * 200
call alloc4i(imem1, msize)
call alloc4i(imem2, msize)
stop
end


76 名前:69 mailto:sage [2009/02/22(日) 20:12:35 ]
>>75
レスどうもです。
ズバリ75のコードなのですが、私のコンパイラ(Fortran PowerStation 4.0)ではエラーが出ます。
4行めがイカンと言っているようです。

malloc.f90(4):error FOR3435: symbol IMEM is a dummy argument
- cannot be ALLOCATABLE detected between IMEM and (

文法的には間違っていないと思うのですが・・・
別のコンパイラでも試してみようと思います。
コードの調整までして下さり、本当にありがとうございました。




77 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 23:41:01 ]
>>76
俺のおぼろげな記憶では、ALLOCATABLE な配列をサブルーチン側で ALLOCATE して
返せるようになったのは Fortran95 以降だった気がする。

Fortran90ではPointerでやるんじゃなかったかな?

文法書で確かめてくれw ガセネタだったらすまんこ。




78 名前:69 mailto:sage [2009/02/23(月) 06:31:29 ]
>>77
統合環境のオンラインマニュアルを良く読むと、以下の記載がありました。
 >Remarks
 >You can only use the ALLOCATABLE attribute to declare an array
 > that is not a dummy argument or a function result.

不注意でしたorz
どうやら仰る通りのようです。ポインタを勉強したいと思います。

実は、先輩がメインフレームで使っていたコードを引き継いだのですが、昔風のメモリ管理を
していて、ブロック名を直接メモリ域に書き込んだりしていたので、PC上ではコンパイル
出来ずに困っていました。それで、Fortran90を使って書きなおそうと考えた次第です。

重ね々々ありがとうございました。


79 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:15:50 ]
>>78
POINTERに直すだけなら簡単。
ただALLOCATABLEに比べて自由度が大きい分最適化やチェックに支障が出るらし。

MODULE m_test
CONTAINS
subroutine alloc4i(imem, msize)
integer, POINTER :: imem(:)
integer, INTENT(IN) :: msize
if ( .not. ASSOCIATED(imem) ) then
allocate( imem(msize), stat=ier )
if (ier .ne. 0) stop
else
stop
endif
return
end subroutine alloc4i
END MODULE m_test

program mtest
USE m_test
integer, POINTER :: imem1(:), imem2(:)
msize = 100*100 * 200
call alloc4i(imem1, msize)
call alloc4i(imem2, msize)
PRINT *, SIZE(imem1), SIZE(imem2)
stop
end

ASSOCIATED だけでいいのか今一自信なし。

80 名前:69 mailto:sage [2009/02/24(火) 07:04:42 ]
>>79
何から何まで申し訳ありません。
コードはコンパイル1発でOKでした。

allocate後は配列と同じように使えるみたいですし、cのポインタより保護されている感が
あっていいですね。危険性に関しては、昔のメモリマネジメントより随分安全と感じますが、
別ルーチンでしっかりチェックするつもりです。

ただ、f90は利用情報が少ないので、少しずつ勉強しながら使って行こうと思います
(周りに利用者がいない。f77かcかVB)。特にPCの処理系では、方言等ありそうですね。
規格にも目を通したいと思います。

色々とありがとうございました。


81 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 02:17:57 ]
モジュールで宣言した変数って自動的にsaveになるんですか?

82 名前:81 mailto:sage [2009/03/12(木) 21:16:17 ]
すいません。>>81は勘違いでした。

もう一つお聞きしたいんですが、INTERFACEって使ってますか?
外部プログラムを書いてから、また同じようなのをイチイチ書くのは
面倒臭いし、モジュールで全部代用できる気がするんですが・・・。



83 名前:81 mailto:sage [2009/03/12(木) 21:27:41 ]
ちなみに何故>>81で勘違いしたかですが、下のようなテストをしたところ
sub2でもi=1だったので、変数iはsave属性なのかと思ったためでした。
同じモジュール中の変数をuseしたから同じもの(実体)を見てるだけで
あって、save属性が付いているわけではない、が正解でしょうか?

以下、ソース(行頭タブは全角スペースにしてます)
module module0
 implicit none
 integer::i
contains
 subroutine set(j)
  integer,intent(in)::j
  i=j
  end subroutine
end module

subroutine sub1
 use module0
 call set(1)
 print *, 'in sub1 : i=' , i
end subroutine

subroutine sub2
 use module0
 print *, 'in sub2 : i=' , i
end subroutine

program main
 call sub1
 call sub2
end program

84 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 08:47:00 ]
>>83
変数のスコープや寿命について勉強してみてはどうかな?

85 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 13:10:10 ]
>>82
interface は使わないで済む事が多いよね。
pure 属性つけたサブルーチン内で
pure 属性つけたサブルーチンを呼ぶ時には
interface で前もって教えておかないとintel fortran に怒られるようなので
使うけど。これも多分使わないですむやり方がありそうな気もする。
>>83
愛が・・・

86 名前:83 mailto:sage [2009/03/13(金) 14:02:12 ]
どうもmoduleのuseを、Cでいうクラスのインスタンス生成みたいに
考えてたのが混乱の原因だったようです。

で、結局>>83の理解は間違っていますか?
教科書にモジュール変数をグローバル変数とする場合はsaveを付けろと
あるんですが、実際>>83のmodule0のiにsaveを付けても付けなくても、
module0をuseしたプログラムでiの値を確認すると、値が保持されているようです。



87 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 22:22:24 ]
>>86
教科書に書いてることは正しい。
Fortranの規格からすると、Module変数はSAVE属性は無い。
Fortran Handbook なんかにもわざわざ書いてある。

本来の規格の上では >>83 でiが消えてもいいように思う。
NAGあたりの規格への忠実さを目指したコンパイラで試してみればいいのではないかと思う。

>>82
INTERFACE は、ソースが無くてバイナリ-だけで配られているような、
ライブラリを呼ぶようなときに必要になるもんだと思う。
ソースが揃っているなら、Moduleにまとめておけばおk?



88 名前:85 [2009/03/14(土) 03:06:21 ]
>>87 の後半
正統なFortranではOKとおもう。が、
ソースが揃ってるか一つのファイルにまとまっているなら interface文は無くてもいい子・・・
と思ってたらifortは文句行ってきた・・。まあ害が無いなら、interface を呼ぶ側でぺたぺた
使ってもいいと思う。
呼ばれるサブルーチンの頭の部分を変更した時に、呼ぶ側全部でそれを意識していたかを確認できるし。
手間が増えるだけな気もするけど、勘違いやバグ防止の対価と思えば高くもない、かな。

89 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 02:09:34 ]
>勘違いやバグ防止の対価と思えば高くもない
たしかにそうね
先人が書いた得体の知れないFORTRAN77な外部副プログラムを安全に呼ぶために使う、とか

つーかinterfaceって名前が、javaやc#と意味が全然違くて紛らわしいというか、いまいち気に入らんw

90 名前:83 mailto:sage [2009/03/15(日) 20:19:01 ]
>>87
>本来の規格の上では >>83 でiが消えてもいいように思う。
とすると、>>83は実際には規格外の動作ということですか?
コンパイラはIntel Fortran 10.1です。(確かにintelはけっこう拡張してるからなぁ・・・)

メンバ変数みたいな真似をmoduleでやらせようかと思ってたんですが、
この方法じゃ駄目ぽいですね。そういうオブジェクト指向的なことって
Fortran2003をちゃんと勉強すればできるのかしら・・・?

91 名前:デフォルトの名無しさん [2009/03/16(月) 22:18:43 ]
サブルーチンがたくさんあるプログラムを作る時はmoduleよりもinterfaceの方が良いですか?
module間で相互にmoduleを参照(use)するとエラーが出て、悲しい状態です。
誰か教えてください。
ちなみに、moduleについて詳しく書いてある本があればそれも教えてください。

92 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 03:15:21 ]
そのエラーがどんなものか分からないことには何とも・・・

確かにmoduleはよく考えて使わないと面倒な目に合うな
個人的にはFortranやるなら、あんまり細かく部品化しすぎないほうがいいと思う

93 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 06:23:06 ]
>>91
module の前方参照のみしか許していないコンパイラーが多いよね。
ソースの前方に書いたmodule だけをuse するようにしてごらん。

94 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 14:24:33 ]
>>91
コンパイラは何?

95 名前:91 [2009/03/21(土) 12:36:18 ]
返事遅くなりました。すんません。
>92
サブルーチンは使いまくってます。
サブルーチンがないと不便です…。
>93
前方参照はmoduleをprogramより前に書けってことですよね?
moduleは別ファイルです。こんな感じになってます。
ファイルa.f90
module a
use b
contains
subroutine foo
...
end module a
ファイルb.f90
module b
use a
contains
subroutine bar
...
end module b
わかりにくい質問ですんませんでした。
>94
コンパイラはifort(ver.11)です。

inteface使えよって意見は出ないもんなんですね。
みなさんはサブルーチン使うとき、どうやってるでしょう?

96 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 19:50:38 ]
>>91
>module間で相互にmoduleを参照(use)する
相互にuseするのって不可能じゃないの?
コンパイルするときにuseするモジュールの.modファイルが必要だし。
というか、fortranに限らず相互に呼び合うようなのは概念的に許されるのかな・・・?
もし許されるとしても、混乱の元だろうし非常にまずいような・・・・


>inteface使えよって意見は出ないもんなんですね。
>みなさんはサブルーチン使うとき、どうやってるでしょう?
interfaceの主な用途としては、fortran77で書いた外部サブルーチンを
そのままいじらずに、より安全に使いたいとき、などじゃないかな。
形状引継ぎ配列や割付け配列などの機能を使いたいときは、
いずれにしろそのサブルーチンの修正が必要になるので、そのときは大人しく
モジュールで囲ってモジュールサブルーチンに変更すべきかと思うが。



97 名前:91 [2009/03/22(日) 10:19:29 ]
>>96
ありがとうございます。
相互に呼び出さないようにするためにはツリー構造を考えないといけないですね。
ちょっと面倒くさい気がします。

98 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 20:26:55 ]
結局>>91のエラーは解決したの?

99 名前:91 mailto:sage [2009/03/24(火) 08:27:42 ]
相互参照しないように書けば、エラーは消えます。
ただ、皆さんがどういう風に対応してるのか知りたかったのです。
お相手ありがとうございました。

100 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 12:58:20 ]
>>99
オレ、一個の超特大module にしている。

101 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 00:56:59 ]
>>96
めったに使わんが、関数なんかを引数にする汎関数?っぽいサブルーチンなんかでは
インターフェースを書いて引(関)数を指定せざるおえないな。
77時代はExternalを書いておけばよかったが、90だとInterface書かないと文句言われる。

F2003では、Methodの記述用にPROCEDURE(..)宣言子が新設されたので、
場合によってはインターフェース代わりに使えるのかもしれないが。



102 名前:デフォルトの名無しさん [2009/03/28(土) 12:21:25 ]
なんか、副プログラムの引数やら型を渡す儀式のパターンが増えちゃったよね。
並列計算を意識してか想定しているシステムの種類を
増やさないといけない関係かも知れないけど、
男は黙ってインライン、とはいかないのか。

103 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:43:15 ]
ちょっと便乗して質問します。今、不便を我慢して使ってきたcommon文を全部module文にしようかと
思ってるんですけど、何か気をつけるべきことやありがちな落とし穴とかありますかね?
もちろん自分でテストはしますが、後の運用性とか未然にバグを防ぐとかでもっと上手く出来そうなら
指摘してもらえますか?例えばこんな感じです。

PARAMETER (MNM=5000,MNC=100)
DOUBLE PRECISION CC(MNC)
COMMON /CELL/ CC,CG(6,MNC),NCX,NCY
COMMON /MOLS/ NM,PP(3,MNM),PV(3,MNM)
ってのが使用される各サブルーチン先頭に書いてあったのを

module mnpara
PARAMETER MNM=5000,MNC=100
end module

module cell
use mnpara
DOUBLE PRECISION CC(MNC)
real CG(6,MNC)
integer NCX,NCY
end module

module mols
use mnpara
real PP(3,MNM),PV(3,MNM)
integer NM
end module

と、mainの前に書いて、各サブルーチン中でuse cellなりuse molsなりと。
double precisionと型宣言の扱いがこれでいいか良くわからんのですがこれで大丈夫でしょうか?

104 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:56:59 ]
微妙に便乗して質問します。今、common文をmodule文に書き換えようとしてるんですが、
もちろん書き換えた後テストはしますが、もっと上手く出来るこれはよろしくないとかあれば指摘してください。

PARAMETER MNC=8000,MNSP=2,MNS=5
DOUBLE PRECISION COL(MNSP,MNSP),MOVT
COMMON /SAMP / COL,NCOL,MOVT,SELT,SEPT,CS
COMMON /CELLS / CC(MNC),CG(3,MNC),IC(2,MNC,MNS)

というのが各サブルーチンの先頭にあったのを

module mnpara
PARAMETER MNC=8000,MNSP=2,MNS=5
end module

module samp
use mnpara
DOUBLE PRECISION COL(MNSP,MNSP),MOVT,NCOL
real selt,sept,cs
integer ncol
end module

module cells
use mnpara
real CC(MNC),CG(3,MNC)
integer IC(2,MNC,MNS)
end module

と、mainの前に書いて各サブルーチンの先頭でuse samp;use cells
でよろしいでしょうか?double precisionと型宣言の扱いがこれでいいか少し不安ですが…
よろしくおねがいします。

105 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:59:42 ]
すみません…なんか書き込み失敗したと勘違いして連投してしまいました。
申し訳ないです。

106 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:50:31 ]
>>103
COMMON変数は、EQUIVALENCEっぽいというか、名前ではなく順番で、つまり
メモリーの位置で対応しあっているので、サブルーチンごとでCOMMON変数の名前が
変えてあると本体の変数名も直さねばならず一気に面倒になる。

あとから変数の受け渡しが必要になったらしくて、いくつかのCOMMON文の末尾だけに新しい
変数が加わっていたりするのも昔のプログラムでは良くあること。
一括変換で機械的に直せないことがままある。

幸運を祈る。



107 名前:104 mailto:sage [2009/04/02(木) 05:02:49 ]
>>106
回答有難う御座います。
すみません、common文が内部的にどう働いてるか実は良く
分かってないので的外れな質問かもしれませんが、
もしいくつかのcommon文の末尾だけに変数を書き加えて、
同一名のcommon文のサイズが違ったとすると、例えば別のcommon文の要素とかを
書き換えちゃいそうな気がするんですけど、そんなことしてまともに動くんでしょうか?
幸いそういうのは今のところ無さそうなんですけど、純粋に知識として気になって。



108 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 05:30:01 ]
「動作は未定義」じゃないのかね。

ま,includeすればそんな心配もない訳だが。

109 名前:104 mailto:sage [2009/04/02(木) 07:12:26 ]
すいません、未定義と言うのはどういうことでしょうか?
規格上定められてないのでどうなるかはコンパイラ等に依存するってことですか?

それともう一つお聞きしたいんですが、そのサブルーチン内で使ってない
moduleを呼び出した時の弊害ってあるでしょうか?無駄に呼ぶと速度とかに影響します?

110 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 09:30:17 ]
>>109
変数の数が違うとフツーは警告を出すだろうが,エラーになるコンパイラもあるかもね。
なんにせよ,そんな間違いをしない方法を考えた方が有益だろよ。

moduleの方は判らないなぁ・・・


111 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 11:15:23 ]
>>109
無名COMMONでは、各COMMONブロックごとのサイズは異なっていい。
(その代わりBLOCK DATA文で初期化できない)
文法書を読めば書いてある。

名前つきCOMMONはすべて共通の大きさでなければならないのだが、
名前つきCOMMONでもサイズが違っているプログラムはごろごろ転がっていた。

昔はハードウェアもOSもてんでんばらばらだったので、すべては処理系に依存する。



112 名前:デフォルトの名無しさん [2009/04/02(木) 14:42:53 ]
>>111
たいていのfortranコンパイラは警告を出すけど、そのまま作業を続けるよね。

関係ないけど、アメリカのSGIが潰れてしまった・・・。
alphaマシンがまた一つ・・。

113 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 16:40:18 ]
SGIって伝統的にMIPSじゃなかった?

114 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 00:39:20 ]
>>113
だな。
2ch的にはアルファは法則発動であぼーんと言うべきか。


115 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 03:53:41 ]
>>113
だね。
片手間?で「Alpha始めました」の張り紙を出したところが出始めは案外評判が良くって、
注力しはじめたところでAlphaが本領を発揮してアボン。


ifort ってバージョンの9あたりから、シェフお薦め最適化オプション -fast 付けるより
デフォの方が早かったりしない?
自分のコードが変なだけかもしれないけど、そういうケースに気付くようになった。

116 名前:115 mailto:sage [2009/04/03(金) 03:54:48 ]
sgiの場合AlphaよりはItaniumが疫病神か



117 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:45:54 ]
疫病神ヒドスw
Altixも終わりかな?

118 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 22:17:35 ]
>>115
デフォってオプション何もなしってこと?
-fastは-O3も含んでるけど、そんなことあり得るのかな?

119 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 01:06:57 ]
>>102
いや、悪くないんじゃ?w>男は黙ってインライン

いずれにしろFortranは速度も優先せざるを得ない以上、他の言語のように
抽象化しまくって直交性高めまくるやり方を期待するのは土台無理というもの。
やはりFortranerに一番必要なものとは「漢気」である。

120 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 03:15:30 ]
>>118,115
-fast = -O3 -ipo -static
が基本オプションかな?微妙にifortのバージョンで変わるみたいだから、
シェフお薦め、というのはそうだな。ip(o) が混じるから副作用があるのかも。

121 名前:120 mailto:sage [2009/04/04(土) 03:23:26 ]
ipoはインライン促進だからあまり副作用の心配はいらないか。
-O3 は unrolling促進やら含んだとおもうし、-staticも何か悪さする場合もありそうな気もする。
-fast -unroll0 で
あんろーりんぐ無しの最適化を試してみるといいのかも(順番大事だよ)。

122 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 04:15:42 ]
あ、インライン使うときは、リンクするライブラリはインテルアーカイバ(xiarだっけ?)で作ったほうがいいかも
何にしても-fastで遅くなるなんて悲しすぎるから、ちゃんと見直したほうがいいかと

123 名前:デフォルトの名無しさん [2009/04/04(土) 07:55:36 ]
version9あたりからデフォ(-O2)が速くなった気がするのは気のせいかな?

124 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 14:58:48 ]
static と dll でどっちを選んだほうがいいの?
おすえて

昔派の漏れは static の方が安心な気がするのだが、最近のデフォは dll だっけ?


125 名前:デフォルトの名無しさん [2009/04/04(土) 15:05:45 ]
ちょっと前はstatic推奨だったけどな。なんかバージョン毎の違いも大きそう。
自分が経験した例では、バージョン8くらいまでは -ftz つけると速くなったけど
9以降だと遅くなった、こととかかな。
intelも工夫してるんだろうけど、使う側もいろいろ試してちょ、という事か?

126 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:46:45 ]
>>123
-O2ってデフォでかかるの?

>>124
dllのほうが一般に速いという話を聞いたことが



127 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:06:46 ]
ifort --help
かけると、
-O0 disable optimizations
-O1 optimize for maximum speed, but disable some optimizations which,,,,,,
-O2 enable optimizations (DEFAULT)
-O3 enable -O2 plus more aggressive optimizations that may not improve
-O same as -O2
と出るね。linuxに入ってたversion9.1ではこうだった。

128 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:08:32 ]
というわけで
-fast や -O3
つけたらかえって遅くなっても
製造元の想定の範囲内って事で気にしないのが良いのかも知れないね。

129 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:13:45 ]
>>127
ほんとだ、v10.1でもそうだった
thx

130 名前:デフォルトの名無しさん [2009/04/05(日) 04:50:08 ]
g77 は最適化のレベルがたくさんあった気がするけど、
インテルはあっさりしてるよね。ゼロ・松竹梅の4つ。
マクドナルドと吉野家くらいメニューが違う。

131 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 12:52:09 ]
>>130
細かいオプションとかカテゴリーの違うものを比較してないか?


132 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:46:12 ]
今はgfortranだっけか
完全フリーでgnuより速いコンパイラって出ないもんかね

133 名前:130 mailto:sage [2009/04/06(月) 07:50:51 ]
>>131
ごめんよ。書いた後でこりゃ変だと思ったよ。
>>132
出ないものかね。でも、
いまのintelのポリシーだと、個人で商用目的でFortran/Cを使う人以外、そこそこ満足だからね。
フリーな奴の開発プロジェクトを立ち上げたり維持するだけの理由があまり無い気もする。

134 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:37:01 ]
なんて言っている大学関係者はたいてい犯罪者だけどな

Note that academic use of the products does not qualify for a non-commercial license.
Intel offers heavily discounted licenses to academic developers through our Academic Developer Program.

135 名前:133 mailto:sage [2009/04/10(金) 02:07:44 ]
>>134
ちょっと知ったかぶり、というか早合点、というかまぬけ。

それ、大学関係者じゃ自明じゃね?
まわりの奴は知らないだろうと得意がる子供は・・・

136 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 11:03:54 ]
まぁもちけつ・・・良スレで喧嘩はいかんよ

実際使っちゃってる香具師は少なくはないだろう
内部告発とか食らうとやばいかも?w

ちなみにAdobeとか違反使用に厳格なところは大学に何億って賠償請求することもある
Intelはあんまそういう話を聞かないが、寛容なのかなw



137 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 12:13:43 ]
133だけど・・・なにこれ?ひどす。

134のはまっとうな指摘だと思うよ。
いろんなソフトでアカデミックパック版があるしフリーソフトが当たり前にあるから、
特に大学に長くいる人はなんとなくライセンスに鈍感というか、
タダであることを当然と思うところがあるから。
>>136
フリーでつかって学習して潜在的なユーザーが増えると良いな、という事だろうけど、
論文に使った計算と、購入検討のための試運転の区別が付きにくい、という事はあるから
なかなかintelが積極的にライセンスチェックするのはコスト的にも難しいのかも。
というか計算結果にコンパイラ毎のクセが出るようでは困るw
それこそ内部告発でもなければintelも動けないだろうね。
その点あたりまえだけど純粋なソフト屋はその辺もっとシビアで迅速だよね。

138 名前:デフォルトの名無しさん [2009/04/11(土) 00:37:18 ]
質問よろしいでしょうか??

大学に入って初めてfortranにさわりました。
Frotran77を使用し、ソースプログラムは何とか書けましたが、次の作業の
コンパイルというものがよくわかりません。
OSはLinuxを使用しています。何か別のソフトをインストールして作業しないと
いけないんでしょうか?

よろしくお願いします。

139 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 01:24:23 ]
>>138
普通はg77とかgfortranとか入ってるだろうけど
学校で使ってるのなら、まずは教官に聞け。

140 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 17:28:30 ]
どうでもいい話かもしれんけど、コンパイラの開発ってどれくらいの規模と金かかるもんなんだろ
ハッカーな天才を何人か高給で雇えばいっちょ上がり、ってわけでもないよね?


141 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 17:48:34 ]
普通のソースコードを読んで、特定のマシンでとにかく動けばいいレベルの
コードを吐くだけなら、学生が1ヶ月かければ作れる。

仕様の細かいところまで厳密に対応し、高度な最適化をかけ、複数の
ターゲットに対応し、etc... となると複数人で継続してメンテナンスされる
プロジェクトになる。

142 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 12:51:36 ]
質問させてください。fortran90ソースをpgf90 でコンパイルしています。

write (*, 20) ( A(k),k=1,10)
20 format('A=',(' ',10i2))

例えば、上記のように、write文でdo形反復を用いて、配列Aの要素十個を
横並びに書き出すことは出来るのですが、

書き出したい要素数を n としたとき、n個を横並びに書き出すことは出来ますでしょうか。

下記の方法では、出来ませんでした。
write (*, 20) ( A(k),k=1,n)
20 format('A=',(' ',ni2))

よろしくお願いいたします。

143 名前:デフォルトの名無しさん [2009/04/12(日) 13:40:06 ]
この板にあるもう一つのFortranスレで似た質問を見た気がするから捜してみて。
多分それと違う答は・・・・

character*4 fmtstring
(中略)
write(fmtstring,'(i2.2,''i2'')') n
write(*,fmt=fmtstring) ( A(k),k=1,n)

かなあ。最初の文字列定義はプログラムの頭の方でしてね。
2行目でformatの中身を文字列で指定して
3行目で使ってる。でもこれダメなシステムもあった気がする・・。
intel と 富士通ではOKだったけど、pgfでは果たしてどうだろうか?まあ試してみて。

144 名前:142 mailto:sage [2009/04/12(日) 16:42:18 ]
ご提案ありがとうございます。
その方法を試してみましたところ、
コンパイルに文句を言われることは無くなりました!!

しかし、セグフォルトが出たので、これからデバッグかんばリます。。。

145 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:57:10 ]
その配列aに入っている値は二桁以下の整数(または一桁の負の整数)って
確定しているの?
i2だと二桁までだからもし3桁以上の数字が来ると、
そこで**とか出るだろうけど、どうも一部のシステムでは
そこでsegmentation faultになることもある。
なので特段の理由がなければi9くらいに
めけんとうで大きめな桁数にしとくと吉。

146 名前:142 mailto:sage [2009/04/12(日) 18:35:39 ]
はい、確かに2桁以下とは限りませんでした。
i9くらいにして、charactor の宣言も、それを許容できるくらいに取っていれば安心ですね。
ありがとうございます。

セグフォルトは他で出ているようです。
実は、ifort 用のソースをpgf90に書き換えているのですが、とても難航しています。
何かご助言を頂けないでしょうか。



147 名前:デフォルトの名無しさん [2009/04/12(日) 22:15:49 ]
本の書いてある通りにプログラムを組んだが、どうやってもランタイムエラーになってしまう。
誰か教えてほしい。
integer fulls,maxval,minval,sum,N,P
real avr
character subjct*30,FNAME*20
read(5,*) FNAME
open(1,FILE=FNAME)
read(1,*) sucjct,fulls

N=0
maxval=-9999
minval=fulls
sum=0

10 read(1,*,END=20) P
write(6,*) P
if((0.le.P).and.(P.le.fulls)) then
N=N+1
sum=sum+P
maxval=max(maxval,P)
minval=min(minval,P)
else
write(6,*)'Incorrect data! ignored'
end if
goto 10
20 close(1)

end
出典は、原田賢一 、2007:Fortran77プログラミング、サイエンス社 PP57

148 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:45:35 ]
gfortran (mingw build, ver 4.4.0) で -fno-automatic が効いてないみたいなんですけど
これって既出ですか?
以下再現するコードと実行結果です。
C------ a.f ------
      program main
      call test
      call test
      end program main
            subroutine test
      write(*,*) i
      i = i+1
      return
      end
C-----------------
> gfortran -finit-local-zero -fno-automatic -oa a.f
> a
           0
           0
他のコンパイラ(g77 や ifort -save)だとちゃんと 0 1 と出力されます。


149 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:49:30 ]
>>147
6行目
read(1,*) sucjct,fulls  => read(1,*) sucbct,fulls

150 名前:149 mailto:sage [2009/04/12(日) 22:50:40 ]
間違えた subjct ね

151 名前:デフォルトの名無しさん [2009/04/12(日) 23:39:12 ]
>>150
ありがたい。しかし、そこを直してもランタイムエラーが発生する。
コンパイラはSalfort FTN77だが、問題ないだろうか。
また、>>147で示した書籍で勉強した人はこの例題をどうしたのか良ければ教えてほしい。


152 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 23:46:11 ]
>>151
入力ファイルと、エラーメッセージがないと教えようがないです

153 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 01:26:13 ]
>>148
実はIntelFortranのwin32のdebug mode でも同じ問題がずっと存在しているw
releaseやx64ならおk。漏れはx64メインなのでバグレポートしてないw 
ごめんな、スチーブ



154 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 01:37:10 ]
スチーブww

155 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 01:59:50 ]
>>151
>>152のいうとおり、入力データファイルや、エラーメッセージを見ないとなんとも
答えようがない。テキストも持ってないし。

ただ、エスパー的に推測すると、入力ファイルの最後の行で数値データの
最後で改行していないためだろう。処理系によるが、空行がないとEND=nnに
引っかからない。

あと、
>if((0.le.P).and.(P.le.fulls)) then
これは多分 (0.ge.P) ではないかと思われる。
入門テキストであることをかんがみるに、科目ごとの平均点を求めるプログラムだろうが
点数が負のテストは少しばかり酔狂すぎる。
 

156 名前:153 mailto:sage [2009/04/13(月) 02:03:34 ]
ごめんw
>>148 の逆の問題だったかもしれない。
Automaticで0 clear を選択してもクリアされない。




157 名前:148 mailto:sage [2009/04/13(月) 20:49:55 ]
>>148の現象ですがどうやら既知の問題だったみたいです。
ttp://groups.google.co.jp/group/comp.lang.fortran/browse_thread/thread/57938d5454a90397/2e76214c47de894e?lnk=gst

しょうがないのでしばらくはsave文つけて対応することにしました。


>>156
148のa.fを使って試してみたところ、
Linuxのifort 10.1でも再現しました。
$ ifort -zero a.f
$ ./a.out
          0
          0
$ ifort -g -zero a.f
$ ./a.out
    5820432
    5820433


158 名前:デフォルトの名無しさん [2009/04/13(月) 22:32:07 ]
>>152
>>155
>>147だが動かすことが出来た。読み込むファイルの場所を間違えた場所に保存して
いたのが原因だった。終わってみれば単純なミスで申し訳なく恥ずかしい限りだ。
ただ、自分としてはFortranについて多くのことを学べた。ありがとう。

159 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 01:04:12 ]
初歩的な質問かもしれませんが・・・
Intel Fortran+Visual studio2005でOpenMPを利用して
ライブラリなどがインストールされていない環境でコンパイルしたプログラムを走らせたいのですが
「libiomp5md.dllがありません」と出てしまって、走らせることができません。

ライブラリのない環境で使いたいとき、どのようにコマンドを指定すればよいのでしょうか。



160 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 10:50:58 ]
ライブラリをstaticにリンクすればいいんでないの?

161 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 15:40:48 ]
>>148
gfortranはなんか色々変わりすぎてて気に入らないので、自分はもうしばらく手を出すつもりはないなぁ

>>156
0 clearって-zeroオプションのこと?
-zeroはsaved属性でかつ初期化されてない変数を0にするものだよね
-automaticはローカル変数をスタックに置いちゃうから、-zero付けても初期化されないと思う・・・多分

>>157
-gってデバッグ関係だよね?
save効果もあるんだ

162 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 01:40:49 ]
>>161
>0 clearって-zeroオプションのこと?
>-zeroはsaved属性でかつ初期化されてない変数を0にするものだよね
>-automaticはローカル変数をスタックに置いちゃうから、-zero付けても初期化されないと思う・・・多分

いや、32bit debugの時だけ変数0初期化が効かない。releaseではzero optionの有無で
0が出るか、ゴミが出るかが変わる。



最近、文法書を読んでいて知ったのだが、変数宣言時に初期値を与えると自動的に
SAVE属性になるそうな。漏れは、automaticなら、なんとなく毎回宣言時初期値に
初期化されるものだと思っていたよw 

163 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 11:18:58 ]
>>162
>いや、32bit debugの時だけ変数0初期化が効かない。
>releaseではzero optionの有無で0が出るか、ゴミが出るかが変わる。
じゃあやっぱりバグかぁ

>変数宣言時に初期値を与えると自動的にSAVE属性になるそうな。
そうそう、これ意外と盲点だと思う

164 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 20:23:47 ]
今後、数百・数千CPU以上の並列計算になると、ファイル数を並列数分だけ分割するのは
管理上煩雑なので何とかしたいところですが、何か良い方法はないでしょうか?

例えば、今まで並列数分だけ分けていたファイルを1個のファイルにまとめ、
Fortran内でデータの場所(アドレス)を指定することで直接アクセスする
ようなことができれば、かなり便利だと思うのですが。

165 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 23:37:04 ]
>>164
DIRECT ACCESS でだめなのか?
サイズが一定でないと困るが

166 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 14:15:43 ]
>>164
MPI2にそんな機能があったような



167 名前:164 mailto:sage [2009/04/19(日) 20:21:55 ]
>>165
directアクセスの存在を始めて知りました。
レコード長を把握しておく必要はありますが、効率は良さそうですね。

実際の使い方としては、recl指定子の値をデータの最小サイズで与え、
読みたいレコードの位置を逆算してread文のrec指定子に与える、
という方法で合っていますか?

>>166
なるほど。ということは、Fortranの実装とは別の機能を用いる方法もある、
つまりやり方は色々ある、ということでしょうか。

168 名前:164 mailto:sage [2009/04/19(日) 20:54:59 ]
>>167の補足ですが
>recl指定子の値をデータの最小サイズで与え、
と言うより、そのファイルを作ったときのwrite文のreclと同じ値をread文のreclに与える、
と言ったほうが適切でしょうね。

あと、使っていて気づいたことなのですが、statusを指定せずにopenしてwriteする場合
 sequential・・・いったん元のファイルを消した上で書き込み
 direct・・・ファイルのレコード位置に対する書き込み
という違いに気をつけないといけませんね。文法的に正確に書けば
 sequential・・・強制的にstatus='replace'
 direct・・・ファイルがあればstatus='old'、なければstatus='new'
でしょうか。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<345KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef