FORTRAN Ⅳat TECH
FORTRAN Ⅳ - 暇つぶし2ch404:デフォルトの名無しさん
08/03/16 18:23:17
>>403

LAPACK か ATLAS ではダメ?そんな大規模な計算をやった事が
無いので、使い物になるかどうかは分かりません。

Linux ならパッケージでインストールできるはず。
ウチの Debian には aptitude で入れた。

405:403
08/03/16 18:44:46
>>404さん
レスサンクスです。

LAPACKとATLASも使ってます!MKLもLAPACKとかLAPACK95を使います。素晴らしい
ライブラリだと思います。
漏れがやりたいのは、疎行列連立方程式なので、LAPACKとかATLASをベースにして
そのラッパーが欲しいという感じです。LAPACKがすでにBLAS/ATLASのラッパーなわけ
ですが。。。



406:デフォルトの名無しさん
08/03/16 19:57:43
>>405
一般論からすれば、反復法か直説法かの選択は行列の内容によるんでね?
たちの悪い行列でなければ、反復法の方が有利だと思うけど。
直説法なら確実に有限回で終了することが分かっているが、反復法は直交性が数値誤差で腐るから
数学的にはおかしいが、現実には有限回で終わらなかったりするし。

行列が、ほんとにスカスカの疎か、singularに近いか、固有値が縮退しまくっているかとか、
その辺は使用者しか分からんから、なんともいえないような。

中身の分からん奴に機械的に使わせるから安全第一で行きたいとか、運用面にも依存するし。


407:405
08/03/16 21:00:50
>>406さん
仰るとおりっす。
とりあえず、自分一人で使う(研究)ので、ブラックボックス的で安全なものでなくとも
高速で、導入やコーディングが楽なのが希望です。

行列の状態は悪いです。4x4のブロックに分かれてる感じで、離散化を細かくやると
主対角が卓越して、対角ブロックのみに不完全分解系の前処理掛けると、
それなりに収束しますが、係数行列のサイズが増大するというジレンマです。

疎行列性は、5万x5万で、非零要素が0.1%切ってるくらいです。

ご指摘のように、問題依存性が高いので、なかなかご意見いただくのは難しいかなとは
おもっております。

とりあえず、みなさん、10万x10万くらいの疎行列連立方程式(差分法や有限要素法
なら頻出だと思います)を解くときって、どんな言語で、どんな実装してるんですかね。。。
反復法ソルバもSaadのtemplateの擬似コードから自分で書いてるのか、とりあえず
いろいろソルバライブラリ試してるのか。。。たぶん、疎行列の格納形式から考える必要が
あると思うので、そのあたり、Fortran使いの皆さんがどうやってるのか知りたいです。

408:デフォルトの名無しさん
08/04/05 16:41:03
Steve Lionel (Intel) のコラムで、A=B+CとA(:)=B(:)+C(:)での後者の問題点について
触れられていた。最近のインテルコンパイラは少し賢くなって、この程度の単純な場合なら
後者で無駄なテンポラリへのコピーをしないようになったようだ。

とはいえ、まだ問題ありと。
URLリンク(softwareblogs.intel.com)


409:デフォルトの名無しさん
08/05/17 02:00:17
EXCEL VBAである計算をしてたのですが、時間がかかって仕方がないので
PCにFORTRANをインストールしてfortranでプログラミングやろうかと
思っています。学生時代にFORTRAN 77を使った経験がある程度。
たしかMS FORTRAN ぱわーすてーしょんつうのも使ったことがあります。

専門家の多そうなこのスレで恐縮なのですが、現行のwinXPが入ってるPCで
動かすとよさげなFORTRANコンパイラは何がいいでしょうか・・。
計算内容は簡単なモンテカルロ法です。



410:デフォルトの名無しさん
08/05/17 10:28:08
>>409
URLリンク(www.nminoru.jp)
見れ。無料でとりあえず試すならcygwin+g77 かminGW+g77でしょう。
コストパフォーマンスならインテルコンパイラか。

どっちにせよ今EXCEL VBAで組めているのなら、今からわざわざFortranなんぞやらずに、
コンパイラ買う金で速いCPU買ったほうがマシだと思うけどね。

411:デフォルトの名無しさん
08/05/17 22:05:46
>>どっちにせよ今EXCEL VBAで組めているのなら、今からわざわざFortranなんぞやらずに、
>>コンパイラ買う金で速いCPU買ったほうがマシだと思うけどね。

レスありがとうです。
VBAって異常に遅いなと思っていたのですが、CPU速くすれば
FORTRANに追いつける程度なのか・・・。
そこらへんがよくわかってないので。


412:デフォルトの名無しさん
08/05/17 22:13:50
VB2008Expressでも使えば?
VBAよりはだいぶ速いしタダだよ

413:デフォルトの名無しさん
08/05/17 22:41:52
どのくらいスピードを要するのか知らんがVBはインタープリタだろう?
SilverFrostのFTN95とかフリーコンパイラも転がっていることだし、
77でよければWatcomとか昔なつかしいのもあるし、g77のWin用もあるし、
Fortranで素直にやらせてやれw


414:デフォルトの名無しさん
08/05/19 22:54:50
モンテカルロ法とかだとCPU周波数にほぼ比例して
速くなると思っておいていいのですか・・・


