インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド

offload_wait

開始した非同期処理の完了を待つように指定します。このプラグマは、インテル® MIC アーキテクチャーにのみ適用されます。

構文

#pragma offload_wait specifier[, specifier...]

specifier は次のいずれかです。

specifier の引数は次のとおりです。

引数

target-name

ターゲットを表す識別子。 ターゲット名 mic のみ利用可能です。

target-number

signal 節と wait 節に必須。

この引数を指定しない場合、ランタイムシステムはコプロセッサーからすべての tag の signal があるまで待機します。

値が次のように解釈される整数式。

>=0

0 以上の値は、特定のコプロセッサーでの実行を指定します。 特定のコプロセッサーの番号は次のように指定します。

coprocessor=target-number % number_of_coprocs

オフロードプログラムの実行に必要な正しいターゲット・ハードウェアがシステムで利用できない場合、プログラムは実行に失敗してエラーメッセージを出力します。

<= -1

これらの値は予約されています。

例えば、4 つのターゲットを搭載したシステムの場合:

  • 2 または 6 を指定すると、ランタイムシステムはコプロセッサー 2 から tag の signal があるまで待機します (2 % 4 6 % 4 はどちらも 2 になるため)。

  • 1000 を指定すると、ランタイムシステムはコプロセッサー 0 から tag の signal があるまで待機します (1000 % 4 = 0 になるため)。

if-specifier

ブーリアン式。

式が TRUE と評価されると、ランタイムは tag の signal があるまで待機します。

式が FALSE と評価されると、wait 節は無視されます。

offload または offload_transfer で非同期計算あるいは非同期データ転送を開始するために指定した if-specifier を使用します。

wait

開始した非同期データ転送または非同期計算の待ち時間を指定する式 (必須)。

この節は特定のターゲットデバイスに関連するため、target 節で 0 以上の target-number を指定する必要があります。

シグナルが開始される前にシグナルを照会すると、未定義の動作を引き起こし、アプリケーションはランタイムアボートします。例えば、target:1 で開始されたシグナルを target:0 で照会すると、シグナルは target:1 で開始されているため、target:0 に関連付けられたシグナルはなく、アプリケーションはランタイムアボートします。

説明

この宣言子は、offload_transfer で開始した非同期データ転送または非同期計算の完了を待ち、offload で行われたデータ転送を返します (ある場合)。

次の例は、オフロードの入力をダブルバッファーにしています。

#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);
            }
      }
}

関連情報


このヘルプトピックについてのフィードバックを送信