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


234 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 00:52:40 ]
FORTRAN77では、いくつかのサブルーチンの間で共通の定数を使うとき
それぞれのサブルーチンで何回も同じ宣言をしなければいけないのですか?

このままだと定数の値を変えるのが非常に面倒なので
一回の宣言で済む方法を知りたいです

235 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:05:33 ]
>>234
定数宣言だけのファイルを1つ作って、各サブルーチンの先頭でINCLUDEする。

FORTRAN77の規格外だが大抵のコンパイラはINCLUDE文に対応している。


236 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:08:13 ]
>>234
PARAMETER文を用いてなら、標準では無いw

COMMON 変数でよければ BLOCK DATA 文で初期化できる。

ベンダー拡張機能を許せば、INCLUDE を使う手もある。

まぁ、横着せずにラインエディターで一括変換すればよろしいw

237 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:10:53 ]
ありがとうございます
とりあえずINCLUDE使ってみます

238 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:11:05 ]
>>234
モジュールでもいいぞ

239 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 02:04:13 ]
>>238
奴はFORTRAN77と縛りを入れている。

240 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 13:47:45 ]
>>236
entry文を使えば、何とかならない?


241 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 14:16:15 ]
とくに理由がない限り、77からはさっさと足を洗った方がよくない?

242 名前:236 mailto:sage [2009/05/27(水) 23:27:51 ]
>>240
たしかにENTRY文という手もあったな。

COMMONが嫌で、グローバル変数を実現する代わりに使ったことがあったが、
やっぱ変数全部がグローバルになるせいでデバッグが面倒で
よほど特殊な場合意外はやめたほうが良いと思った。



243 名前:デフォルトの名無しさん [2009/05/31(日) 15:35:51 ]
みなさまのお力をお借りしたく。
#FAQならすみませんが、ご容赦ください

IVF10.1(11でも)動作したソースを、Linux上のintelに持ち込んでコンパイルしました。
すると、以下のケースに分かれました。
1)あえてコード変換をせずにコンパイル
 コンパイルOKも、当然、表示は滅茶苦茶(要するに2バイト系がだめ)
2)SJIS->UTF8にしてコンパイル
 FORMAT文の箇所でエラー発生、これがどうしても直らない。
 ちなみにエラーメッセージは以下の通りです


244 名前:デフォルトの名無しさん [2009/05/31(日) 15:37:35 ]
test.for(14): error #5120: 終了していない文字定数です。
*//' ... ログ出力ファイルを入れて')
--------^
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
となります。

お気づきの点があれば、すみませんが、ご指摘ください。
よろしくお願いいたします。

245 名前:デフォルトの名無しさん [2009/05/31(日) 16:06:32 ]
>>244
a) 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バイト全角文字 の話題はあまりお話を聞かないからうまく行ったらここにも報告してよ。

246 名前:デフォルトの名無しさん [2009/05/31(日) 17:12:19 ]
早速ありがとうございます。ひとつ確認しましたので、ご報告をば。

a)kterm
 Ubuntu9.04にてktermを入れて、確認。
・UTF8はコンパイル時、文字化け?でダメ
・同じくSJISもだめ
・eucではifortでのコンパイルメッセージの出力が化けている(どれでも同じ??)状況でしたが、実行時は日本語出力OK
でした。

 となるとintelFortranのインストールもkterm上から行う方がよかったのか?

 まだすべての確認はできていませんが、うまくいきそうという報告まで。b)も後日、試してみますので結果を報告致します。

247 名前:デフォルトの名無しさん [2009/05/31(日) 17:36:04 ]
あ、追加。

うまく表示できているのは、kterm上で、の場合。通常のconsoleでは(当然っちゃぁ当然ですが)化け化けです。

248 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 08:32:25 ]
おつ〜。やっぱりktermがいいのね。

245のbのやつは、対で使われることが多い文字
(ichar()関数の返す値が
' が39、Hexでは27
" が41、Hexでは29
) が93、Hexでは5D
] は34(これはFortranではあまり意味がないか・・)
のようなやつ)が全角に混じってるとダメそうな気がする、という程度の意味で書いてみた。