415:デフォルトの名無しさん
08/05/19 23:35:44
>>411
その速いCPUで動かせばFortranはもっと速くwwww
マジレスするとパラメータサーベイとかなら今の4コアとか使えばかなり効率はあがる。
さすがにBASICがFORTRANを超えることは無理。
自分のプログラミングスキルと作るコードの複雑さから、コーディングやデバッグの
労力を見積もって自分で判断すべし。別にfortranとかVBAに限らんけどな。

VBAはクソ遅いと聞くが使ったことがないのでなんともだが、
Free BASIC VS intel Fortran ではFORTRANが速いといっても高々数倍程度~コードによってはBASICが勝っている。
URLリンク(shootout.alioth.debian.org)
さすがにIntel Fortranはgnu fortranやJava, Mono Ruby なんかには楽々勝利。

>>414
だいだいYES。と言いたいがモンテカルロ法だけでは「乱数を使った確率的解法」ぐらいしか
わからんからなんとも。ランダムウォークのシミュレーションなんかだとCPU周波数に
比例してくれるようなコーディングができる場合が多い。

416:デフォルトの名無しさん
08/05/22 09:28:10
質問です。
salfordのf77を使っているのですがgoto文のループ内で配列を毎回初期化してたら
ループが途中で終わってしまうのですがどうしたら良いでしょうか?
何でか分からないのですが、初期化しないと繰り返してくれます。あと、以下のプログラムの文
で初期化がi,j共に31の繰り返しだと少し長く繰り返します。
goto文の中にはガウスの消去法のサブルーチンがあります。

100 continue
do i=1,32
do j=1,32
kakunou(i,j)=0
enddo
enddo

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
中略(以下このkakunou(32,32)に計算値を代入してます)
   途中でガウスの消去法のサブルーチンを呼び出してます
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
goto 100

すいませんが、どなたか教えてください。

417:デフォルトの名無しさん
08/05/22 11:44:17
>>416
正直質問の意味がよく分からん。
コンパイラのバグでなければ、ありえない症状なので
ここに書いてない部分がおかしいとしか言いようが無い。

f77の範囲ならg77とか他のコンパイラもあるのでそれで試してみるとか、
salfordのf95で試してみるとかして見るのも一つの案。


418:初心者
08/05/23 15:40:54
失礼します.
Compaq Visual fortran 6.1を使用しているものですが,
練習で以下のプログラムを書いたのですが,cpmpileを押し,
「.F」に変換しても「1errors」が出てしまいます.
なぜ出るのか教えていただけないでしょうか?
初歩中の初歩で申し訳ないです.

INTEGER WIDTH,HEIGHT,AREA
READ(5,*) WIDTH,HEIGHT
AREA=WIDTH*HEIGHT
WRITE(6,*) WIDTH,HEIGHT,AREA
STOP
END


419:デフォルトの名無しさん
08/05/23 23:58:39
>>418
エラーでないぞw

エラーメッセージをコピーしてみせてくれ。

420:初心者
08/05/26 12:58:26
デフォルトの名無しさん
早速の返信ありがとうございます.
エラーは以下のように出ます

--------------------Configuration: Text1 - Win32 Debug--------------------
Compiling Fortran...
C:\Documents and Settings\Admin\デスクトップ\Text1.F
f90: Severe: Invalid argument
... file is 'C:\Documents and Settings\Admin\デスクトップ\Text1.F'
Error executing df.exe.

Text1.obj - 1 error(s), 0 warning(s)


自分も以前OSが2000を使用していたときは何のエラーも出なかったのですが,
XPに変えてからエラーが出るようになったように感じます.

お手数をかけて申し訳ないです.
よろしくお願いします.

421:デフォルトの名無しさん
08/05/26 17:55:54
そりゃおめぇ,”デスクトップ”で実行しようたって無理な話よ
マイドキュメントに移動させな

422:デフォルトの名無しさん
08/05/26 23:07:33
>>421
お前ひどい奴だなwww

>>420
最初ッからそう言ってくれれば、すぐに答えられる。
それはCVF時代のFAQで、日本語のパスやファイル名が入るとコンパイラが対応していない
のでエラーを吐く。2バイト文字を使わないディレクトリでやればおk。



423:初心者
08/05/27 13:41:47
デフォルトの名無しさん
解決しました!!!
簡単な質問に親切に答えていただいてありがとうございました!!!

424:初心者
08/05/30 15:38:10
重ね重ね質問すみません.

fortranをまわした結果をexcelかテキストファイルに出力したいのですが,
どのようなコマンドを打てばよいのでしょうか?
また,長い結果(10万桁以上)をファイルに出力したいのですが,
御教授お願いします.

425:デフォルトの名無しさん
08/05/30 16:32:44
本人はできるだけ鼻につかない文章で丁寧に質問してるつもりなんだろうな。

426:デフォルトの名無しさん
08/05/30 17:59:33
>>424
それ、先生に聞いた方がいいよ。お金払ってるんでしょ。

427:デフォルトの名無しさん
08/05/30 19:26:16
program main
integer :: i = 1

open(unit=10,file='hoge.txt',status='unknown')

do
write(10,'(i4)') i
i = i + 1
end do

close(10)

end program main


「ご教示」を「ご教授」って書いちゃう男の人って。。。

