開始した非同期処理の完了を待つように指定します。このプラグマは、インテル® MIC アーキテクチャーにのみ適用されます。
#pragma offload_wait specifier[, specifier...] |
target ( target-name [ :target-number ])
if ( if-specifier )
wait ( tag[, tag...] )
ターゲットを表す識別子。 ターゲット名 mic のみ利用可能です。
値が次のように解釈される整数式。
この引数を指定しない場合、ランタイムシステムはコプロセッサーからすべての tag の signal があるまで待機します。
0 以上の値は、特定のコプロセッサーでの実行を指定します。 特定のコプロセッサーは次のように指定します。
coprocessor=target-number % number_of_coprocs
オフロードプログラムの実行に必要な正しいターゲット・ハードウェアがシステムで利用できない場合、プログラムは実行に失敗してエラーメッセージを出力します。
2 または 6 を指定すると、ランタイムシステムはコプロセッサー 2 から tag の signal があるまで待機します (2 % 4 と 6 % 4 はどちらも 2 になるため)。
1000 を指定すると、ランタイムシステムはコプロセッサー 0 から tag の signal があるまで待機します (1000 % 4 = 0 になるため)。
ブーリアン式。
式が TRUE と評価されると、ランタイムは tag の signal があるまで待機します。
式が FALSE と評価されると、wait 節は無視されます。
offload または offload_transfer で非同期計算あるいは非同期データ転送を開始するために指定した if-specifier を使用します。
式にはベースライン言語のアドレス値が含まれます。
offload または offload_transfer で非同期計算あるいは非同期データ転送を開始するために指定した値を使用します。
offload_wait は、offload_transfer で開始した非同期データ転送または非同期計算の完了を待ち、offload で行われたデータ転送を返します (ある場合)。
wait ( tag[, tag...] ) 指定子が必要です。開始した非同期データ転送または非同期計算の待機を示します。
#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);
}
}
}