でも、win版やktermインストだと大丈夫なんだよね。
246さんの意見のとおり、インストール時の設定その他に依存する部分が大きそうな気もするな。

249 名前:デフォルトの名無しさん [2009/06/01(月) 18:51:56 ]
文字化けの件、追試結果(w

 まだf77は試してませんが、どうやら文字コードは確かに影響してるっぽい。
 問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。
 
 このため、見かけ上、1行内では2バイト換算で70文字程度にしていたものがオバフロしていた模様。
 よってifortでは、-FI -132という固定ながら132文字にしたら通りました。

 いったい何をしていたんだ…わしorz

 ちなみにIVFでUTF8形式でソース保存して、それをWin上でコンパイルしたら妙なゴミが出てました。
 結構コード問題は奥が深そうです。

250 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 23:28:41 ]
>>249
知ってる人のような気がする......
tt

251 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 01:58:37 ]
> 問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。
なか〜まw

そっか、UTFだとエディタの見かけより実際のはるかに長いんだね。試しに
vi でてきとうにUTF使ったファイル開いたら、たしかに row 数が多い。
気を付けよう。

252 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 10:58:03 ]
Intel Fortran の使える KIND を関数呼び出しで見ると、ASCII だけになってたような。
確認してないw



253 名前:デフォルトの名無しさん [2009/06/04(木) 23:06:43 ]
モンテカルロ法の計算プログラムを流したら、

FORTRAN I/O ERROR 913: OUT OF FREE SPACE

って出てきて途中で計算が止まったっぽいです。
なにやらメモリー不足とのことですが、どう解決すればいいのでしょうか?

254 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:47:02 ]
>>253
ハードディスクを増設しろ!

255 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:14:43 ]
>>253
I/O エラーだから、メモリーではなくディスクが足りないんだろう。
/tmp とかのスクラッチ領域がパンパンになっている可能性もあるが。

256 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 01:44:17 ]
うほ

257 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 18:31:50 ]
いや、I/O処理の最中に何らかのリソースが足りなくなったというメッセージだと思う。

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.

258 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 03:03:47 ]
無書式での読み書きも、そのスペースを食うのかね。

259 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:04:27 ]
fortranの超絶初心者です。
以下のプログラムを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

260 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:16:43 ]
>>259
1.歴史と伝統のGOTO文で抜ける。
2.READ文で END=nnn で抜ける。

だが元のままEXITで抜けるのがもっとも行儀が良いとされる。

261 名前:259 mailto:sage [2009/06/06(土) 21:28:47 ]
>>260
授業の課題で、exitを使わないで書き上げろという事だったんですが・・・
どうも、ありがとうございました。

262 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:37:33 ]
>>261
>exitを使わないで書き上げろ
exitで抜けるのが一番良いのに、何でこう言ったんでしょ?



263 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 22:28:50 ]
世に蔓延るGOTO使いまくりのプログラムに慣れさせるため・・・ではないよな、多分。

READ文の指定子の使い方の勉強とかかな。

264 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 10:49:22 ]
ここはFortranでプログラムを作ってという図々しいお願いはおk?

265 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 11:41:39 ]
>>264
大丈夫。ただし、初心者にありがちな「エスパーさん、○○作って!」はやめて。
知っている情報をそのまますべて載せるべし。

266 名前:259 mailto:sage [2009/06/09(火) 16:56:11 ]
>>262さん  >>263さん
どうやら、説明が足りなかったようで、すいません。
今日授業に出たところ、
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で終了するとき、
前回の計算結果が表示されてしまいます。
またまたすいませんが、何を付け加えればいいのでしょうか?

267 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:09:31 ]
なんかアホらしい授業だけど。
program
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を使うほうが素直だ。


268 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:11:10 ]
ありゃ、間違えた。
program
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の外側に出さないといかん。

269 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:20:58 ]
ioの初期化も足りないし。ぐだぐだ。

270 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:24:17 ]
exitの偉大さを実感すると言う狙いなのだろう。

