4

私はめったにFortranを使用しませんが、並行して実行するためにレガシーコードを書き直すという任務を負っています。コンパイラーの選択にgfortranを使用しています。https://computing.llnl.gov/tutorials/openMP/でいくつかの優れたリソースと、他のいくつかのリソースを見つけました。

私の問題は、OpenMPディレクティブを追加する前に、レガシープログラムをコンパイルするだけの場合です。

gfortran Example1.F90 -o Example1

すべてが機能しますが、ディレクティブを追加しなくてもopenmpコンパイラオプションをオンにします。

gfortran -openmp Example1.F90 -o Example1

レガシープログラムを実行すると、セグメンテーション違反が発生します。私が書いた小さなテストプログラムを使用して、複数のスレッドで実行される-openmpを使用して他のプログラムを正常にコンパイルしましたが、オプションを単独で有効にし、ディレクティブを使用しないとセグメンテーション違反が発生する理由がわかりません。

私の質問がかなり単純なものである場合は、お詫び申し上げます。コードを投稿することはできますが、かなり長いです。初期値を割り当てると障害が発生します。

    REAL, DIMENSION(da,da) :: uconsold
    REAL, DIMENSION(da,da,dr,dk) :: uconsolde

    ...

    uconsold=0.0    
    uconsolde=0.0       

「uconsold」への最初の割り当ては正常に機能します。2番目の割り当ては障害の原因のようです。次の数行をコメントアウトすると、「uconsolde」が再び使用されるまで陽気に実行されます。

この件に関してご協力いただきありがとうございます。

4

2 に答える 2

8

おそらく、スタックスペースを実行していますか?openmpを使用すると、各スレッドが独自のコピーを持つように変数がスタックに配置されます。おそらく、配列は大きく、単一のスレッド(openmpディレクティブなし)でもスタックを使い果たしています。推測です...オペレーティングシステムの方法を試して、スタックスペースのサイズを増やし、セグメンテーション違反がなくなるかどうかを確認してください。

別のアプローチ:配列をヒープに配置するように指定するには、配列を「割り当て可能」にすることができます。OpenMPバージョン3.0では、Fortranの割り当て可能な配列をさらに使用できます。詳細はわかりません。

于 2010-05-19T17:20:19.833 に答える
2

私はこの問題を抱えていました。不気味です。OpenMPディレクティブを使用せずに33x33配列または11x11x11配列を宣言しただけでsegfaultが発生します。これらのセグメント障害は、4GBのRAMを搭載したIntelMacで発生します。それらを静的に割り当てられるのではなく「割り当て可能」にすることで、この問題が修正されました。

于 2011-01-28T00:30:22.787 に答える