Fortran 使用メモ
Fortran を使う時のメモです。[ compile option ] -C : 配列の範囲を越える添字をチェックする -u : 暗黙の変数宣言を無効にする -xld : 行頭に D がついていてコメントになっている行もコンパイルする (これを用いるとデバッグがやりやすい) -Bstatic : スタティックリンク指定。 LD_LIBRARY_PATH が混乱している状態などに特に有効よん
---- 人から依頼されたプログラムを s-unix にて実行した時のメモ ---- << 1 >> まず、渡されたプログラムを s-unix (S3800) 用に修正する。 具体的には、CPU 時間計測ルーチンとして S3800 では (x)clock というものがあるので、それを用いるように修正する。 xclock は clock の高精度版であり、8バイト実数に秒単位で値を 返す。 具体的には、 call xclock で時計の初期化および起動を行ない、 call xclock(cputime) (ただし、cputime は8バイト実数: real*8 。) でそれまでかかった時間を読み出す。 << 2 >> プログラムには入出力文としては、以下の read 文 --- 0回 write 文 --- 4回(うち1回はコメントアウトされている) open 文 --- 0回 があり、唯一有効な write は全て デバイス番号 6 に出力されて いるためこれは s-unix 上で リダイレクト にて対応することにす る。 ちなみに、デバイス番号については以下の通りの扱いになる。 ( マニュアルより抜粋 ) 5 : 標準入力 ( リダイレクト可能 ) 6, 7 : 標準出力 ( リダイレクト可能 ) さらに、その他の番号 nn については、 open 文がある場合: 指定したファイル。 open 文がない場合: ft.nn というファイル。 ただし、READ 文の場合、ファイルがない とエラーになる。 << 3 >> s-unix 上でコンパイルする。ベクトル処理用コンパイラ名は hf77 である。 man hf77 によれば、コンパイルオプションとして目を通すべきは -oFilename : 完成品の名前 -x : Syntax Error Check のみ。 -W0,'*******' : コンパイルオプションリスト --- コンパイルオプションリスト --- list(******) : コンパイル情報を出す。 --> s : source を出す。 --> p : コンパイラの出すメッセージを出す。 listlang(e|n) : メッセージを(英語|日本語)で出す。 opt(*****) : オプティマイズオプション -->o(0|2|3|4|s) : オプティマイズレベル --> s : 最高オプティマイズと思われるものの組合せ testmode(***) : チェック機構を働かせる。 --> g : goto 文をチェック --> a(0|1|2): サブルーチンの引数をチェック 0 --> 2 の方にきつくなる --> s : 配列参照の添え字のチェック --> debug : 厳しいと思われるチェック機構の組合せ といったところ。 詳細は全部で以下の通り。 -W0, -+- analyze(c|r) +- compsize(nM|s) +- form(fixed|free) +- hap(*) +- langlvl --+- l(77|66) | +- basicr | +- c | +- h8000 | +- darg(v|l) | +- pause(0|1) | +- precexp(0|all|4|8|allp|p4|p8|allc|c4|c8) | +- excnvf | +- list -----+- s | +- m | +- o | +- r | +- p | +- e(0|4|8|12) | +- inc(0|1) | +- listlang -+- e | +- n | +- objlvl(dary) | +- opt ------+- o(0|2|3|4|s) | +- approx | +- autocom | +- disbracket | +- divmove(0|1) | +- erchk(0|1) | +- expand | +- expmove(0|1) | +- outline | +- ischedule | +- prod | +- uinline(0|1[,ext[(FileName)]]|2[,ext[(FileName)]]) | +- xfunc -+- xfr | +- dxr | +- testmode -+- d +- e(0|1) +- g +- a(0|1|2) +- s +- b +- debug よって、以下のようにコンパイルすることにする。 テスト用: hf77 -x -W0,'list(s,p),listlang(n),opt(o(s)),testmode(debug)' **.f 実際用 : hf77 -W0,'list(s,p),listlang(n),opt(o(s))' **.f ちなみに、コンパイルメッセージは **.L というファイルに格納さ れる。 (注意) このコンパイラは .f という拡張子を持っていないファイ ルは認識できない!! (激馬鹿。信じられない。) このリストの中の行頭の文字は V : ベクトル化した S : ベクトル化できなかった M : 部分的にベクトル化した という意味を持つ。 ちなみに、コンパイラがタコなため、-o オプションは実用になら ないので使用しなかった。 << 3 >> s-unix 上でバッチジョブとしてプログラムを実行する。 [[ step 1 ]] まず、プログラム名が a.out なままなので、keisan.o と変えておく。 (もちろん、-o オプションを使っても良い) [[ step 2 ]] バッチコマンド qsub はコマンドラインでもスクリプト でも受け付ける。 基本的に、コマンドラインオプションをスクリプトで指 定するには一つずつをそれぞれ1行ずつに分けて、#@$ と いう文字列に続けて書けば良い。 man qsub によれば、考えておくべきオプションは以下の 通り。 -lT **:** : ジョブ全体の CPU 時間 の最大値 -lM **mb : ジョブ全体の スカラーメモリ使用量 の最大値 -lVM **mb : ジョブ全体の ベクトルメモリ使用量 の最大値 -ls **mb : 各プロセスが使用する stack 領域 の最大値 -lmb : ジョブ開始メールを送る -lme : ジョブ終了メールを送る(使用時間報告つき) -lmu *** : メール送付先 とりあえず、どれくらいメモリや時間を食うものか分か らないので、lmb, lme, lmu だけを指定することにする。 このバッチスクリプトを NQS.batch という名で用意した。 以下にその内容を示す。 ------ ここから NQS.batch の内容 ----------------------- #@$-mb #@$-me #@$-mu hoge@hoge.u-tokyo.ac.jp cd ~/fortran/ keisan.o > keisan.result ------ ここまで NQS.batch の内容 ----------------------- [[ step 3 ]] s-unix でバッチに投入する。 " qsub NQS.batch " とするだけで良い。 ちなみに、バッチがらみのコマンドとしては、 qstat : 投入したバッチについての情報 qdel : 投入したバッチの消去 ( request No. をつければよい ) などがある。 それから、参考のためにジョブ終了時に送られてくるメールを以下に示 す。 ------ ここから ジョブ終了時に送られてくるメール ----------------------- Date: Wed, 11 Jan 1995 15:19:20 GMT From: system PRIVILEGED accountReturn-Path: To: hoge@hoge.u-tokyo.ac.jp submit user = g38258 acct number = A request id = 280.s-unix.cc.u-tokyo.ac.jp submit host = s-unix.cc.u-tokyo.ac.jp submit queue = A submit time = 1995/01/12 (Thu) 00:19:09 job start time = 1995/01/12 (Thu) 00:19:11 job end time = 1995/01/12 (Thu) 00:19:20 job end status (wait code) = 0000 job exit status (exit code) = 0 job cpu time (user + system) = 0.762352 (0.565054 + 0.197298) sec job vpu time = 0.307869750 sec job elapsed time = 9 sec number of forked process = 4 cpu time charge = 10 Yen ------ ここまで ジョブ終了時に送られてくるメール ----------------------- これで全部。