271 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:31:01 ]
蛇足だが >>259
do while ( .true. )

do
だけでおk

まあ、
do while (io==0)
に直させるためにワザと do while にしたのかもしれないが


272 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:52:10 ]
do while (io==0)
if (io==0) then
たまにこういうセンスなさすぎなコード書く人いるよね
他人が書いたコードをメンテするはめになったときに、こういうの見ると何とも言えない溜息がでるわ・・・
たとえバグはないとしても



273 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:17:11 ]
>>272
まぁ待てw
Fortran で WHILE を使おうとするだけでも、きわめて開明的な人物ではないか!

274 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:27:58 ]
> if (io==0) then
これはどこがセンスなさすぎなん?

275 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 03:23:56 ]
>>272 は「センス」って言葉を使いたかっただけなんだよ。

276 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 11:45:30 ]
>>274
ループの脱出(継続)分岐条件である io==0 が
WHILE と IF の二箇所で判断されていることを言ってるんだろ。

>>272の態度はむかつかせるだけから、くだすれ的には反省すべき。

277 名前:デフォルトの名無しさん [2009/06/10(水) 15:02:05 ]
将来コードをいじったときにそのループをスキップする場合があることを考えて
do while (io .EQ. 0)
みたいなのは意図的に書くことはあるけどね。
というか、>>266 のは変数 io がゼロに初期化されることを
前提にしている時点であまりいい回答では無いように思うけどな。

278 名前:259 mailto:sage [2009/06/10(水) 16:33:09 ]
>>268さん、>>271さん
どうも、ありがとうございました。
授業はどうもいまいちわかりません(笑)
これからも、ちょくちょく質問させていただきますので、
くだすれの皆さん、よろしくお願いします。

279 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:43:42 ]
Visual Fortranについて質問してもいいですか?(VS2008スレよりもこちらのほうが適切っぽいので・・・)

VBやC#でVS2005を使ってたのですが、Intel コンパイラv11を買って
Visual Fortranを入れてみたところ、Intellisenseが効きません。
Visual Fortranでは使えないということですか?
これだとVSをFortran開発環境とする利点がかなり消えてしまうと思うのですが・・・

280 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:01:40 ]
>>279
使えない。
そういうものがあることを知らなければ気にならないから、いますぐ忘れるんだ!


ただしPolyHedoronがLaheyFortran用のインテリセンスっぽい奴を売っている。
ttp://www.lahey.com/LFVSIntegration.htm

281 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:46:40 ]
>>280
そうですか・・・
計算はLinuxクラスタで走らすけど、開発は使い慣れたWindowsのVSで
っていう人を見たことがあって、それいいなぁと思って入れてみたんですが・・・

Laheyっていうの初めて知りました。intellisenseっぽいポップアップが出てますね。
これやNAGなど他の開発環境で良いのがないか当たってみようかなぁ

ちなみにNAGの↓の比較図ですが、他社製ってやっぱVisual Fortranですかね・・・(苦笑
ttp://www.nag-j.co.jp/nagfor/img/f95comp.jpg

282 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:57:25 ]
>>281
PGI Visual Fortran というのもあって、これもVSと統合されているのだが、
確か今は米国内の研究機関に所属していればただで使える。
アメリカの研究機関に知り合いがいれば(略

SalfordというかSilverFrostのFTN95もVSと統合できる。
しかし、PGIもSalfordもインテリセンスは無かったような気がする。
最新状況はしらねw

IntelFortranは今月中にF2003対応度が高まったv11.1で出るらしいので、
あわてずゆっくりしていってね。



283 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 03:33:59 ]
>>282
色々ありがとうございます。

↓を見みると、SalfordのVS統合はintellisenseみたいなのがあるようです。
www.silverfrost.com/17/ftn95/ftn95_visual_studio_dotnet_integration.aspx
というかこれ無料っぽくないですか?太っ腹すぎる・・・

PGIも、ざっくり見た感じIntel VFよりは機能が多そうですね。
試用できるようなので試してみます。

