私はFortranでopenmpを使用していますが、プログラムが実行される前に、以下に示すように、行に書き込もうとするとセグメンテーション違反が発生します。
783 module Lines
784
785 character*80 eline, dline
786
787 contains
788
789 subroutine InitializeLines
790 print*, 'writing to eline'
791 write(eline,'(1x,79(''#''))')
792 print*, 'writing to dline'
793 write(dline,'(1x,79(''-''))')
794 end subroutine InitializeLines
795
796 end module Lines
メインルーチンで、を呼び出そうとすると、セグメンテーション違反が発生する前にInitializeLines
単に印刷されます。writing to eline
これで、を使用せずにコンパイルすると、プログラムは完全に正常に実行されます-fopenmp
。また、このセクションでアクティブになっているスレッドは1つだけであることに注意してください(aは、1つのスレッドだけでget_num_threads()
入力InitializeLines
していることを示しています)。離陸する-fopenmp
とすぐに、セグメンテーション違反は発生せず、プログラムは正しく実行されます。
また、-DUSEOPENMP
openmpを使用する場合のフラグがmakefileにあることにも注意してください。それを定義していない場合、openmpアクションは実行されません。これは重要です。なぜなら、を使用せず -DUSEOPENMP
にコンパイルすると -fopenmp
、余分なスレッドを呼び出したり、openmpの一部を使用したりしていないことを100%確信しているにもかかわらず、同じセグメンテーション違反の問題が発生するからです。
-static
さて、少し遊んでみると、コンパイルオプションとしてを取り出すと、この問題がなくなることがわかりました。私の質問は-なぜですか?なぜそれが一緒に機能しないのですか、-static
そして-fopenmp
それは私が他の方法で対処できる問題ですか?