OpenMPを使用してFortran90で大きなプログラムを並列化しようとしています。
セグメンテーション違反エラーが常に発生します。それらを修正する簡単な方法はないかと思います。セグメンテーション違反エラーが発生した場合はどうしますか?
まず、コードを元の並列化されていないバージョンにロールバックします。あなたはこれをバージョン管理下に置いていますね?
シリアルプログラムがセグメンテーション違反を引き起こさないことを注意深く確認してください。このドキュメントでIntelから提起された問題に特に注意してください。Intel Fortranコンパイラを使用していない場合でも、これをお読みください。提案された是正措置を取ります。
次に、最初の構成を並列化します。可能であれば、ネストされていない単純なループを選択してください。プログラムを再テストします。自分が何をしたかを考え、何が起こっているのかを理解していることを確認してください。並列化する別の単純な構成を選択します。単純なものが終わったら、より複雑なものに移ります。その間、テストを進めながら学習します。
それで、あなたの質問に答えるために:そのような欠陥を修正する最良の方法は、そもそもそれらを作らないことです。あなたはいつもセグメンテーション違反を起こしていると報告していますが、これはあなたが歩く前に走ろうとしたことを私に示唆しています。
そして別の質問に答えるために:いいえ、それらを修正する簡単な方法はありません。
HPMが示唆しているように、OpenMPを使用してコンパイルした場合、またはOpenMPを使用せずにコンパイルした場合にのみ、セグメンテーション違反が発生しますか?
コンパイラが提供するすべてのデバッグオプションを使用してコンパイルすることをお勧めします。コンパイラーは、問題のいくつかを識別し、それらをメモリー・アクセスの問題としてではなく、Fortranの問題として報告できる場合があります。たとえば、実行時の添え字チェックは、セグメンテーション違反を引き起こす可能性のある不正な添え字を識別します。他のコンパイラオプションは、バグの可能性を低くする優れたコーディング手法を適用できます。どのコンパイラを使用していますか?