私はFORTRAN90で書かれた最適化アルゴリズムを並列化しようとしていて、gfortran XXXXX -fompでcygwinインターフェイスを使ってコンパイル/実行しています。cygwin OMPコアダンプ
このアルゴリズムは、サブルーチンコールとの有限差分によって勾配とヘッセ行列を計算します。サブルーチンはかなり大きく、毎回〜2MBの行列を操作する必要があります。議論の目的のために、私は "call srtin()"をサブルーチンコールの例として使用します。
コンパイル時にOMPコードを一切使用しないと、コンパイル時に-fompオプションを使用するとプログラムが失敗します(コードは問題なくコンパイルされます)。 gfortranを使った定期的なコンパイルと実行で問題は発生しません。しかし、-fompオプションを追加した瞬間に、srtin()への単一の呼び出しが存在すると、結果の実行可能ファイルがセグメンテーション違反を引き起こします。
このサイトでは、ompに関するよくある問題がスタックサイズの問題であると読んでいます。私は、スレーブスレッドを作成するコードがまだ含まれていないため、マスタースレッドのスタックサイズの問題が間違っていると推測しました(おそらく間違っています)。典型的なLinuxコンピュータでは、私は "ulimit -s XXX"を使用して、このスタックサイズを十分に高い値にリセットし、エラーが発生しなくなることを理解しています。私は私のCygwinのインターフェイスを介してこれを試してみましたが、エラーは持続します。また、peflagsコマンドを使用してこの実行可能ファイルのスタックメモリをより高く設定しようとしました。また、OMP_STACKSIZE環境変数を増やしました。
誰にも提案はありますか?
-fopenmpのcygwin64 gfortranリンクステップで、-Wl、 - stack、900000000を使用して、プライマリスタックサイズが不十分なために失敗しないようにします。 OMP_STACKSIZE環境変数はサポートされていると思いますが、Windowsでlibgfortranによってどの環境変数がサポートされているかはわかりません。私はどのくらいのスタックが32ビットcygwin gfortranでサポートできるか分かりません。私はそれがはるかに少ないと思う。 – tim18