428:デフォルトの名無しさん
08/05/31 00:19:23
>>427
hogeはUNIX系の連中の使う言葉だ。
メインフレームの誇りを持つFortrannerは使っちゃいかんw



429:デフォルトの名無しさん
08/05/31 11:14:03
foo bar baz は?

430:デフォルトの名無しさん
08/05/31 16:02:34
鋼鉄の撃墜王

431:デフォルトの名無しさん
08/06/01 18:28:25
>>415
これみるとIntel C/C++使ったほうがいいみたいだな

432:デフォルトの名無しさん
08/06/01 19:41:18
>>431
単にFortranの書き方知らないだけだべ。


433:デフォルトの名無しさん
08/06/01 19:44:49
つまりFortranを知ってる人が少ないと。
技術者を集めにくいと。

434:デフォルトの名無しさん
08/06/04 01:08:45
>>431
INTEL Fortran と C++ はバックエンド部は共通だろうから、そもそもそれほど大きな違いが
出るはずが無い。


435:デフォルトの名無しさん
08/06/07 20:13:52
慶大の生協運営の書店に
FORTRAN入門(FORTRAN77入門)が普通において有って驚いた

436:デフォルトの名無しさん
08/06/07 20:25:26
>>435
浦昭二君、名誉教授だから当然でしょ

437:デフォルトの名無しさん
08/06/07 20:33:09
もうf77は教えないほうがいいだろ。常識的に考えて。

438:デフォルトの名無しさん
08/06/07 20:50:45
>>437
講義の教科書ではなくて、研究室用だと思うよ。
研究室にはf77の遺産があるから、参考図書として必須。

439:デフォルトの名無しさん
08/06/07 23:48:11
>>435
大学の生協なら売ってるのが普通だと思ってた。
俺は慶応じゃないけどね

440:デフォルトの名無しさん
08/06/08 00:29:15
阪大にも置いてあるよ。
どこでも置いてあると思う。

441:デフォルトの名無しさん
08/06/08 00:51:54
浦昭二のFortran66の方はさすがに絶版になってしまったな。



442:デフォルトの名無しさん
08/06/08 01:30:36
>>441
遺産プログラムがFortran66(ブロックIFなし)で書かれていて驚愕した orz

443:デフォルトの名無しさん
08/06/08 02:26:31
>>442
俺のもらった遺産プログラムは、拡張DO LOOPを使っていたせいでコンパイラを通らず
すごく困った。

拡張DO LOOPとは、DO LOOP の中からGOTOで飛び出して、なんかやった後DO LOOPの
中に帰ると、またさっきのLOOPの続きが出来るというもので、当時の俺の想定外の悶絶機能で
何がおきているのか全く理解できなかったw

FORTRAN77で廃止になったはずなんだが、たいがいのコンパイラは密かに対応していた。
まぁ、怖いので書き直したがw

そういう事もあるのでFORTRAN66の教科書も無くしてはいけないと思うですよ。

444:デフォルトの名無しさん
08/06/08 11:39:03
そうか、塾生は君付けなんだなw

445:デフォルトの名無しさん
08/06/18 02:23:23
今、本屋で買える範囲で、おすすめのFortranの教科書は何ですか?

絶版は困ります。アマゾンの古本で買えるならいいですが。


446:デフォルトの名無しさん
08/06/18 04:13:42
Michael Metcalf, John Ker Reid, "Fortran 90/95 Explained"

447:デフォルトの名無しさん
08/06/18 10:04:59
>>445
Fortranを勉強する目的などを明確にせよ。
 規格:わからない、f77、f90以上
 目的:講義対応、研究室対応、趣味、業務対応

以下はとりあえずの推薦
規格わからない 講義対応
 Fortran 90プログラミング 冨田博之
 URLリンク(www.amazon.co.jp)

f77規格 講義対応
 FORTRAN77入門 浦昭二
 URLリンク(www.amazon.co.jp)

f90規格 研究室対応
 数値計算のためのFortran90/95プログラミング入門 牛島省
 URLリンク(www.amazon.co.jp)

448:デフォルトの名無しさん
08/06/18 10:10:18
テンプレに追加きぼん

449:デフォルトの名無しさん
08/06/19 00:50:25
>>446-447
さんくす


450:デフォルトの名無しさん
08/06/29 02:12:38
>>434
バックエンド共通ってだけで速度が同じになるなんてありえない。
字句解析や最適化は言語仕様とコンパイラ実装に強く依存する。

Fortranのシンプルさはその点強みだったけど、
最近のFortranはその他言語にどんどん近づいているからねえ。

451:デフォルトの名無しさん
08/06/30 03:11:59
>>450
>>415のベンチマークの話だから。

452:デフォルトの名無しさん
08/07/03 00:26:47
>>450
ベンチマークサイトのような、汎用アルゴリズムならfortranは速くなくて不思議は無いですよ。
C/C++とfortranのユーザー数考えたら、intelだってどちらにリソース割くかは自明でしょう。
ナンバークランチング用途ならfortranは多分まだ速いと思いますけど。


453:デフォルトの名無しさん
08/09/06 00:53:21
Intel Fortran の次期バージョンベータテストが始まっている。
V.11が来年一月までの期限付きだが、無条件に配布されている。
Windows版はVisualStudio(Fortran 専用)つきで。

気になる人はチェキラ!w


