くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0237デフォルトの名無しさん
2009/05/27(水) 01:10:53とりあえずINCLUDE使ってみます
0238デフォルトの名無しさん
2009/05/27(水) 01:11:05モジュールでもいいぞ
0239デフォルトの名無しさん
2009/05/27(水) 02:04:13奴はFORTRAN77と縛りを入れている。
0240デフォルトの名無しさん
2009/05/27(水) 13:47:45entry文を使えば、何とかならない?
0241デフォルトの名無しさん
2009/05/27(水) 14:16:150242236
2009/05/27(水) 23:27:51たしかにENTRY文という手もあったな。
COMMONが嫌で、グローバル変数を実現する代わりに使ったことがあったが、
やっぱ変数全部がグローバルになるせいでデバッグが面倒で
よほど特殊な場合意外はやめたほうが良いと思った。
0243デフォルトの名無しさん
2009/05/31(日) 15:35:51#FAQならすみませんが、ご容赦ください
IVF10.1(11でも)動作したソースを、Linux上のintelに持ち込んでコンパイルしました。
すると、以下のケースに分かれました。
1)あえてコード変換をせずにコンパイル
コンパイルOKも、当然、表示は滅茶苦茶(要するに2バイト系がだめ)
2)SJIS->UTF8にしてコンパイル
FORMAT文の箇所でエラー発生、これがどうしても直らない。
ちなみにエラーメッセージは以下の通りです
0244デフォルトの名無しさん
2009/05/31(日) 15:37:35*//' ... ログ出力ファイルを入れて')
--------^
test.for(14): error #5082: 構文エラー、END-OF-STATEMENT が見つかりました、 <FORMAT_ELEMENT> <FORMAT_INTEGER> < ) <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> ... の 1 つを指定してください。
*//' ... ログ出力ファイルを入れて')
----------------------------------------------------------------------------------------^
このソースは、
100 FORMAT(//' *** test を始めます。***',
* //' ... ログ出力ファイルを入れて')
です。
他にも日本語からの問題なのでしょうか、"認識できないトークンを'?'をスキップしました"というエラーもでます。
なおf77でも同様で、この場合には、
Error on line 14: unbalanced quotes; closing quote supplied
Error on line 14: unbalanced parentheses, statement skipped
となります。
お気づきの点があれば、すみませんが、ご指摘ください。
よろしくお願いいたします。
0245デフォルトの名無しさん
2009/05/31(日) 16:06:32a) kterm上でトライ
b) 使ってる全角文字の中に ' ) あたりの半角と同じ値が混じっている
くらいしか思いつかないや。
少なくともf77のケースでのエラーはb の事を言ってるみたいだけど。
英数字以外は使わないのが一番だけどなあ〜。どうしても使いたかったら
character*2 zenkaku
read(*,*) zenkaku
write(*,*) ichar(zenkaku(1:1)),ichar(zenaku(2:2))
で全角一文字の対応する半角2文字のアスキーコード数がわかるので、強引に出来そうな気もするけどな。
winだと実際上の3行の部分は動くとおもうけど、linuxだとよくわからんね。
linux + fortran+ 2バイト全角文字 の話題はあまりお話を聞かないからうまく行ったらここにも報告してよ。
0246デフォルトの名無しさん
2009/05/31(日) 17:12:19a)kterm
Ubuntu9.04にてktermを入れて、確認。
・UTF8はコンパイル時、文字化け?でダメ
・同じくSJISもだめ
・eucではifortでのコンパイルメッセージの出力が化けている(どれでも同じ??)状況でしたが、実行時は日本語出力OK
でした。
となるとintelFortranのインストールもkterm上から行う方がよかったのか?
まだすべての確認はできていませんが、うまくいきそうという報告まで。b)も後日、試してみますので結果を報告致します。
0247デフォルトの名無しさん
2009/05/31(日) 17:36:04うまく表示できているのは、kterm上で、の場合。通常のconsoleでは(当然っちゃぁ当然ですが)化け化けです。
0248デフォルトの名無しさん
2009/06/01(月) 08:32:25245のbのやつは、対で使われることが多い文字
(ichar()関数の返す値が
' が39、Hexでは27
" が41、Hexでは29
) が93、Hexでは5D
] は34(これはFortranではあまり意味がないか・・)
のようなやつ)が全角に混じってるとダメそうな気がする、という程度の意味で書いてみた。
でも、win版やktermインストだと大丈夫なんだよね。
246さんの意見のとおり、インストール時の設定その他に依存する部分が大きそうな気もするな。
0249デフォルトの名無しさん
2009/06/01(月) 18:51:56まだf77は試してませんが、どうやら文字コードは確かに影響してるっぽい。
問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。
このため、見かけ上、1行内では2バイト換算で70文字程度にしていたものがオバフロしていた模様。
よってifortでは、-FI -132という固定ながら132文字にしたら通りました。
いったい何をしていたんだ…わしorz
ちなみにIVFでUTF8形式でソース保存して、それをWin上でコンパイルしたら妙なゴミが出てました。
結構コード問題は奥が深そうです。
0250デフォルトの名無しさん
2009/06/01(月) 23:28:41知ってる人のような気がする......
tt
0251デフォルトの名無しさん
2009/06/02(火) 01:58:37なか〜まw
そっか、UTFだとエディタの見かけより実際のはるかに長いんだね。試しに
vi でてきとうにUTF使ったファイル開いたら、たしかに row 数が多い。
気を付けよう。
0252デフォルトの名無しさん
2009/06/02(火) 10:58:03確認してないw
0253デフォルトの名無しさん
2009/06/04(木) 23:06:43FORTRAN I/O ERROR 913: OUT OF FREE SPACE
って出てきて途中で計算が止まったっぽいです。
なにやらメモリー不足とのことですが、どう解決すればいいのでしょうか?
0254デフォルトの名無しさん
2009/06/04(木) 23:47:02ハードディスクを増設しろ!
0255デフォルトの名無しさん
2009/06/05(金) 00:14:43I/O エラーだから、メモリーではなくディスクが足りないんだろう。
/tmp とかのスクラッチ領域がパンパンになっている可能性もあるが。
0256デフォルトの名無しさん
2009/06/05(金) 01:44:170257デフォルトの名無しさん
2009/06/05(金) 18:31:50http://www.uic.edu/depts/accc/software/compilers/forterr.html
913 OUT OF FREE SPACE
Library cannot allocate an I/O block (from an OPEN statement), parse array (for formats
assembled at run-time), file name string (from OPEN), characters from list-directed read,
ISAM key descriptor, shared COMMON descriptor, variable-format descriptor, or file buffer.
The program may be trying to overwrite a shared memory segment defined by another process.
Allocate more free space in the heap area (see the beginning of this chapter); open fewer
files; use FORMAT statements in place of assembling formats at run time in character arrays;
read fewer characters; user fewer ISAM keys; use fewer shared COMMON areas; use fewer
variable-format expressions; or reduce the maximum size of file records.
0258デフォルトの名無しさん
2009/06/06(土) 03:03:470259デフォルトの名無しさん
2009/06/06(土) 20:04:27以下のプログラムをexitを使わないで同様の結果を得るには、
どうすればいいのでしょうか?
ご教授願います。fortran90を使っています。
program
real :: r,a
integer :: io !入力結果の状態を表す変数
!
print *, 'CTRl-D を入力すると終了'
!
do while ( .true. )
read(5,*,IOSTAT=io) r
if(io /= 0 )then
exit
endif
a = 4 *3.141592* r ** 2
print *, r, a
end do
!
end program
0260デフォルトの名無しさん
2009/06/06(土) 20:16:431.歴史と伝統のGOTO文で抜ける。
2.READ文で END=nnn で抜ける。
だが元のままEXITで抜けるのがもっとも行儀が良いとされる。
0262デフォルトの名無しさん
2009/06/08(月) 21:37:33>exitを使わないで書き上げろ
exitで抜けるのが一番良いのに、何でこう言ったんでしょ?
0263デフォルトの名無しさん
2009/06/08(月) 22:28:50READ文の指定子の使い方の勉強とかかな。
0264デフォルトの名無しさん
2009/06/09(火) 10:49:220265デフォルトの名無しさん
2009/06/09(火) 11:41:39大丈夫。ただし、初心者にありがちな「エスパーさん、○○作って!」はやめて。
知っている情報をそのまますべて載せるべし。
0266259
2009/06/09(火) 16:56:11どうやら、説明が足りなかったようで、すいません。
今日授業に出たところ、
program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
if (io==0) then
read (5,*,iostat=io) r
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end do
stop
end program
が、答えだそうです。
でもこれを実行すると、CTRL-Dで終了するとき、
前回の計算結果が表示されてしまいます。
またまたすいませんが、何を付け加えればいいのでしょうか?
0267デフォルトの名無しさん
2009/06/09(火) 17:09:31program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
if (io==0) then
read (5,*,iostat=io) r
if (io==0) then
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end if
end do
stop
end program
どう考えてもexitを使うほうが素直だ。
0268デフォルトの名無しさん
2009/06/09(火) 17:11:10program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
read (5,*,iostat=io) r
if (io==0) then
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end do
stop
end program
readをifの外側に出さないといかん。
0269デフォルトの名無しさん
2009/06/09(火) 17:20:580270デフォルトの名無しさん
2009/06/09(火) 20:24:170271デフォルトの名無しさん
2009/06/09(火) 20:31:01do while ( .true. )
は
do
だけでおk
まあ、
do while (io==0)
に直させるためにワザと do while にしたのかもしれないが
0272デフォルトの名無しさん
2009/06/09(火) 21:52:10if (io==0) then
たまにこういうセンスなさすぎなコード書く人いるよね
他人が書いたコードをメンテするはめになったときに、こういうの見ると何とも言えない溜息がでるわ・・・
たとえバグはないとしても
0273デフォルトの名無しさん
2009/06/09(火) 23:17:11まぁ待てw
Fortran で WHILE を使おうとするだけでも、きわめて開明的な人物ではないか!
0274デフォルトの名無しさん
2009/06/09(火) 23:27:58これはどこがセンスなさすぎなん?
0275デフォルトの名無しさん
2009/06/10(水) 03:23:560276デフォルトの名無しさん
2009/06/10(水) 11:45:30ループの脱出(継続)分岐条件である io==0 が
WHILE と IF の二箇所で判断されていることを言ってるんだろ。
>>272の態度はむかつかせるだけから、くだすれ的には反省すべき。
0277デフォルトの名無しさん
2009/06/10(水) 15:02:05do while (io .EQ. 0)
みたいなのは意図的に書くことはあるけどね。
というか、>>266 のは変数 io がゼロに初期化されることを
前提にしている時点であまりいい回答では無いように思うけどな。
0278259
2009/06/10(水) 16:33:09どうも、ありがとうございました。
授業はどうもいまいちわかりません(笑)
これからも、ちょくちょく質問させていただきますので、
くだすれの皆さん、よろしくお願いします。
0279デフォルトの名無しさん
2009/06/11(木) 23:43:42VBやC#でVS2005を使ってたのですが、Intel コンパイラv11を買って
Visual Fortranを入れてみたところ、Intellisenseが効きません。
Visual Fortranでは使えないということですか?
これだとVSをFortran開発環境とする利点がかなり消えてしまうと思うのですが・・・
0280デフォルトの名無しさん
2009/06/12(金) 00:01:40使えない。
そういうものがあることを知らなければ気にならないから、いますぐ忘れるんだ!
ただしPolyHedoronがLaheyFortran用のインテリセンスっぽい奴を売っている。
ttp://www.lahey.com/LFVSIntegration.htm
0281デフォルトの名無しさん
2009/06/12(金) 00:46:40そうですか・・・
計算はLinuxクラスタで走らすけど、開発は使い慣れたWindowsのVSで
っていう人を見たことがあって、それいいなぁと思って入れてみたんですが・・・
Laheyっていうの初めて知りました。intellisenseっぽいポップアップが出てますね。
これやNAGなど他の開発環境で良いのがないか当たってみようかなぁ
ちなみにNAGの↓の比較図ですが、他社製ってやっぱVisual Fortranですかね・・・(苦笑
ttp://www.nag-j.co.jp/nagfor/img/f95comp.jpg
0282デフォルトの名無しさん
2009/06/12(金) 00:57:25PGI Visual Fortran というのもあって、これもVSと統合されているのだが、
確か今は米国内の研究機関に所属していればただで使える。
アメリカの研究機関に知り合いがいれば(略
SalfordというかSilverFrostのFTN95もVSと統合できる。
しかし、PGIもSalfordもインテリセンスは無かったような気がする。
最新状況はしらねw
IntelFortranは今月中にF2003対応度が高まったv11.1で出るらしいので、
あわてずゆっくりしていってね。
0283デフォルトの名無しさん
2009/06/12(金) 03:33:59色々ありがとうございます。
↓を見みると、SalfordのVS統合はintellisenseみたいなのがあるようです。
http://www.silverfrost.com/17/ftn95/ftn95_visual_studio_dotnet_integration.aspx
というかこれ無料っぽくないですか?太っ腹すぎる・・・
PGIも、ざっくり見た感じIntel VFよりは機能が多そうですね。
試用できるようなので試してみます。
しかしIntel VFはせめてキーワード補完くらいあればいいのに・・・
性能第一で見やすさ・作りやすさは二の次ってことなんでしょうか(ある意味硬派?
0284279
2009/06/12(金) 21:26:08Silverfrost FTN95 Express
PGI Visual Fortran
NAG Fortran Builder
SilverfrostとPGIはVS組み込みタイプで、IVFと同じくintellisense等の高度なものはありませんでした。
それ以外も、パッと見特に違いはなさそうで、結局は好みの問題ということになるんでしょうか。
NAGのIDEはVS組み込みではなくオリジナルで、唯一これだけキーワード補完ができましたが、
変数や関数の補完は×でした。
うーん、こうなるとこのままIVFを使い続けたほうがよさそうです・・・
0285279
2009/06/12(金) 21:44:13http://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/57076/
皆思うことは同じのようですねw
Steveおじさんも要望をよく理解してくれてるようですが、これまではVS2008への対応で
手一杯だったようです。MSが仕様をコロコロ変えることも妨げの原因だとぼやいてました。
結局、何が根本の原因なのかははっきりと書かれてませんでしたが、IVF以外のVS組込みIDEも
IVFと似たような現状なのを考えると、VS側のほうでAPIみたいな道具を提供してくれないと
Intellisenseのような高度機能は実装できない、ということなのかもしれません。
Steveさんが言うに、C++,C#,VBのVSで備わっていたこれらの機能が「Visual Studio Shell」
で分離されたので、Fortran上にも実装できそう、とのことです。
早くそうなって欲しいところですが、先月のスレへのSteveさんのレスを見る限り、もう少しかかりそうですね・・・
http://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/65546/
0286デフォルトの名無しさん
2009/06/13(土) 16:09:350287デフォルトの名無しさん
2009/06/14(日) 22:04:16スティーブって森の熊さんホモ動画の熊さんの一匹に似てるよね。
0288デフォルトの名無しさん
2009/06/15(月) 22:36:44ただ、今後のトレンドを考えるとやはりCは…
0289デフォルトの名無しさん
2009/06/15(月) 22:46:01シンタックス・カラーリングがあるだけでも極楽浄土のけだるい怠けた世界に見えるのさ。
0290デフォルトの名無しさん
2009/06/15(月) 23:20:51そうなるとFortran一択しかなくなる…
MSがVisualFortran出してくれれば(^q^)
0291デフォルトの名無しさん
2009/06/15(月) 23:30:16っ [MS Fortran PowerStation]
0292デフォルトの名無しさん
2009/06/16(火) 00:33:41そう、それをもう一度頼む!(><)
MSのFortran部隊はどこ行っちまったんだ?
0293デフォルトの名無しさん
2009/06/16(火) 00:49:49Netscapeがブラウザー戦争を仕掛けたせいで、VC++部隊以外が全部IE開発に
回されたという噂が当時あった。
まぁMSの歴史をたどると、BASICの次に作って売ったのはFORTRANだから
MS Visual FORTRANは原点回帰といえなくもないが、VBすら捨ててしまうMS様は
容赦ないのだw
でも、高い金出してコンパイラ律儀に買ってくれるのはFORTRANユーザーくらい?
0294デフォルトの名無しさん
2009/06/16(火) 00:55:45MS → DEC → Compaq → Intel
0295デフォルトの名無しさん
2009/06/16(火) 13:53:00MSからDECに流れたとはしらなんだ
IntelとMSがもっとみっちり連携してくれればいいんだけど、またWintelって非難が起こりそうだな
0296arrayの地獄
2009/06/16(火) 22:24:17ifort 9.1です。
real(8)::x(25,25),y(50,50)
x=なんたら
y=0
y(1:25,1:25)=x(1:25,1:25)
y=cshift(y,12,1)
y=cshift(y,12,2)
特にy=xのところ。
なんでこんなんに時間食う??
(メモリ書き込みに難儀してるのはわかるが、
y全体がキャッシュ上に乗るから、キャッシュで整えてから書けば時間かからんはず・・)
0297デフォルトの名無しさん
2009/06/16(火) 22:27:38それだけじゃ分からんっつの
時間食うってどれくらい?
0298arrayの地獄
2009/06/16(火) 22:46:24@xeon5160? 1core使用
なんかおかしいな・・もうちょっと調べます。
0299デフォルトの名無しさん
2009/06/16(火) 22:49:48fmt: end of file
apparent state: unit 10 named inp-2.dat
last format: (F9.5)
lately reading sequential formatted external IO
となるのですが何が問題なんでしょうか?プログラムは外部データ(inp-2.dat)から数値を読み最大値を求めるものです
数値は実数です
0300デフォルトの名無しさん
2009/06/16(火) 22:56:05>y(1:25,1:25)=x(1:25,1:25)
なぜ素直にy=xとしない。
多分
ALLOCATE(TMP(26,26))
TMP=x
y=TMP
DEALLOCATE(TMP)
のように展開されるから遅いんだろ。
0301デフォルトの名無しさん
2009/06/16(火) 22:59:20TMP(25,25)だったw 0:25と勘違いしたよ。1:25とか俺的にはあり得ないw
>>299
データ数が足りないように見受けられる。
F9.5に当たるところでデータが足りないか、変数の数が合わないかしてるのでは?
0302296です。
2009/06/16(火) 23:06:23program test
implicit none
integer,parameter::nx=25,ny=50
real(8)::x(nx,nx),y(ny,ny)
integer::i
x=reshape((/1:25*25/),shape(x))
do i=1,100000
call sub1(x,y,nx,ny)
call sub2(x,y,nx,ny)
end do
end program test
subroutine sub1(x,y,nx,ny)
implicit none
real(8)::x(nx,nx),y(ny,ny)
integer::nx,ny
y=0
y(1:nx,1:nx)=x(1:nx,1:nx)
y=cshift(y,12,1)
y=cshift(y,12,2)
end subroutine
subroutine sub2(x,y,nx,ny)
implicit none
real(8)::x(nx,nx),y(nx,nx) !nyでなくnx
integer::nx,ny
y=0
y(1:nx,1:nx)=x(1:nx,1:nx)
y=cshift(y,12,1)
y=cshift(y,12,2)
end subroutine 続く
0303デフォルトの名無しさん
2009/06/16(火) 23:07:10データ数ですか。それは入力元のファイルの値に問題ありということですか?プログラムは
IMPLICIT REAL(A-H,O-Z)
DIMENSION X(100)
OPEN(UNIT=10,FILE='inp-2.dat',STATUS='old',FORM='FORMATTED')
OPEN(UNIT=11,FILE='list-2.dat',STATUS='UNKNOWN',FORM='FORMATTED')
READ(10,100)N
DO 20 I=1,N
READ(10,200)X(I)
20 CONTINUE
IMAX=0.0
DO 30 I=1,N
IF(X(I).GT.IMAX)MAXN=I
IF(X(I).GT.IMAX)IMAX=X(I)
30 CONTINUE
WRITE(11,300)'MAX=',IMAX,'NO.=',MAXN
100 FORMAT(A5)
200 FORMAT(F9.5)
300 FORMAT(A4,F10.5,A4,I3)
CLOSE(10)
CLOSE(11)
STOP
END
となってます。サンプルプログラムを改変しただけなのでおかしいところが多いと思います。入力ファイルはとりあえず実数を5つ縦に並べてあります
0304296です。
2009/06/16(火) 23:07:11[hoge@xeon prog20]$ time a.out
real 0m2.359s
user 0m2.357s
sys 0m0.002s
[hoge@xeon prog20]$ gprof -b
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
71.83 1.53 1.53 100000 0.00 0.00 sub1_
28.17 2.13 0.60 100000 0.00 0.00 sub2_
0.00 2.13 0.00 1 0.00 2.13 MAIN__
0305296です。
2009/06/16(火) 23:13:31CPUはcore2の6600 2.4Gでcashe=4Mでした。
yとxの寸法が違うので、y=xにできないはずです。
逆フーリエ変換にかけるとき外を0にしておきたいので、
こんなになっています。
実プログラムでは逆フーリエ変換にかかる時間と
同じくらいの時間がかかって大損しています。
0306296です。
2009/06/16(火) 23:18:31y(1:25,1:25)=x(1:25,1:25)
を100000回実行すると、
real(8)::x(25,25),y(50,50) のとき =>1.53秒かかる。
real(8)::x(25,25),y(25,25) のとき =>0.60秒かかる。
2.5倍もかからんでええやろ
ということです。
0307296です。
2009/06/16(火) 23:27:05私もできる範囲で手伝い。
100 FORMAT(A5) が気になります。
実際に実行させたらNにどんな値が入るでしょうか?
思っている値かどうかwrite文で確かめるのが吉かと思います。
0308デフォルトの名無しさん
2009/06/16(火) 23:32:44このままだと実行すらできないんですよね・・・
READ(〜)N のあとに
N=5 としてみましたが実行エラーの文は変わりませんでした
0309デフォルトの名無しさん
2009/06/16(火) 23:40:27corei7のifort 11ですが
$ cat test.f90
integer,parameter::n=25
real(8)::x(n,n),y(2*n,2*n)
x=0
y=1
!y=x
y(1:n,1:n)=x(1:n,1:n)
end
$ time ./a.out
real 0m0.001s
user 0m0.000s
sys 0m0.001s
n=25000だと
real 0m1.974s
user 0m0.754s
sys 0m1.217s
何か環境おかしいんじゃないんでしょうか?他のホストで試したどうっすかね
0310296です。
2009/06/16(火) 23:44:15適当にinp-2.datに
5
1
12
123
1234
12345
123456
と入れてます。
read(〜)Nのあとにwrite(*,*)Nとすれば、ここまでは走りませんか?
これで走らせると、私の場合はN= 538976288と、とんでもないことになってました。
数字を数として読み込みたいのに、文字として読み込んだらまずいですよね、やっぱり。
A5はI5ぐらいかと思いますが、どうでしょう?
0312デフォルトの名無しさん
2009/06/16(火) 23:54:28inp-2.datに小数点以下1桁を含んだ実数を適当に5つ入れて、writeしてみたところN=1073741824となってました。
フォーマットをi5にすると実数を受け取れないのでF5.5にしてみたのですが、Nは上記の通りです。何が起こってるんですかね・・・?
0313296です。
2009/06/16(火) 23:55:32すんません。メインルーチンで
do i=1,100000
と回してますので、timeの結果が直接比較できないです。
すみませんが追加でテストお願いできませんか?
0314デフォルトの名無しさん
2009/06/17(水) 00:14:43いやメインルーチンとかじゃなくて
>>309でテストすりゃいいじゃん
0315296です。
2009/06/17(水) 00:18:42Nはデータの個数ですよね。実数じゃまずいのでは?
inp-2.datは
データの個数
データ1
データ2
:
というような構造じゃありませんか?
少なくとも最初のデータだけは整数かな。
それとIMAXを実数宣言しなきゃいけないようです。
0316デフォルトの名無しさん
2009/06/17(水) 00:27:14datファイルにデータの個数を入れてなかったんですね・・・やっとわかりました!ありがとうございます。実行できました
プログラム自体はうまくいってないんですが・・・w
実行結果がMAX=0.000・・・、No.=2となっているんでうまくいってないですね
0317296です。
2009/06/17(水) 00:33:29お世話になってます。
確かにこちらでも結果0秒になりました。
いやしかし、たぶん0.000,0060秒(6マイクロ秒)くらいかかっているのが、
timeコマンドの分解能不足で測れてないだけの様な気がしてますです。
実際は100000x100000回とかもっとぐらい実行するので、何とかしたいです。
>>316
IMAXの方もよろしく。
0319デフォルトの名無しさん
2009/06/17(水) 00:53:40実数宣言とは何でしょうか?imax=0.0ではダメなんですよね?
0320300
2009/06/17(水) 01:02:12>yとxの寸法が違うので、y=xにできないはずです。
すまんこw ようつべ見ながらだったので、よく見なかったww
こんなものに時間がかかるも糞もないだろと思ったが、
10^5*10^5回も繰り返すなら気になるかw
部分配列でメモリーが連続していないので、コンパイラのバージョンが古いと
余計なテンポラリを暗黙にとっている可能性が高いと思う。
DO i = 1, 25
y(1:25, i) = x(:, i)
END DO
と、でもすれば早くなるべ。最適化でアンローリングとかもあろうし。
0321296です。
2009/06/17(水) 01:07:49ありがとうございます!
テストコードを302に書き込みました。これでお願いできたらありがたいです!
問題点のほうは、まとめると、
302のプログラムで
y(1:25,1:25)=x(1:25,1:25)
を100000回実行すると、
real(8)::x(25,25),y(50,50) のとき =>1.53秒かかる。
real(8)::x(25,25),y(25,25) のとき =>0.60秒かかる。
「2.5倍もかからんでええやろ」
ということです。
おわかりいただけたでしょうか?
ifort10.1を試みてみました。XEON5160です。
% time a10.out :ifort10.1
1.288u 0.000s 0:01.31 97.7%
% time a09.out :ifort9.1
1.916u 0.004s 0:01.96 97.4%
だいぶ差があるなあ・・というところです。
0322296です。
2009/06/17(水) 01:16:14real imax
を宣言文のところに追加です。
FORTRANの慣習ではI〜Nから始まる変数名は整数変数に使うことになっているので、
imaxのままだと動くけどちょっと減点かな?
imax->xmaxにするほうがいいかも。この場合real xmaxは不要。
>>320
ご指摘ありがとうですです。
さっそく試してみますです!
0323デフォルトの名無しさん
2009/06/17(水) 01:21:31うまくいきました! なんとなくfortranがわかりはじめてきました!
ありがとうございます
0324デフォルトの名無しさん
2009/06/17(水) 01:30:040325309
2009/06/17(水) 01:39:38こんな感じでした。時間はreal timeです
Corei7 920、ifort 11.0
real(8)::x(25,25),y(50,50)・・・0m0.799s
real(8)::x(25,25),y(25,25)・・・0m0.255s
Xeon5472、ifort 10.1
real(8)::x(25,25),y(50,50)・・・0m0.922s
real(8)::x(25,25),y(25,25)・・・0m0.280s
Opteron2218、pgf90 6.2
real(8)::x(25,25),y(50,50)・・・0m9.821s
real(8)::x(25,25),y(25,25)・・・0m4.372s
>>300さんの指摘通りってことですかね
Opteronが糞遅いのが気になりますが・・・(;^ω^)
0326296です。
2009/06/17(水) 01:56:29ありがとうございます!!お手数掛けました。
COREi7万歳というところですか。
320様のご指摘も含めていろいろ検討したいのですが、
今晩はこの辺で失礼します。
(いろいろありがとうございました。また明日頑張ります。)
0327デフォルトの名無しさん
2009/06/17(水) 03:05:28opteronを完全に引き離した
0328デフォルトの名無しさん
2009/06/17(水) 03:11:03OpteronというよりPGIのコンパイラのせいのような気がする。
オプションがどうなってるのかわからんし。
最新版は8.0だし。
でもたしかにi7はなかなかいい。
0329309
2009/06/17(水) 13:56:34>OpteronというよりPGIのコンパイラのせいのような気がする。
その通りでしたw
>>325のコンパイルは全てオプション指定なしでして、調べたところ
ifortはデフォルトで-O2が、pgf90は-O1がかかるようです。
-O2を付けた場合↓
real(8)::x(25,25),y(50,50)・・・0m1.306s
real(8)::x(25,25),y(25,25)・・・0m0.784s
0330デフォルトの名無しさん
2009/06/17(水) 20:36:22>1:25とか俺的にはあり得ないw
Cみたいに0から開始ってこと?
Fortranだと1から始めるのが一般的だと思うけど
0331デフォルトの名無しさん
2009/06/17(水) 23:16:26いや、:だけで済ますとか、それすら書かないと言うこと。
0332デフォルトの名無しさん
2009/06/18(木) 18:02:57そういうことね
で、実際どれがいいんだろうか。例えば↓の3つでは
�@ x(1:n) = y(1:n)
�A x(:) = y(:)
�B x = y
自分は�Aが良いと思ってる。�@は冗長だし、�Bは簡潔だけど配列であることが自明じゃないので。
問題はどれが一番速いかなんだけど・・・
↓のサイトでは「並列最適化コンパイラの動作を助け、バグを少なくするため」�@が推奨されてるし
ttp://www.mri-jma.go.jp/Project/mrinpd/coderule.html
でも、これって>>300氏の言ってることとは反対だよね。
0333デフォルトの名無しさん
2009/06/18(木) 19:19:25例えば、配列 data1 から data4 があって、次々にsubroutine に引き渡したい場合ですが、
call hoge(data1)
call hoge(data2)
call hoge(data3)
call hoge(data4)
しないで、
do i=1,4
call hoge( )
end do
の様にまとめる事って加能ですか? もし可能ならやり方教えてください。
0334デフォルトの名無しさん
2009/06/18(木) 19:22:10data1 から data4 は既に7次元配列なので、それらをまとめる事はできないです。
0335デフォルトの名無しさん
2009/06/18(木) 19:22:23普通は配列をdata(n,4)と2次元にして
do i=1,4
call hoge(data(:,i))
enddo
0336デフォルトの名無しさん
2009/06/18(木) 19:25:497次元配列ってすごいなw
Fortranの配列って7が限界だったっけ?それなら無理じゃないかな
あきらめれ
■ このスレッドは過去ログ倉庫に格納されています