浮動小数点演算の精度を保証するためのオプションを必ず付けて下さい. deepconv においても, コンパイラーの最適化を強くかけた場合に, 計算結果がおかしくなる例が報告されています.
-Kieee
浮動小数点演算の精度を保証するためのオプションを必ず付けて下さい. deepconv においても, コンパイラーの最適化を強くかけた場合に, 計算結果がおかしくなる例が報告されています.
-fp-model strict -prec-div (もしくは, -fp-model precise -prec-div)
OS およびカーネルのバージョンによっては, 解像度を上げた計算を 行った際にセグメンテーションエラーが生じる場合があります.
この場合には, メモリのスタック領域の使用容量の最大値が比較的小さく 設定されている可能性があります.
多くの場合にはこの使用容量の最大値は ユーザでも設定可能なソフトリミットと呼ばれるものであるため, 以下のように最大値を増やすよう設定可能です. ただし, システム側で決められている最大値であるハードリミット以上に 大きくソフトリミットを設定することはできません.
スタック領域のハードリミットを調べます
> limit -h | grep stack stacksize XXXXXXXX
ここで XXXXXXXX として表示されるのが スタック領域のハードリミットです. (数値または "unlimited" が表示されます). この XXXXXXXX をスタック領域のソフトリミットに設定します.
> limit stacksize XXXXXXXX
スタック領域のハードリミットを調べます
$ ulimit -Ha |grep stack stack size (kbytes, -s) XXXXXXXX
ここで XXXXXXXX として表示されるのが スタック領域のハードリミットです. (数値または "unlimited" が表示されます). この XXXXXXXX をスタック領域のソフトリミットに設定します.
$ ulimit -s XXXXXXXX
また, Intel Fortran の ver.10.0 以上ではコンパイルオプション (FFLAGS) に
-heap-arrays
を追加してください. これは次のような事情によります.
Intel Fortran の ver.10.0 以上では一時的なメモリ割り当てを スタックへの割り付けることが増えました. このため, 上記のように limit または ulimit により制限を緩めても セグメンテーションエラーが出ることがあります. -heap-arrays を指定すると一時的なメモリ割り当てが ヒープ領域上におこなわれるようになるので, セグメンテーションエラー が回避できます.
参考:http://software.intel.com/en-us/articles/intel-fortran-compiler-increased-stack-usage-of-80-or-higher-compilers-causes-segmentation-fault/
ファイルに記述される NAMELIST が多い場合に, まれに一部の NAMELIST が読み込まれない場合があるようです.
ファイルにはちゃんと書き込まれているはずなのに, NAMELIST の情報が実行 プログラムに反映されない場合には, 実行プログラムによって出力されるメッ セージをチェックしてください. もしも以下のようなメッセージが表示されて いれば, ここで述べるような症状が現れていることになります.
!*** WARNING [XxxxNmlRead] *** NAMELIST group "xxxx_nml" is not found in "xxxx_xxxx.nml" (iostat=190). ^^^^^^^^^^ これが特徴.
この場合には, 読み込まれない NAMELIST の前に空行やコメント行を挿入する などし, 再度プログラムの実行と動作のチェックを行ってください. 空行やコメント行を何行か足すことで上記の症状は回避されるようです. (原因は不明です).