454:デフォルトの名無しさん
08/09/21 14:52:15
もともとIntel FortranとC++は非商用目的なら無料で使えるんじゃない?

455:デフォルトの名無しさん
08/09/21 23:57:43
>>454
無期限はLinuxだけじゃないか?


456:デフォルトの名無しさん
08/09/22 15:10:37
Linux版だけだな
Linux版ならIntel FortranとIntel C++が無期限で無償で使える

457:デフォルトの名無しさん
08/09/22 15:12:37
非商用目的限定の話だけどね

458:デフォルトの名無しさん
08/10/07 00:50:36
1秒間プロセスを寝かせるのはsleepという関数があるけど,
10msとか100msとか,ミリセカンドオーダーで寝かせるようにするには
どうすればいいですか?
Intelコンパイラを使っているので,Intelコンパイラ依存の関数でも
いいです.
今は,無駄な計算ループを作って待たせているのですが,
それだとCPU負荷になるので,できればCPU負荷にならないで
10msとか100msとか待たせられると嬉しいです.

459:デフォルトの名無しさん
08/10/07 01:03:04
>>458
Windowsなら、USE IFWIN して Win32 の API の Sleep 関数でやれた気がする。
Linux は知らないが、同じようにやれると思う。


460:デフォルトの名無しさん
08/10/07 01:30:30
nanosleep(2)

461:デフォルトの名無しさん
08/10/07 03:06:27
>>458
ifort依存ならWin/Linux共に SLEEPQQ で
USE IFPORT
CALL SLEEPQQ(3000)
とミリ秒で指定できる。

但しあくまでも指定できるだけであって実際の休止時間をミリ秒単位の精度で
制御できるかどうかは別だが。

462:458
08/10/07 10:32:59
>>459-461
皆さん,ありがとうございます.
461さんのやり方でできました.
それほど正確性を求めていないので,このやり方で十分です.
ありがとうございました.

463:デフォルトの名無しさん
08/10/24 15:08:54
おまいら、CUDAでFORTRANがサポされたらどうする?逝く?

464:デフォルトの名無しさん
08/10/24 17:01:26
キュダってなに?

465:デフォルトの名無しさん
08/10/24 20:17:32
>>464
GPGPUの開発環境 >CUDA
GPUを計算に転用して10倍以上の高速化を実現するらす
URLリンク(journal.mycom.co.jp)

466:デフォルトの名無しさん
08/10/25 10:45:52
倍精度に対応したのか

467:デフォルトの名無しさん
08/11/11 02:36:04
CUDAよりインテルのLarrabeeが来そうだな。
ベクトル長を長くする方向だから80年代のプログラミングモデルが復活するし、
Intelのコンパイラは必ずサポートするだろうし。



468:467
08/11/11 14:06:01
ルンゲ・クッタ・ギル法を用いて連立の方程式を解きたいのですが,
時間刻みを小さくしても発散してしまうのですが,何かサブルーチン内に欠陥があるのでしょうか?
QA0=QA
CKA0=H*FNCT1(X0,YA0,YB0,W0,W1,A,A0,A1,B,B1,H0,L,PI)
RA1=(CKA0-2.0*QA0)/2.0
YA1=YA0+RA1
QA1=QA0+RA1*3.0-CKA0/2.0
XX=X0+H/2.0
CKA1=H*FNCT1(XX,YA1,YB1,W0,W1,A,A0,A1,B,B1,H0,L,PI)
RA2=(1.0-1.0/sqrt(2.0))*(CKA1-QA1)
YA2=YA1+RA2
QA2=QA1+RA2*3.0-(1.0-1.0/sqrt(2.0))*CKA1
CKA2=H*FNCT1(XX,YA2,YB2,W0,W1,A,A0,A1,B,B1,H0,L,PI)
RA3=(1.0+1.0/sqrt(2.0))*(CKA2-QA2)
YA3=YA2+RA3
QA3=QA2+3.0*RA3-(1.0+1.0/sqrt(2.0))*CKA2
XX=X0+H
CKA3=H*FNCT1(XX,YA3,YB3,W0,W1,A,A0,A1,B,B1,H0,L,PI)
RA4=(CKA3-2.0*QA3)/6.0
YA=YA3+RA4
X=X0+H
QA=QA3+3.0*RA4-CKA3/2.0
return
end
function FNCT1(X0,YA0,YB0,W0,W1,A,A0,A1,B,B1,H0,L,PI)
FNCT1=-2.0*W1*H0*YA0-(W1**2.0+(W0**2.0)*(A/A0+(B**2.0)/(2.0*L*A0)-(L*A1*B)/(2.0*A0)))*YB0+((W0**2.0)*(3.0*L*A1)*(YB0**2.0))/(PI*A0)
* -((W0**2.0)*(PI**2.0)*(YB0**3.0))/(4.0*L*A0)+(W0**2.0)*((-2.0*B1)/(PI*(W0**2.0))+(4.0*(L**2.0)*A1*A)/((PI**3.0)*A0)+(2.0*L*A1*(A**2.0))/((PI**3.0)*A0)
* -(2.0*(L**3.0)*(A1**2.0)*B)/((PI**3.0)*A0))
return
end
長々と申し訳ないです.お願いします

469:デフォルトの名無しさん
08/11/12 00:29:13
>>468
長すぎて考える気にならん。
関数のパラメータも多すぎて、条件も分からん。

