私はめったに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」が再び使用されるまで陽気に実行されます。
この件に関してご協力いただきありがとうございます。