しかしIntel VFはせめてキーワード補完くらいあればいいのに・・・
性能第一で見やすさ・作りやすさは二の次ってことなんでしょうか(ある意味硬派?

284 名前:279 mailto:sage [2009/06/12(金) 21:26:08 ]
さっそく以下の3つを試しました。

Silverfrost FTN95 Express
PGI Visual Fortran
NAG Fortran Builder

SilverfrostとPGIはVS組み込みタイプで、IVFと同じくintellisense等の高度なものはありませんでした。
それ以外も、パッと見特に違いはなさそうで、結局は好みの問題ということになるんでしょうか。
NAGのIDEはVS組み込みではなくオリジナルで、唯一これだけキーワード補完ができましたが、
変数や関数の補完は×でした。

うーん、こうなるとこのままIVFを使い続けたほうがよさそうです・・・

285 名前:279 mailto:sage [2009/06/12(金) 21:44:13 ]
ググっていたところ、IntelのForumでどんぴしゃなスレを見つけました。
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さんのレスを見る限り、もう少しかかりそうですね・・・
software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/65546/

286 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:09:35 ]
確かにfortranerの開発って時代遅れな感があるな

287 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 22:04:16 ]
>>285
スティーブって森の熊さんホモ動画の熊さんの一匹に似てるよね。

288 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:36:44 ]
Fortranの開発環境のヘボさにうんざりしてCに逃げる人も多いんだろうな
ただ、今後のトレンドを考えるとやはりCは…

289 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:46:01 ]
紙テープ・パンチカード・ラインエディター上がりも多いFortran界では、スクリーンエディターで
シンタックス・カラーリングがあるだけでも極楽浄土のけだるい怠けた世界に見えるのさ。

290 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 23:20:51 ]
これから並列数は増える一方だから、最適化は少しの妥協も許されなくなるんだよな
そうなるとFortran一択しかなくなる…
MSがVisualFortran出してくれれば(^q^)

291 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 23:30:16 ]
>>290
っ [MS Fortran PowerStation]

292 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 00:33:41 ]
>>291
そう、それをもう一度頼む!(><)
MSのFortran部隊はどこ行っちまったんだ?



293 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 00:49:49 ]
>>292
Netscapeがブラウザー戦争を仕掛けたせいで、VC++部隊以外が全部IE開発に
回されたという噂が当時あった。

まぁMSの歴史をたどると、BASICの次に作って売ったのはFORTRANだから
MS Visual FORTRANは原点回帰といえなくもないが、VBすら捨ててしまうMS様は
容赦ないのだw

でも、高い金出してコンパイラ律儀に買ってくれるのはFORTRANユーザーくらい?

294 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 00:55:45 ]
>>292
MS → DEC → Compaq → Intel

295 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 13:53:00 ]
>>294
MSからDECに流れたとはしらなんだ
IntelとMSがもっとみっちり連携してくれればいいんだけど、またWintelって非難が起こりそうだな

296 名前:arrayの地獄 mailto:sage [2009/06/16(火) 22:24:17 ]
時間がかかって仕方ないのだが何とかなりませんか?
ifort 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全体がキャッシュ上に乗るから、キャッシュで整えてから書けば時間かからんはず・・)

297 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 22:27:38 ]
>>296
それだけじゃ分からんっつの
時間食うってどれくらい?

298 名前:arrayの地獄 mailto:sage [2009/06/16(火) 22:46:24 ]
92x49回で数秒のオーダー
@xeon5160? 1core使用
なんかおかしいな・・もうちょっと調べます。

299 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 22:49:48 ]
ド初心者ですが質問です。コンパイルできたファイルを実行すると
fmt: end of file
apparent state: unit 10 named inp-2.dat
last format: (F9.5)
lately reading sequential formatted external IO
となるのですが何が問題なんでしょうか?プログラムは外部データ(inp-2.dat)から数値を読み最大値を求めるものです
数値は実数です

300 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 22:56:05 ]
>>296
>y(1:25,1:25)=x(1:25,1:25)

なぜ素直にy=xとしない。 

多分
ALLOCATE(TMP(26,26))
TMP=x
y=TMP
DEALLOCATE(TMP)
のように展開されるから遅いんだろ。

