ToDo:
追いかけ回せした結果だが、NPARA>1で並列処理に入るために fork(2)する際にFortran側の Output Bufferが Dirtyな場合、 fork(2)後の子プロセス側でも Bufferの書き出しが発生しているのが 原因の模様。子プロセス側では、write文は実行されないのだが 並列処理を合流させるために子プロセスがSTOPする際に Dirty Bufferが出力されているのかな?
対処法としては、fork(2)前に全ての Dirty Bufferを フラッシュすれば良いわけだが...効率的で移植性のある方法が有りません!
Fortran2003から実装された flush文は装置番号が必要だし、 引数なしで全てのI/Oをフラッシュするflushサブルーチンは ベンダ拡張なので存在が保証されない。また、新しいFortran規格では ストリームと接続可能な装置番号は0〜2^31-1までの整数に 拡張されているので、inquire文ですべて調べるコストは 極めて高いと思われる。
コード内のopen文に渡される装置番号をモニターして 最大値を割り出す必要があるか? ただし、open文を使わずにwrite文へ未接続の装置番号を 渡して、デフォルトのファイル名で出力しているコードが有るとNG。 write文の装置番号も追跡しないといけないのか...Orz
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記