インテル® C++ コンパイラー 14.0 ユーザー・リファレンス・ガイド
開始した非同期データ転送を待つように指定します。このプラグマは、インテル® MIC アーキテクチャーにのみ適用されます。
#pragma offload_wait clause[, clause ...] |
target ( target-name [ :target-number ] )
wait ( tag[, tag, ...] )
if ( if-clause )
status ( statusvarname )
必須の指示節
target-name はターゲットを表します。 インテル® Xeon Phi™ 製品の場合は mic を使用します。
target-number は整数式です。値は次のように解釈されます。
開始した非同期データ転送または非同期計算を待つ場合に指定します。
tag は、ポインターのサイズ値をベースライン言語で表現したものです。signal 節と同じ表現の値が使用され、開始した非同期処理 (非同期データ転送または非同期計算) のハンドルとして使用されます。
この節は特定のターゲットデバイスに関連するため、target 節で 0 以上の target-number を指定する必要があります。
ハンドルに関連付けられたシグナルは、開始した非同期データ転送または非同期計算が完了するとクリアされます。シグナルが開始される前にシグナルを照会すると、未定義の動作を引き起こし、アプリケーションはランタイムアボートします。例えば、target:1 で開始されたシグナルを target:0 で照会すると、シグナルは target:1 で開始されているため、target:0 に関連付けられたシグナルはなく、アプリケーションはランタイムアボートします。
オプション指示節
if (if-clause) |
ブーリアン式。 offload または offload_transfer で非同期計算あるいは非同期データ転送を開始するために指定した式を使用します。 注この節を使用してオフロードを有効にするかどうかを制御します。関連するオフロード文がすべて有効または無効になるように、関連するプラグマでこの節を適切に使用してください。 |
status ( statusvarname ) |
オフロード構造の実行状態を特定します。statusvarname 変数には、実行状態を示す値が含まれます。「説明」セクションで状態変数の初期化方法と設定可能な値について説明します。 |
このプラグマは、offload_transfer で開始した非同期データ転送または非同期計算の完了を待ち、offload で行われたデータ転送を返します (ある場合)。
status 節には statusvarname 変数が必要です。OFFLOAD_STATUS_INIT(statusvarname) マクロを使用して statusvarname 変数を初期化します。状態変数の値は offload.h で定義されています。設定可能な値は次のとおりです。
値 |
説明 |
|---|---|
OFFLOAD_SUCCESS = 0 |
文はターゲットで実行されました。 |
OFFLOAD_DISABLED |
文はターゲットで実行されませんでした。if-clause を指定し、その値が false の場合、文はホストで実行されました。 |
OFFLOAD_UNAVAILABLE |
ターゲットが利用できないため、文はターゲットで実行されませんでした。 |
OFFLOAD_OUT_OF_MEMORY |
offload-parameter 用のメモリーが不足していたため、文はターゲットで実行されませんでした。 |
OFFLOAD_PROCESS_DIED |
ターゲットでランタイムエラーが発生し、ターゲットのプロセスが終了したため、文はターゲットで実行されませんでした。 |
OFFLOAD_ERROR |
エラーが発生したため、文はターゲットで実行されませんでした。 |
#pragma offload_attribute(push, target(mic)) int count = 25000000; int iter = 10; float *in1, *out1; float *in2, *out2; #pragma offload_attribute(pop) void do_async_in() { int i; #pragma offload_transfer target(mic:0) in(in1: length(count) alloc_if(0) free_if(0) ) signal(in1) for (i=0; i<iter; i++) { if (i%2 == 0) { #pragma offload_transfer target(mic:0) if(i!=iter-1) in(in2 : length(count) alloc_if(0) free_if(0) ) signal(in2) #pragma offload target(mic:0) nocopy(in1) wait(in1) out(out1: length(count) alloc_if(0) free_if(0) ) compute(in1, out1); } else { #pragma offload_transfer target(mic:0) if(i!=iter-1) in(in1: length(count) alloc_if(0) free_if(0) ) signal(in1) #pragma offload target(mic:0) nocopy(in2) wait(in2) out(out2 : length(count) alloc_if(0) free_if(0) ) compute(in2, out2); } } }
次の例では、オフロードの出力結果がダブルバッファーにされています。
#pragma offload_attribute(push, target(mic))
int count = 25000000;
int iter = 10;
float *in1, *out1;
float *in2, *out2;
#pragma offload_attribute(pop)
void do_async_out()
{
int i;
for (i=0; i<iter+1; i++)
{
if (i%2 == 0) {
if (i<iter) {
#pragma offload target(mic:0) in(in1 : length(count) alloc_if(0) free_if(0) ) nocopy(out1)
compute(in1, out1);
#pragma offload_transfer target(mic:0) out(out1 : length(count) alloc_if(0) free_if(0) ) signal(out1)
}
if (i>0) {
#pragma offload_wait target(mic:0) wait(out2)
use_result(out2);
}
} else {
if (i<iter) {
#pragma offload target(mic:0) in(in2 : length(count) alloc_if(0) free_if(0) ) nocopy(out2)
compute(in2, out2);
#pragma offload_transfer target(mic:0) out(out2 : length(count) alloc_if(0) free_if(0) ) signal(out2)
}
#pragma offload_wait target(mic:0) wait(out1)
use_result(out1);
}
}
}