301 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 22:59:20 ]
>>300
TMP(25,25)だったw 0:25と勘違いしたよ。1:25とか俺的にはあり得ないw

>>299
データ数が足りないように見受けられる。
F9.5に当たるところでデータが足りないか、変数の数が合わないかしてるのでは?

302 名前:296です。 mailto:sage [2009/06/16(火) 23:06:23 ]
[hoge@xeon prog20]$ cat test.f90
program 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 続く




303 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 23:07:10 ]
>>301
データ数ですか。それは入力元のファイルの値に問題ありということですか?プログラムは
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つ縦に並べてあります

304 名前:296です。 mailto:sage [2009/06/16(火) 23:07:11 ]
[hoge@xeon prog20]$ ifort test.f90 -p
[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__



305 名前:296です。 mailto:sage [2009/06/16(火) 23:13:31 ]
みにくてすみませんでした。

CPUはcore2の6600 2.4Gでcashe=4Mでした。

yとxの寸法が違うので、y=xにできないはずです。

逆フーリエ変換にかけるとき外を0にしておきたいので、
こんなになっています。
実プログラムでは逆フーリエ変換にかかる時間と
同じくらいの時間がかかって大損しています。


306 名前:296です。 mailto:sage [2009/06/16(火) 23:18:31 ]
まとめると、
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倍もかからんでええやろ
ということです。

307 名前:296です。 mailto:sage [2009/06/16(火) 23:27:05 ]
>>299
私もできる範囲で手伝い。
100 FORMAT(A5) が気になります。
実際に実行させたらNにどんな値が入るでしょうか?
思っている値かどうかwrite文で確かめるのが吉かと思います。


308 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 23:32:44 ]
>>307
このままだと実行すらできないんですよね・・・ 
READ(〜)N  のあとに
N=5  としてみましたが実行エラーの文は変わりませんでした

309 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 23:40:27 ]
>>296
corei7の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

何か環境おかしいんじゃないんでしょうか?他のホストで試したどうっすかね


310 名前:296です。 mailto:sage [2009/06/16(火) 23:44:15 ]
>>299
適当にinp-2.datに
5
1
12
123
1234
12345
123456
と入れてます。
read(〜)Nのあとにwrite(*,*)Nとすれば、ここまでは走りませんか?

これで走らせると、私の場合はN= 538976288と、とんでもないことになってました。
数字を数として読み込みたいのに、文字として読み込んだらまずいですよね、やっぱり。
A5はI5ぐらいかと思いますが、どうでしょう?


311 名前:296です。 mailto:sage [2009/06/16(火) 23:49:47 ]
>>309
情報ありがとうです。
corei7+ifort 11ですか・・
なるほど。別のマシンで試してみます。

312 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 23:54:28 ]
>>310
inp-2.datに小数点以下1桁を含んだ実数を適当に5つ入れて、writeしてみたところN=1073741824となってました。
フォーマットをi5にすると実数を受け取れないのでF5.5にしてみたのですが、Nは上記の通りです。何が起こってるんですかね・・・?



313 名前:296です。 mailto:sage [2009/06/16(火) 23:55:32 ]
>>309
すんません。メインルーチンで
do i=1,100000
と回してますので、timeの結果が直接比較できないです。
すみませんが追加でテストお願いできませんか?

314 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 00:14:43 ]
>>313
いやメインルーチンとかじゃなくて
>>309でテストすりゃいいじゃん


315 名前:296です。 mailto:sage [2009/06/17(水) 00:18:42 ]
>>299
Nはデータの個数ですよね。実数じゃまずいのでは?
inp-2.datは
データの個数
データ1
データ2

というような構造じゃありませんか?
少なくとも最初のデータだけは整数かな。
それとIMAXを実数宣言しなきゃいけないようです。

316 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 00:27:14 ]
>>315
datファイルにデータの個数を入れてなかったんですね・・・やっとわかりました!ありがとうございます。実行できました
プログラム自体はうまくいってないんですが・・・w
実行結果がMAX=0.000・・・、No.=2となっているんでうまくいってないですね