ある特定のパラメータで発散するのか?ルンゲ喰ったギル法だけで異常が出るのか?
どういう状況なのかも分からん。

答えようも考えようも無い。
もう少し親切心を持って聞けw


470:468
08/11/12 03:21:51
>>469さん

すみません.どう書いたらよく伝わるのか分からず,書いてしまいました.
反省しております.

方程式は,T"(t)+T'(t)+ωT(t)+B1(t)T(t)+B2(t)T^2(t)+B3(t)T^3(t)=B4(t)
のような方程式で,
B1~B4の中にも変数が存在してtが変化した際には変数も変化させたいのです.

パラメータを変えた際には異常が現れなかったりします.

わかりにくくて申し訳ありません.よろしくお願いします

471:デフォルトの名無しさん
08/11/12 15:42:56
ブックオフで培風館のFORTRAN77入門が100円だった
さすがブックオフ本の価値が分かってない

472:デフォルトの名無しさん
08/11/13 00:52:36
>>471
古本屋での相場は美本で350円くらいだったと思う。
漏れは66版を150円で買ったような気がするw

>>470
>T"(t)+T'(t)+ωT(t)+B1(t)T(t)+B2(t)T^2(t)+B3(t)T^3(t)=B4(t)
よく分からんが、第三項はω^2じゃ無いか?
それでBx(t)が微小量だとすれば、なんとなく意図が分からなくも無い。

減衰振動の単振り子に非線形項と強制振動項が加わったものなるので、
なんとなく動きのイメージがつかめるのでは。
パラメータによっては、当然発散も大いにありうるだろう。

そもそも正しく計算できているのか自信が無いのなら、Bx(t)を全部0に置けば、
へたれて行く減衰振動になるので、そういう解析解のあるところからチェックしてゆけば
自分のプログラムの挙動に自信がもてるのでは?

詳しく知りたければランダウ=リフシッツの力学の非線形振動における共鳴の節を読めwwwww


473:デフォルトの名無しさん
08/11/13 01:00:09
>>471
教科書で使ってたりするから、古本の流通量は結構多い気がする。

474:デフォルトの名無しさん
08/11/13 02:46:31
カバーの焼けはあるけどおそらく新品
改訂版じゃなくて初版の方だったので返品在庫の放出かしら

配列のとこやってるけど、配列への入力とかあってすごいね
宣言なしで唐突に出てくるループカウンタにもびっくりするが

475:デフォルトの名無しさん
08/11/13 10:19:44
>>474
えぇ~?
暗黙に型宣言されてるぜ!

最近のスクリプト言語で、これに近い形に先祖がえりしているのがワロス


476:デフォルトの名無しさん
08/11/13 14:07:56
implicit none しても結局は暗黙のやつに則ることは多いよね。
character,logicalは無いので c と l で始めるようにしたり。
暗黙の型宣言はあれはあれで良いものだ。

477:デフォルトの名無しさん
08/11/14 21:11:06
いや、Cが複素数でZが倍精度複素数だろ

478:デフォルトの名無しさん
08/11/15 00:55:13
>>476
lは1と見間違いやすいからあまり使わないが、貴重な整数型なのでもったいない。

479:デフォルトの名無しさん
08/11/15 05:22:43
>>478
Lは大文字で使う

480:デフォルトの名無しさん
08/11/16 00:36:10
>>479
ボーランド記法?
昔PASCALに散々いじめられたから嫌w

481:デフォルトの名無しさん
08/11/16 12:49:36
>>477
c を複素数に振るときには character 型は s で始めるようにしてるな。
>>478
l は先頭でだけ使うようにしてる。 先頭が数字の変数ははじかれるから
混同しなくてすむ。

482:デフォルトの名無しさん
08/11/26 01:24:43
東京で先週開かれたISOのFortran部会でCoArrayFortranに関する扱いで
何か進展はあったのでしょうか?

つまりCAFを排除できたのでしょうか?

483:デフォルトの名無しさん
08/11/29 16:57:56
>>482
東京会議の結論がうpされたようだ。
URLリンク(www.nag.co.uk)




484:デフォルトの名無しさん
08/12/06 18:55:27
The shapes of the array expressions do not conform.
って出てくるのですが、どういうことですか?

485:デフォルトの名無しさん
08/12/11 16:23:19
配列間違ってないか?

486:デフォルトの名無しさん
08/12/13 02:11:30
C Pad for Salford FTN77
でCPU TIME を出力できるようにする方法はありますか?

487:デフォルトの名無しさん
08/12/13 18:02:53
>>486
HIGH_RES_CLOCK@

使い方は Library Reference に載ってる。

488:デフォルトの名無しさん
08/12/23 09:11:38
>>487
亀ですが
ありがとうございます。
出来ました!

489:デフォルトの名無しさん
09/01/24 19:01:34
関連スレが新しくなりました。

くだすれFORTRAN(超初心者用)その4
スレリンク(tech板)l50


490:デフォルトの名無しさん
09/02/12 00:23:26
うちの研究室の人たちがFortranでプログラミングしているけれど
お前らgoto使いすぎ・・・
というか自分の提出したプログラムがgoto文に書き換えられている・・・

subroutine、functionを使いすぎるのはスパコン計算に向かないと言っていたけれど
勉強してきた構造化プログラミングの手法自体がfortran向きでないということなの?

