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 account
Return-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
------ ここまで ジョブ終了時に送られてくるメール -----------------------
これで全部。