317 名前:296です。 mailto:sage [2009/06/17(水) 00:33:29 ]
>>314
お世話になってます。
確かにこちらでも結果0秒になりました。

いやしかし、たぶん0.000,0060秒(6マイクロ秒)くらいかかっているのが、
timeコマンドの分解能不足で測れてないだけの様な気がしてますです。
実際は100000x100000回とかもっとぐらい実行するので、何とかしたいです。

>>316
IMAXの方もよろしく。

318 名前:309 mailto:sage [2009/06/17(水) 00:39:12 ]
>>317
問題点を整理(できればテストコードを用意)して頂ければ協力できますよ
他のマシンもいくつかあります

319 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 00:53:40 ]
>>317
実数宣言とは何でしょうか?imax=0.0ではダメなんですよね?

320 名前:300 mailto:sage [2009/06/17(水) 01:02:12 ]
>>305
>yとxの寸法が違うので、y=xにできないはずです。
すまんこw ようつべ見ながらだったので、よく見なかったww

こんなものに時間がかかるも糞もないだろと思ったが、
10^5*10^5回も繰り返すなら気になるかw

部分配列でメモリーが連続していないので、コンパイラのバージョンが古いと
余計なテンポラリを暗黙にとっている可能性が高いと思う。

DO i = 1, 25
y(1:25, i) = x(:, i)
END DO
と、でもすれば早くなるべ。最適化でアンローリングとかもあろうし。

321 名前:296です。 mailto:sage [2009/06/17(水) 01:07:49 ]
>>318
ありがとうございます!
テストコードを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%
だいぶ差があるなあ・・というところです。



322 名前:296です。 mailto:sage [2009/06/17(水) 01:16:14 ]
>>319

real imax
を宣言文のところに追加です。
FORTRANの慣習ではI〜Nから始まる変数名は整数変数に使うことになっているので、
imaxのままだと動くけどちょっと減点かな?
imax->xmaxにするほうがいいかも。この場合real xmaxは不要。

>>320
ご指摘ありがとうですです。
さっそく試してみますです!





323 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 01:21:31 ]
>>322
うまくいきました! なんとなくfortranがわかりはじめてきました!
ありがとうございます

324 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 01:30:04 ]
初心者は呪文のようにimplicit noneを宣言しておきましょう。

325 名前:309 mailto:sage [2009/06/17(水) 01:39:38 ]
>>321
こんな感じでした。時間は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が糞遅いのが気になりますが・・・(;^ω^)

326 名前:296です。 mailto:sage [2009/06/17(水) 01:56:29 ]
>>309様(325)
ありがとうございます!!お手数掛けました。

COREi7万歳というところですか。
320様のご指摘も含めていろいろ検討したいのですが、
今晩はこの辺で失礼します。
(いろいろありがとうございました。また明日頑張ります。)


327 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 03:05:28 ]
corei7はかなり評判いいよね
opteronを完全に引き離した

328 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 03:11:03 ]
>>325
OpteronというよりPGIのコンパイラのせいのような気がする。
オプションがどうなってるのかわからんし。
最新版は8.0だし。

でもたしかにi7はなかなかいい。

329 名前:309 mailto:sage [2009/06/17(水) 13:56:34 ]
>>328
>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

330 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 20:36:22 ]
>>301
>1:25とか俺的にはあり得ないw
Cみたいに0から開始ってこと?
Fortranだと1から始めるのが一般的だと思うけど

331 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 23:16:26 ]
>>330
いや、:だけで済ますとか、それすら書かないと言うこと。

332 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 18:02:57 ]
>>331
そういうことね

で、実際どれがいいんだろうか。例えば↓の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氏の言ってることとは反対だよね。



333 名前:デフォルトの名無しさん [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

の様にまとめる事って加能ですか? もし可能ならやり方教えてください。

334 名前:デフォルトの名無しさん [2009/06/18(木) 19:22:10 ]

data1 から data4 は既に7次元配列なので、それらをまとめる事はできないです。






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

前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