0

100を超えるサブルーチンを含むプログラムがあり、このコードをより高速に実行しようとしています。また、並列フラグを使用してこれらのサブルーチンをコンパイルしようとしています。並列フラグを使用する場合、プログラムでどの変数またはパラメーターを定義する必要があるのか​​疑問に思いました。並列最適化フラグを使用するだけで、並列フラグがない場合と比較して、プログラムの実行時間が長くなりました。

どんな提案でも大歓迎です。どうもありがとう。

よろしく、Jdbaba

4

1 に答える 1

2

私はあなたにいくつかの一般的なガイドラインを与えることができますが、あなたの特定のコンパイラとプラットフォーム/ OSを知らなければ、私はあなたを具体的に助けることができません。私の知る限り、Fortranコンパイラーで使用されるすべての自動並列化スキームは、OpenMPまたはMPIコマンドを使用して、ループをスレッドまたはプロセスに分割することになります。問題は、これらのスキームに関連する一定量のオーバーヘッドがあることです。たとえば、あるケースでは、ベンダーから提供された最適化ライブラリを、最適化なしでコンパイルされたライブラリとして使用するプログラムがありました。私のサブルーチンと関数はすべてオプティマイザーの大きなループの外側または内側にあり、オブジェクトデータしかないため、自動並列化はipoを実行できず、複数のコアを使用できませんでした。

注意として、自動並列化は魔法ではありません。基本的に、彼らが行っているのは、自動ベクトル化手法と同じタイプのことです。つまり、前の反復に依存するデータがないループを探すことです。変数が反復間で変更されたことを検出した場合、またはコンパイラーが認識できない場合、ループの並列化は試行されません。

インテルFortranコンパイラーを使用している場合は、診断スイッチ「/qpar-report3」または「-par-report3」をオンにして、ループの依存関係ツリーに関する情報を提供し、ループが最適化に失敗した理由を確認できます。使用しているコードの大部分、特にメジャーループのある部分にアクセスできない場合は、コード内で自動並列化を使用する機会があまりない可能性があります。

いずれの場合も、依存関係を減らし、自動並列化がより使いやすいようにコードを再定式化することをいつでも試みることができます。

于 2013-02-04T19:40:46.643 に答える