491:デフォルトの名無しさん
09/02/12 02:32:22
>>490
インラインされるようにしろw

コンパイラが安心してグローバル最適化できるように、付加的な情報を与えてやれ。
グローバルな構造が人間が見て分かりやすいならコンパイラも見て分かりやすい。

INTENT指定はつける。
FUNCTIONは、PURE (可能ならELEMENTAL)にする
とかすればDO..LOOP内で関数呼び出しとかしても並列化やベクトル化してくれるはず。
コンパイラによるが。

実際にベンチマークを取って、自分が勝利すれば、後は文句いわれないべw


492:デフォルトの名無しさん
09/02/12 12:52:18
>>491
intent属性つけると微妙に速くなるよね。
特にloop内で頻繁に呼ばれるやつだと全体で5から20%くらい違ってくる。
最近のコンパイラはF77で書いててもintentをわかってくれるから楽だ。

で・・・・pure,elementalの事はよくわからないので詳しく!

493:デフォルトの名無しさん
09/02/13 00:04:13
>>492
PUREもELEMENTALもFortran95で導入されたキーワードで、関数やサブルーチンの
副プログラムの性質をコンパイラに教える修飾語。

PURE FUNCTION unko(x) などのように宣言の頭につけて使う。

PUREというのは、大雑把には副作用がないこと。それゆえ、並列に動作させても
値が変わらないので、コンパイラは並列化など最適化をやれる。
(PUREを満たさねばならない条件はいくつかあるので、kwskはマニュアル見てくれ)

ELEMENTALはPUREの中でさらにいい性質を持ったもの。
本来は1変数で定義してあっても、配列を引数にとって、配列を返すように使ってもいいもの。

たとえば、
REAL :: a(10), b(10)
b = SIN(a)
こういう使い方が組み込み関数では出来るわけだが、自作の関数でもこうやって使っても
いい場合にELEMENTAL (要素毎の意味) をつける。 

これもコンパイラが利口なら、最適化をかけてくれるはず。

普通、DO..LOOP内に関数やサブルーチンの呼び出しがあると、呼び出し先で何が
あるかわからないので、最適化が抑止されるが、PUREやELEMENTALがあれば、
安心してコンパイラが最適化できる。(原理的にはw)



494:デフォルトの名無しさん
09/02/13 08:29:24
>>493
ありがとう。pure 属性は使い易そうだ。

495:494
09/02/13 11:01:13
loop内で頻繁に呼ばれる4個つくらいの function や subroutine に pure 属性つけただけで
並列(OpenMP)の時にちょびっと速くなった。わーい。
もともとdo-loopで一つずつ処理しているので elemental を使える状況は少ないけど、
もう少し理解してから使ってみよう。
inlineを少し深くするようになったからかコンパイル時間がすこし長くなったけどまあ気にしない。

496:デフォルトの名無しさん
09/02/17 22:12:50
>>491
なるほど、ためになったわ。サンキュー。PUREを付けるだけで簡単に速くなったわ。

担当のは基本的に古い人間だから、あまりコンパイラ任せにするなとか言うんよな…。
Fortran90っぽい77形式の文も、「完成した後で直します」とか言ってそのままだったり。
implicit realもcommon文もどうにかしたいけれど、きっと文句言うんだろうな。

497:デフォルトの名無しさん
09/02/18 02:22:54
>>496
PURE 属性はもともと HPF で導入されたものなので、それなりのメーカならコンパイラ
にも最適化のノウハウの蓄積があるはず?
ELEMENTAL も一変数用にサブルーチン書いて、配列を渡せばいいので、DO..LOOPを
あからさまに書かずにすむ。時々ソースがすごくすっきりして楽になることがある。

でも、ついでだから古い人間を擁護してみるかw

FORTRAN77 にも、むきだしの良さがあるw
Fortran90 以降だとソース上は簡潔になっても、影で動的にテンポラリ配列とか取るので
気持ち悪いところもある。長時間並んだJOB がStackOverflow とかで止まっていたり
すると殺してやりたくなる。古い時代の人はその辺が嫌なのかもしれないw

COMMON もグローバル変数だと思うとむかつくだろうが、 自分でガベージコレクション
しながら、変数領域を自由自在に再利用して操っていると思うと、結構気持ち良い。
メモリーが貴重だった時代には、利用価値が高かった。

IMPLICIT に関していえば IMPLICIT NONE をつけた上で、頭文字を守ればいい。
C と違ってローカルスコープの捨て変数が使えないから、頭文字を守らないと
いちいち宣言部に戻って型を確かめないといけないのでめんどい。
Fortran では数値の精度が致命的に重要で、倍精度計算中に1個単精度が混じるだけでも
すべての結果が単精度のゴミになるのだから、数値精度に無頓着の他のおしゃれ言語の
連中の言説を信じると痛い目に会わされるw



498:デフォルトの名無しさん
09/02/18 13:19:26
pure属性付けたサブルーチン内で
pure属性付けた他のサブルーチン呼ぶ時には
interfaceで引数部分の性質を教えて置かないといけないんだね。
f77書式で書いてるのに interface intent が
現れるのでムズムズするけどムズムズするだけなのでそのまま。

