現在、OpenMP を使用してレガシー アプリケーションを並列化しています。私の作業中に、並列スレッドで呼び出されることを意図したサブルーチンと関数のパラメーターに INTENT を追加し、keywork pure を広範囲に使用して、関数とサブルーチンの副作用のないコードをコンパイラーにチェックさせ、変更しないようにしました。グローバル状態。
ここで、OpenMP 標準 (4.0 ドラフトを含む) 内で次のように記述されていることに気付きました。
Fortran の制限: 次の制限は、すべての OpenMP ディレクティブに適用されます。
どうしてこんなことに?特に INTENT と pure は、コンパイラに副作用のないコードを強制的にチェックさせる優れたツールです。併用が禁止されているのはなぜですか?その背後にある技術的な理由は何ですか?
現在実装されているコードは、バグなしでコンパイルおよび実行され、何の不満もありません。また、ツールとプロセス管理ツールで確認できるように、実際に並行して実行されています。
そのように動作しない場合、コンパイラを利用して副作用のないコードをチェックし、それを OpenMP と並行して実行するにはどうすればよいでしょうか? 現在のアプリケーションは、特定する必要がある実行時制御のために (変更された) グローバル状態を広範囲に使用します。
主に Intel Fortran Compiler (ifort) でテストされました。