[表示 : 全て 最新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/


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'
でしょうか。

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 ]
あ、粒子法ってメッシュないんだっけか?
粒子数だっけ?






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

前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