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/
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' でしょうか。
169 名前:デフォルトの名無しさん [2009/04/20(月) 17:42:55 ] ちょっと質問というか確認 ディスクがフラグメンテーションしてる場合、データの分断を許すような 実装だと、ディスクへのアクセスはアドレスのテーブルみたいのを参照 しながらじゃないと原理的にできないよね フラグメンテーションしててもデータの分断を許さないような実装なら、 ディスクスペースの使用効率は下がるかもしれないけど、テーブル参照が 不要になるからアクセスが速くなるはず・・・だよね? 速度を要するスパコン用のファイルシステムって、そういう実装なのかなぁと想像・・・
170 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 23:17:11 ] >>167 ダイレクトアクセス知らなかったのか。 >直接アクセスする とか書いているから知ってるかとw 昔の映画のコンピュータで磁気テープがグルグル回っているのはダイレクトアクセス ファイルを読み書きしているんだべなぁ。
171 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 03:39:52 ] テープが 今で言う、ディスクとメモリの両方を兼ねてたからね。 ほんのちょっと前にFACOMのやつにテープはめるのをした。 あれ、テープのはしっこを挿入口に近づけると空気で吸い込んでくれるのね。 人間の手で全部とりまわさないといけないのかと思ってたよ。
172 名前:164 mailto:sage [2009/04/22(水) 15:52:56 ] >>170 不勉強故、失礼しました。 ところで、磁気テープというのは今も使われているものなのでしょうか? 今、20半ばの院生ですが、テープというのを見たことがありません。
173 名前:デフォルトの名無しさん [2009/04/23(木) 01:43:48 ] fortranで円やら球を離散化?させたい。 円の場合 function X(a) X=cos(3.14*a/360) end function Y(b) Y=sin(3.14*b/360) end こいつを回せば、円をつくることはできる。でもXは小数点の数字になっているよね。 でもやりたいことは、2次元配列を作成して、F(x,y)のx-yのメッシュの中で 円を作成するには、x−yは整数である必要がある。どうすればいいの? わかる人いますか? この円・球構造について、拡散方程式やら偏微分方程式を解きたいと思っているんだけど、 こういうことってできますか?
174 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 03:11:15 ] すなおに極座標なり円柱座標にするがよろし
175 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 06:57:36 ] >>173 メッシュが正方格子でなければならない理由はあるんかいな? Yesならメッシュを細かくするしかないなぁ・・・ 節点座標値が整数でなければならない理由はないと思うょ
176 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 09:04:46 ] 球や円を特徴的な構造として持つ系にカルテジアンを無理矢理持ち込むのは無理があるにょ ギザギザがでるし、30度とか45度回転させた初期値境界値で同じ計算すると結果が結構違うにょ。 査読受けたら絶対そこを突っ込まれるにょ。 んで満足いく事例を出せなかったらそこで終わりにょ。 学部生より上なら極座標なり175の言う通り非構造格子にしてきちんとするのがいいにょ。 学部生なら、卒研としてならまあ許されると思うにょ。・・・Fortranと関係なかったにょ。
177 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 00:48:54 ] >>173 どうしても直交座標にしたいなら、かなり細かくメッシュを区切って、 計算結果にある値をかけて、整数にするとか。 新しく買ったCorei7で計算させたら、滅茶苦茶速くてびっくりした。 PenMのノートで10分かかる計算が1分で出来て、しかも8個同時に走らせても余裕。 64bitOSを積んだから、というのもあるのかな。
178 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 05:33:49 ] >PenMのノートで10分かかる計算が1分で出来て、 まあ、これはそうだろうなあ。 >しかも8個同時に走らせても余裕 へえ。よさそうだね。 余裕、というのは「一個の時のまあ8割くらいのスピードで8個とも動く」くらいなの?
179 名前:デフォルトの名無しさん [2009/04/24(金) 16:38:50 ] >>175 メッシュが正方格子でなければならない理由はあるんかいな? 教官から貰ったコードが正方格子のだったけど、 変更できない、とかかな? そもそも173のやりたいことがいまいちよくわからない。 Fortranとは関係ないし、ここまでかな
180 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 00:30:02 ] >>178 特に並列化をしていない(というよりも、並列化がうまくいかなくて結局諦めた)ものを走らせると 大体16%ぐらいのCPU使用率になるから、 8個ぐらい走らせると100%使い切るようになるからね。 この使用率からすると、たぶんそれぞれ8〜9割で動いているといったところかな。 うまいこともっと最適化できないかな・・・。
181 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 00:40:55 ] >>180 物理CPUは4個だろうから、よほど例外的な場合でなければ多分4つより大だと帰って遅くなるだろう。
182 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 14:40:15 ] 178です >>180 ありがとう。 少なくともOSが認識する使用可能なリソースはフルに使い切れるんだね。 >>181 Xeonの2コアが4つ乗ったマシンでOpenMPを走らせると きれいに8倍になってくれたけど、これとはまたいろいろ設計が違うんだろうな。
183 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 01:08:12 ] >>181 よく考えたらそうだよなあ… 実際時間を計ってみたら、8個計算の時間 / 2 > 4個計算の時間だし。 ただ、実際には数百から数千個計算するし、それぞれ条件が違うから時間もバラバラで、 その待ち時間を埋めるために、まとめて計算するほうが速かったなあ。 プログラム内でうまく並列化をしてフルに使い切れればいいけれど、なかなかうまくいかないんだよな…。 OpenMPをコマンドを入れたら、かなり遅くなったし。
184 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 11:27:08 ] >>183 なるほど〜。 どちらかというとたくさんある計算をぼんぼん 放り込んでおける、事がメリットなのかもね。 そうなるとqueueの管理の仕方がみそ?
185 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 13:12:42 ] >>183 Corei7は、物理4コアをハイパースレッディングで見かけ8コアにしている。 純粋に計算などが重い場合ハイパースレッディングは足を引っ張るだけ。 そのばあいは4スレッドで動かすほうがいい。 MKLのLinpackのBenchmarkをやってみるとどのくらい遅くなるかわかる。 OpenMPのオプションでスレッド数を物理コア数に合わせるようにすると本来の力を発揮する。 あるいはBIOSでハイパースレッディングを切るとかいう手もある。 ただハイパースレッディングが有効な場合もあるので、個別の事情に依る。 自分で試すしかない。
186 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 15:36:02 ] MPIなりOpenMPで4並列のジョブを放り込んだばあい、 ちゃんと1プロセス/1CPUにふってくれるのかな?
187 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 23:50:26 ] >>186 いや、なんか環境変数にそれなりの指定をしないと、1スレッド1物理プロセッサに 必ず行くとは限らないので遅いまま。 OpenMPのマニュアルの環境変数のところを読めば書いてあったはずだが、 詳しくは忘れたw
188 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 12:50:57 ] なるほど・・・。 どちらかというと、dplace や mpirun みたいな並列実行の環境を調えるソフトの とりあつかう領域だね。dplaceだと dplace -c1,3,5,7 かな?実機でもってるわけでもないし、いまマニュアルが見れないからわかんねw HTがあると並列しながら、ふつうの文房具的にPCやWSを使えるわけだから 使い方次第では結構いいかもなあ。
189 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 11:50:18 ] 冗長な部分があってもいいから現在使っている配列の全てをバイナリに書き出して計算の中断ファイルを 作りたいんですけど、書き出す配列を全部列記する以外に楽な方法ってないでしょうか?
190 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 19:37:29 ] >>189 もう一回計算しなおせ!w データを後生大事に取っておくのは演算コストが高かった時代の名残。 むろん演算量にもよるがw
191 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 20:33:05 ] >>189 目的がよく分からないんだけど コード中の全ての配列をはき出すってこと?
192 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 22:53:03 ] >>189 行列がスパースなら,非ゼロ項を書き出すことにすれば,ちょっとはマシな気がする。
193 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 04:00:14 ] >>189 配列の全ての成分を書き出せば良いのであれば integer a(1:10000) real b(1:100,1:100) write(10)a,b とかではダメか?
194 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 06:16:46 ] >>190 デバッグとかあるし。 大型計算機とかだと、1計算の時間上限があるからね。 再開するのに必要な情報を全部ファイルとして書き出す選択肢は 持っていた方が良いと思うにょ。 >>193 それがいちばんだね。 書式指定無しでファイルにたたき落とす 違うシステムでは役に立たないけど、メモリの内容をそのままファイルに落とすので 書き込みも読み込み+計算再開も速い。 書式付きもできるけど、めちゃくちゃ遅いし。
195 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 14:33:24 ] >>194 デバッグ目的以外で、メモリの中身を全部ダンプする必要性が分からないんだが・・・ 今時の計算は反復計算などの単純なループ部が計算のほとんどを占めてて ループ開始前の前処理なんて全体から見れば知れてるわけで、 次回リスタート用のためにわざわざメモリのスナップショットを取る的な発想は今時ないでしょ。 メモリとストレージの速度差が開く一方の今日じゃなおさら・・・・
196 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 04:28:25 ] 理由は194が最初に書いてね? 195はあまり大きな計算はしたことがないんだろうな
197 名前:189 mailto:sage [2009/05/09(土) 15:11:48 ] 遅くなりました。 あー…書き方があいまいですいません、答えてくださった方ありがとうございます。 えと、粒子法的計算なんですけど、191さんがおっしゃっている通りです。 コード中のすべての配列をはきだしたいです。 193さんのやり方は当然わかりますけど、それだとwriteの後に吐き出したい配列を 列記しないといけませんよね。そういうの無しで全配列をばーっと吐き出す方法ないかな、 と思ったわけです。やっぱ使う配列をコツコツ列記するしかないみたいですね。 >>195 非定常計算なんで状況によっては計算途中の段階から少しだけ条件を変えて 計算したいとかあるんですよ。正直にやったら一週間近くかかるので。
198 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 16:24:49 ] >>197 質問がひどすぎw まぁベンダー拡張命令でメモリー全ダンプみたいなことが出来る機種もあった気がするw
199 名前:195 mailto:sage [2009/05/09(土) 16:47:04 ] 自分には>>189 の理由がいまだに分からん・・・(別に分かんなくてもいいけどさ) たしかに、スパコンでは数日〜1週間程度の計算しかしたことない。 大きい計算とは言えんか。 スパコンのジョブってたいてい時間制限が数時間のオーダーだから、 例えば30000ステップ計算したいとしたら3000ステップのジョブを 10回投げるってのが普通だよな。 粒子法はよく知らないけど、格子点はどんくらいなの?
200 名前:195 mailto:sage [2009/05/09(土) 16:49:29 ] あ、粒子法ってメッシュないんだっけか? 粒子数だっけ?
201 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 16:54:07 ] 背景場を途中から変えた計算をしたいのかな? 普通は計算再開に必要な変数の数(配列の大きさではないよ)って知れてるよね。 粒子法なら、粒子の位置・速度と経過時間くらいか。 あとはiterationのプロセス毎に計算する量や座標系のように 再生成に計算量のかからないものがほとんどだろうから、 それをとっておく必要はないし。 ふつうに193のやり方で落とせばいいんじゃね?たいした手間でもなし。 ところで、ダンプして落としたとして、変数の変更はどういう風に再開時に反映させる つもりだったんだろうか?
202 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 16:59:47 ] >>199 同意。細切れ計算するときに継承すべき情報はあるけど、ダンプする理由はないやね。 ふと、189の「配列全部」は別にダンプではないのでは、と思ったけどオイラの勘違いかな?
203 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 17:01:58 ] 読み返すと、「ダンプ」を最初に使ったのは195さんだw
204 名前:195 mailto:sage [2009/05/09(土) 17:17:34 ] ダンプっていうのは大げさでしたなw イメージ的に使ってしまった
205 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 17:55:35 ] 無料のfortran77向けのコンパイラで、高速なものはありますか? 用途はCFDです。 まあ趣味なので大きな計算は必要ないのですが。
206 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:52:54 ] fortran歴1週間の質問です 論理型を整数型その他に変換できますか? 例えば、いくつかの言語では (a>b) 等とすると0または1が得られますが これと同等なことをFORTRANでも行いたいのですが方法がわかりません 無理ならすんなり諦めます
207 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 00:55:29 ] >>206 一般的な回答としては、できない。 不可能ではないという意味では、IF THEN ELSE でやれば出来る。 意図しているイメージに一番近いだろうと思われるのは、TRANSFER関数で型変換をすること。 しかし、FORTRANの規格では論理型の内部状態を定義していないので 0/1に投影できるかは運しだい。普通は0/-1が多い(真:ビット全部0と偽:ビット全部1)。
208 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 01:51:22 ] >>207 早速ありがとうございます 何となくですができました
209 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 05:17:13 ] logical lonlon real a, b a=1.0 b=2.0 lonlon = (a .GT. b) write(*,'(i3)') lonlon なるものをつくると、 最後の行で型が合わないと怒られる 0がでてくる 1がでてくる -1がでてくる、 の4パターンあったw 危険だw
210 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:13:40 ] g77のよく使う高速化のためのコンパイラオプションを教えてくださいませんか。 それかコンパイラオプションをまとめているサイトないですか? gccのまとめを見ればよいのでしょうか?
211 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:18:17 ] >>206 どういう用途? 論理型が用意されてる言語なら、特に理由がない限りそういうマネはやめたほうがいいかと シェルスクリプトレベルならよくやるけどさ
212 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:34:28 ] >>210 まずググれ。話はそれからだと思う。
213 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 01:13:00 ] でも、コンパイラのドキュメントしっかり読んで全部の仕様を熟知してる人なんて、ほとんどいないよな こんなオプションあんだ・・・でも何に使うんだろ、ってのばっかだ俺w
214 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 12:22:05 ] 論理型と整数型の混用は、非常に有用な場合もないではないけど、 基本的にはやるべきでない。
215 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:00:38 ] ちょっとインチキして logical:: L(1) L = (2.0 < 1.0) write(*,*) count(L) L = (1.0 < 2.0) write(*,*) count(L) とか
216 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:37:43 ] >>214 バグの元じゃない?
217 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:53:39 ] >>216 3つの条件abcのうち2つ以上が真なら、という場合に、 a = 条件式 b = 条件式 c = 条件式 if (a + b + c >= 2) ... とか。Cの場合だけど。
218 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 21:39:08 ] 後でメンテする時、無駄に手間食うからそういうのやめてくれ〜
219 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 22:35:22 ] 1960年代のおばあちゃんの知恵というかライフハックw風のプログラムだな。
220 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 02:46:28 ] >>218 4つの式が近くの行にあればいいけど、すごい離れた所にあるといろいろ嫌だよね
221 名前:デフォルトの名無しさん [2009/05/22(金) 20:21:01 ] LOGON TSS
222 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 22:46:55 ] >>221 READY
223 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:18:35 ] Intel Fortran 10 を使っています。 ifort独自文法のform='binary'でファイルを開いてデータ出力しています。 そのファイルはC言語のファイルフォーマットが公開されているんですが、 unsigned int となっている部分をifortで出力する方法がわかりません。 この部分だけC言語で記述して呼び出す形ならできそうな気がしていますが、 Fortranだけで完結させる方法ってありますか? アドバイスよろしくお願いします。
224 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 01:55:11 ] >>223 32bitのunsighned int? 読み込みのほうはINTEGER*4 でうけて、それをINTEGER*8にTRNASFER関数で 適当な位置にコピーするか、出力サブルーチンを作って負数の場合は INTEGER*8でUINTの場合の数を求めて出すという方法が考えられる。
225 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:05:07 ] 倍精度の変数宣言だけど、 real(8) a double precision a どっちやねん、と思ってた。 先日規格を見たら後者だったので、ウヒー! 今後は全部後者で統一する。行が長くなって、チョトいや。
226 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:13:09 ] >>225 どっちでもいい。後者は昔風の書き方。 今はむしろ前者が主流だと思う。
227 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:40:28 ] >>226 うーん、こんなHPもあるからなぁ・・・ 4.1 Fortranのデータ型 www.nag-j.co.jp/fortran/FI_4.html#AUTOTOC_4_1 コードを見られる可能性がある案件は、規格にならった方が よさそうな気もする。