499:デフォルトの名無しさん
09/02/26 16:08:37
OpenMPを試してみてるんだけど、いまいちうまくいかないんだが・・・
ifort -QParallel でコンパイル+実行するとうまくいくんだけど、
同じソースをifort -Qopenmp でコンパイル+実行すると
Program Exception - stack overflow
っていうエラーが出る
ソース中にOpenMP構文は use omp_lib だけ
これってどうしたらいいのかな?

500:499
09/02/26 16:22:10
おk事故解決
-auto_scalar オプションでいけた

501:デフォルトの名無しさん
09/02/26 16:49:38
>>500
だたの
-auto

-static
でうまく行くこともあるよ。あとは実行時の環境変数の
setenv KMP_STACKSIZE 16M
とかデフォより大きめに取ると幸せなことが多い気がする。

502:デフォルトの名無しさん
09/02/26 16:50:50
>>500
ていうか、
-auto_scalar
ってデフォルトになってない?

503:デフォルトの名無しさん
09/02/26 17:23:54
-openmpだとデフォで動的(-auto)になるんだっけか
>>499は単にスタック不足なだけでは?

ところで、KMP_STACKSIZEってunlimitedに設定できないの?

504:デフォルトの名無しさん
09/02/26 17:58:56
動的っていってもヒープとスタックがあるよね。
Fotranの場合ってどういう風に割り当てられるんだろう・・・そういやあまり意識したことなかった。

505:デフォルトの名無しさん
09/02/27 02:43:33
>>504
元々はAUTOMATIC変数の類はスタックに、ALLOCATE命令のときはヒープだった気がする。

ただ歴史的経緯のせいでサブルーチン側で巨大な配列をとっているプログラムが多くて
それがSTACKOVERFLOWを引き起こすから、IntelFortranなんかはデフォールトでは
スカラー変数はスタックで、配列の類はヒープで確保するようになった気がする。

インテルの掲示板に、デフォールト・オプション切り替えの話が出ていた旗もするのだが
昔のことなので記憶がはっきりしない。

OpenMPを指定すると、オプションが切り替わってしまう話はこのスレに出ている。
URLリンク(software.intel.com)


FortranはFORTRAN66時代がSTATICに変数をとっていた関係で、
FORTRAN77で規格の上ではサブルーチン類の変数はAUTOMATICでありうるように
なったにもかかわらず、互換性の観点からデフォールトでSTATICに変数を
とっていることが多くて、それはFortran90でもしばらく続いていたという歴史的経緯がある。


506:デフォルトの名無しさん
09/02/27 11:54:19
>>505
そのスレの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(つまりローカルスカラ変数だけじゃなく、ローカル配列変数も含む)の間違いじゃないかな?


勘違いしてたらすいません

507:デフォルトの名無しさん
09/02/27 13:12:01
>>506
そうなんじゃないかな?
配列までスタックにとるからoverflowしていると考えるとつじつまが合う?


508:506
09/02/27 13:52:41
>>507
そうだよね。SteveさんIntelのスタッフなんだし書き間違わないでくれよぉ・・・

OpenMPの場合にデフォルトで全てのローカル変数(スカラも配列も)がスタックになるのは
スレッドセーフのためってあるけど、逆に言えばそれらをstaticに扱ったらスレッドセーフに
ならないってことだよね。それってやっちゃまずいことなんだろうか?

OpenMPまともに使った経験がないもんで・・・識者の方コメントおながいします

509:デフォルトの名無しさん
09/02/27 14:48:49
-openmp
つけてコンパイルすると、仮にautomaticは嫌いだっと
-noauto
つけても消されるはず。なのでopenMPを読んだ状態だと
有無をいわさずにぜんぶautomaticになる・・・と理解しているけど。
shared属性をつけてかつcommonブロックに貼り付けるとかして
やや無理なことをしないとstatic領域には配置されないと思ふ。
-staticはその名のイメージとは違って共有ライブラリを使わない
(というか実行ファイルに埋め込んじゃう)オプションだし。

spec.orgにあるOMP2001の情報のところに試した人たちが
実際に使ったオプションが載ってるので、自分のところのシステムに
近い(or 同じ)マシンがあったらそれと同じモノをだいたい使っているけど、
まあ大間違いではないと思う。お薦めできるのかは分らないけど・・・。

510:デフォルトの名無しさん
09/02/27 15:30:30
え、OpenMPだとサブルーチン内ではstatic配置ってできないわけ?
数値計算では馬鹿でかい配列は可能な限りstaticにするのが基本じゃない?
サブルーチン渡る度に配列をコピーとかやってられんでしょ?

その代わりメモリのアロケーションはコーディングする側がきちんと考えてあげないといけないけど。
この辺がリソースをある意味富豪的に使うことが前提とされるJavaやC#などのオブジェクト系言語との違いだね。

511:デフォルトの名無しさん
09/02/27 16:56:15
510はちょっと尋ね方が変だな。
副プログラムが並列のloop内にあるのか、
副プログラム内で並列のloopがあるのかで答は変わる。

512:510
09/02/27 19:38:52
的外れな質問してたのかな、ごめん・・・。
>>511の両方のケースとも知りたいので、よかったら教えてほしい。
流体とかの数値計算では行列の反復法とかはサブルーチン内でやるけど、
そういうケースでメモリのアロケーションはどうすべきなのか、という視点で興味があります。

