インテル® C++ コンパイラー 16.0 ユーザー・リファレンス・ガイド
デバイスデータ環境を作成して同じデバイスで構文を実行します。このプラグマは、インテル® MIC アーキテクチャーおよびインテル® グラフィックス・テクノロジーにのみ適用されます。
#pragma omp target [clause[, clause, ...]] |
structured-block
clause |
次のいずれかです。
|
このプラグマは、デバイスデータ環境を作成し、それを使用して、デバイスで構造化ブロックの計算を実行します。このプラグマに到達したタスクは、デバイス上の計算が完了するまで待機します。if(scalar-expression) が false と評価されると、構造化ブロックはホストで実行されます。デフォルトでは、プログラムの実行はオフロードタスクが完了するまで待機します。nowait 節を指定すると、実行はオフロードタスクの完了を待たずに継続します。depend 節は、以前のタスクへの依存性を作成します。詳細は、task プラグマの説明を参照してください。
このプラグマは、構造化ブロックが omp parallel for として指定された並列ループの場合、インテル® グラフィックス・テクノロジーをサポートします。その場合、並列ループをプロセッサー・グラフィックスへオフロードします。if(scalar-expr) 式が false と評価された場合、またはターゲットデバイスが利用できない場合、構造化ブロックはホスト側でループを実行します。
マッピングは、1 つまたは複数の map 節で定義されます。map-type は次のいずれかです。
alloc
各リスト項目に対応する未定義の値の新しい変数をデバイス上で作成します。
to
各リスト項目に対応する新しい変数がデバイス上で作成され、ホスト上のそのリスト項目で初期化されます。
from
デバイス上の各リスト項目の値がホストにコピーされます。
tofrom
各リスト項目に対応する変数がデバイス上で作成され、ホスト上の変数で初期化されます。ターゲット領域の最後に、デバイス上の変数はホスト上の変数にコピーされます。
インテル® グラフィック・テクノロジーの場合、物理メモリーは CPU とプロセッサー・グラフィックス間で共有されます。map-type 値の from と tofrom は、グローバル・データ・オブジェクトへの直接アクセスを除き、nocopy 実装にマップします。デバイス領域への入口で、リスト項目の物理メモリーがメモリーに保存され、そのデバイス領域が終了するまで保持されます。これにより、コピーを回避してオフロードのオーバヘッドを軽減し、動作を維持します。copy と nocopy どちらの場合も、競合を回避するため、同じメモリーへの CPU アクセスは同期されなければなりません。
デバイスデータ環境を作成してそのデバイスで構造化ブロックを実行する例 |
---|
#pragma omp target map(double dist, double x1, double y1, double x2, double y2) { dist = sqrt((x2 – x1)**2 + (y2 – y1)**2 ); } |
デバイスのデータ環境を作成し、依存性が満たされたらデバイスで構造化ブロックを非同期実行する例 |
---|
#pragma omp target map(double dist, double x1, double y1, double x2, double y2) depend(in: a) nowait { dist = sqrt((x2 – x1)**2 + (y2 – y1)**2 ); } |
上記の例は、このプラグマを使用して領域をオフロードし、以前の target または task プラグマにより依存性 a が満たされたら、デバイスで非同期実行されるようにする方法を示します。以前の target または task プラグマがない場合、領域は直ちに実行のためオフロードされます。