2017-07-11 34 views
1

私はFORTRAN90で書かれた最適化アルゴリズムを並列化しようとしていて、gfortran XXXXX -fompでcygwinインターフェイスを使ってコンパイル/実行しています。cygwin OMPコアダンプ

このアルゴリズムは、サブルーチンコールとの有限差分によって勾配とヘッセ行列を計算します。サブルーチンはかなり大きく、毎回〜2MBの行列を操作する必要があります。議論の目的のために、私は "call srtin()"をサブルーチンコールの例として使用します。

コンパイル時にOMPコードを一切使用しないと、コンパイル時に-fompオプションを使用するとプログラムが失敗します(コードは問題なくコンパイルされます)。 gfortranを使った定期的なコンパイルと実行で問題は発生しません。しかし、-fompオプションを追加した瞬間に、srtin()への単一の呼び出しが存在すると、結果の実行可能ファイルがセグメンテーション違反を引き起こします。

このサイトでは、ompに関するよくある問題がスタックサイズの問題であると読んでいます。私は、スレーブスレッドを作成するコードがまだ含まれていないため、マスタースレッドのスタックサイズの問題が間違っていると推測しました(おそらく間違っています)。典型的なLinuxコンピュータでは、私は "ulimit -s XXX"を使用して、このスタックサイズを十分に高い値にリセットし、エラーが発生しなくなることを理解しています。私は私のCygwinのインターフェイスを介してこれを試してみましたが、エラーは持続します。また、peflagsコマンドを使用してこの実行可能ファイルのスタックメモリをより高く設定しようとしました。また、OMP_STACKSIZE環境変数を増やしました。

誰にも提案はありますか?

+0

-fopenmpのcygwin64 gfortranリンクステップで、-Wl、 - stack、900000000を使用して、プライマリスタックサイズが不十分なために失敗しないようにします。 OMP_STACKSIZE環境変数はサポートされていると思いますが、Windowsでlibgfortranによってどの環境変数がサポートされているかはわかりません。私はどのくらいのスタックが32ビットcygwin gfortranでサポートできるか分かりません。私はそれがはるかに少ないと思う。 – tim18

答えて

0

GCCでOpenMPを有効にすると、ヒープ上の大規模な配列の自動配置が無効になります。したがって、コードにOpenMP構造体がない場合でも、プログラムがクラッシュする可能性があります。 Windowsにはulimit -sに相当するものはありません。これは、メインスレッドのスタックサイズが実行可能ファイルのPEヘッダーから読み取られるためです。 OMP_STACKSIZEは、ワーカースレッドのスタックサイズを制御し、マスタスレッドの1つには影響しません。

peflagsでPEヘッダーを編集するのではなく、@ tim18の指示に従って-Wl,--stack,some_big_valueを使用してください。 some_big_valueはバイト単位です。詳細については、hereを参照してください。

+0

よかった、ありがとう。コンパイル行に '-Wl、 - stack、some_big_value'を追加することは、そのトリックを行いました。 –

関連する問題