513:デフォルトの名無しさん
09/02/28 00:58:18
>>512
引数に載ってれば、Fortranは参照呼出しなんだから配列のコピーが生じるはずもない。
CやPASCALとは違う。(まぁ最近はVALUE属性も出来るようになったが)

ここでは副プログラム内で新たに割り付けられる配列の話だろう。
それが動的に取られるとして、スタックに取られるか、ヒープに取られるかの違い。



514:510
09/02/28 01:28:49
>>513
>副プログラム内で新たに割り付けられる配列
あ、そういう話か・・・ありがとう。

自分は一時作業用の配列も全部メイン側で用意してやって引数渡ししてるんだけど、
そういうのはサブルーチン内でスタックやヒープで取ってやる方がいいのかな?
皆さんどうしてますか?

515:デフォルトの名無しさん
09/03/03 06:16:03
allocatableを副プログラム内で作ってそれ(先頭アドレスやらサイズその他)を
メイン階層や他の副プログラムに行き渡らせるのが割りと
面倒臭いのでメイン階層でやってる。
メイン階層が長くなるのは正直あまり好みではない、けど
まあ好みの問題なだけなので気にしないようにしている。

allocatable使うと場合によってはプログラム内で明示するサイズより大きいメモリを扱えたり
(コンパイラはハンドルできるメモリサイズ < OSがハンドル出来るメモリサイズ、なので)、
格子数(データ数)の違う処理を同じ実行イメージで出来る(コンパイルしなおさなくて良い)のが
いいけど、最近ではサイズをプログラム内で固定変数で明示していちいちコンパイルしている。
その方がミスは少ない気がする。気のせいかもしれないけど。

516:デフォルトの名無しさん
09/03/03 12:11:34
何がスタックやヒープに割り当てられるのか分からんかったのでググった。
ブログだけどw

URLリンク(monologuemidnight.blogspot.com)

module中の大域的な変数、save属性付きの変数→.bss
allocatable属性な配列→ヒープ
普通にサイズが宣言されている自動配列→スタック
手続き中の変数(mainでも同様)→スタック

ってことらしいが…。
この辺は規格ではないっぽいので、コンパイラの仕様をちゃんと確認したほうがいいな。

517:デフォルトの名無しさん
09/03/11 18:46:48
ifortで複数の数字を出力すると勝手に改行されるんだけど、改行を抑制するオプションってある?
gforntranでは改行されないんだけど。
real(8) a(5)
write(*,*) a(:)
とするとa(3)とa(4)の間で改行されちゃう。

518:デフォルトの名無しさん
09/03/12 04:57:59
>>517
気持ち悪いけど、下記のようにしてもだめかな?
クラシックな書き方だけど。

  write(*, '(100f10.5)') a(:)


519:デフォルトの名無しさん
09/03/12 09:37:42
>518
ありがとん。
write(*,'(100f)') a(:)
でいけた。

520:デフォルトの名無しさん
09/03/15 01:01:35
改行抑制なら、write文ならadvance='no'を付ければできるはず
出力するものが決まってるなら、改行してしまう書式の箇所に\(バックスラッシュ)を入れてもいい

521:デフォルトの名無しさん
09/03/15 11:34:42
>520
advanceはフォーマット文がいるから、結局519と同じでは?

522:デフォルトの名無しさん
09/03/17 03:12:33
>>521
'(100f)' なんて書くよりはスマートな気がするけど?
ま、どうでもいいことだな

523:デフォルトの名無しさん
09/03/18 04:24:12
do i = 1, 5
  write(*, '(f10.5,$)') a(i)
enddo
write(*,*) ''

はダメかな?
改行するなよ、の$は非標準だけどDEC以来ほぼ標準と思っていいのではないだろうか

524:デフォルトの名無しさん
09/03/18 21:51:40
ちょっとテストしてみた@Intel Fortran 10.1

integer::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

525:>>524の結果
09/03/18 21:52:34
print *,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(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 ---

526:デフォルトの名無しさん
09/03/18 22:07:03
ごめん。
print文か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

527:デフォルトの名無しさん
09/03/18 22:19:08
↑の結果

write(*,*) 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 ---


結論
①書式省略すると、適当な位置で改行してくれる(規格で決まってるんかな?)
②書式指定すると、書式の中身が終わる度に改行
③書式に\を付けると改行抑制
④書式にadvance='no'(デフォルトはyes)を付けるとwrite文が終了したときに行う改行を抑制(②との違いに注意)

って感じかな。
改行抑制の\と改行指定の/が混ざるとどんな出力になるんだろう。

528:デフォルトの名無しさん
09/03/18 22:20:24
ごめん、>>526
real(8)::f(3)
do i=1,3 ; f(i)=i ; enddo

は↓に修正。

real(8)::f(5)
do i=1,5 ; f(i)=i ; enddo

529:デフォルトの名無しさん
09/03/22 01:30:43
>①書式省略すると、適当な位置で改行してくれる(規格で決まってるんかな?)
コマンドプロンプトの右端で改行だと思う
違うかなー

530:デフォルトの名無しさん
09/03/22 10:23:20
>>529
他のコンパイラでは改行しないので、コンパイラのせいだと思います。
>>524-528
ありがとうございます。
参考になりました。
write(*,'(f\)') f
が良さそうですね。

531:デフォルトの名無しさん
09/03/23 15:14:13
>>529
Fortranに限らず、プロンプトのサイズは関係ないよ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch