自動並列化機能は、ワークシェアリング構造 (PARALLEL DO 宣言子) などの OpenMP* のいくつかのコンセプトを取り入れています。ここでは、自動並列化について説明します。
ループは次の条件を満たす場合に並列化できます。
ループがコンパイル時にカウント可能な場合。つまり、ループの実行回数 (ループ反復回数) を表す式が、ループに入る直前に生成されることを意味しています。
FLOW (WRITE の後の READ)、OUTPUT (WRITE の後の WRITE)、または ANTI (READ の後の WRITE) ループ運搬のデータ依存性がない場合。同じメモリーの場所が、ループの異なる反復で参照されるときに、ループ運搬のデータ依存が起こります。コンパイラーの判断で、推測されたループ運搬の依存性がランタイム依存性のテストで解決されると、ループは並列化されることがあります。
コンパイラーは、コンパイル時に定数ではないループ・パラメーターを持つ parallel for ループで、実行するメリットを検証するためにランタイムテストを生成します。
コーディング・ガイドライン
自動パラレライザーの機能性と効率性を強化するコーディング・ガイドラインを次に示します。
可能な限りループの最大繰り返し回数を明記します。特に最大繰り返し回数が既知で、ローカル変数にループ引数を保存する場合には定数を使用します。
コンパイラーが運搬依存データと判断する可能性のある構造 (プロシージャー呼び出し、不明瞭な間接参照、グローバル参照など) をループ本体内に配置しないでください。
想定されたデータ依存を一義化するには、!DEC$ PARALLEL 宣言子を挿入します。
スレッド間の共用で生じるオーバーヘッドを正当化するには、適切ではない動作を含むループの前に !DEC$ NOPARALLEL 宣言子を挿入します。
自動並列化の処理では、コンパイラーは次のステップを実行します。
データフローの解析: プログラムを通してデータのフローを計算します。
ループの分類: しきい値解析で示されるように、正確さと効率に基づいて並列化のループの候補を決定します。
依存性の解析: 各ループの入れ子で参照における依存性の解析を計算します。
高度な並列化: 依存性のグラフを解析し、並列で実行できるループを決定して、ランタイムの依存性を計算します。
データのパーティショニング: SHARED、PRIVATE、および FIRSTPRIVATE のアクセスのタイプに基づいて、データ参照とパーティションを検査します。
マルチスレッド・コードの生成: ループのパラメーターを修正し、スレッドタスクごとに入口/出口を生成して、スレッド生成と同期化の並列ランタイムルーチンへの呼び出しを生成します。
-parallel (Linux*) オプションまたは /Qparallel (Windows*) オプションを使用すると、インテル製マイクロプロセッサーおよび互換マイクロプロセッサーにおいて並列化が有効になります。実行ファイルでは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーにおいてより優れたパフォーマンスが得られる可能性があります。また、並列化は、/arch や /Qx (Windows*) または -m や -x (Linux* および Mac OS* X) などの特定のオプションによる影響を受けます。
OpenMP* を使用するオプションはインテル製マイクロプロセッサーおよび互換マイクロプロセッサーの両方で利用可能ですが、両者では結果が異なります。両者の結果が異なる可能性のある OpenMP* 構造および機能の主なリストは次のとおりです: ロック (内部的なものおよびユーザーが利用可能なもの)、SINGLE 構造、バリア (暗黙的および明示的)、並列ループ・スケジューリング、リダクション、メモリーの割り当て、スレッド・アフィニティー、バインド。
© 1996-2011 Intel Corporation. 無断での引用、転載を禁じます。