インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

offload_wait

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

構文

#pragma offload_wait clause[, clause ...]

必須の指示節

オプション指示節

引数

必須の指示節

target-name [ :target-number] )

target-name はターゲットを表します。インテル® Xeon Phi™ 製品の場合は mic を使用します。

target-number は整数式です。値は次のように解釈されます。

>=0

次の式に応じて、文を特定のターゲット上で実行します。

target = target-number % number_of_targets

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

  • 2 または 6 を指定すると、ランタイムシステムはターゲット 2 でコードを実行します (2 % 4 と 6 % 4 はどちらも 2 になるため)。

  • 1000 を指定すると、ランタイムシステムはターゲット 0 でコードを実行します (1000 % 4 = 0 になるため)。

<-1

予約済み。

wait ( tag [, tag, ...] )

開始した非同期データ転送または非同期計算を待つ場合に指定します。

tag は、ポインターのサイズ値をベースライン言語で表現したものです。 signal 節と同じ表現の値が使用され、開始した非同期処理のハンドルとして使用されます。 ここで言う非同期処理は、非同期データ転送または非同期計算です。

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

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

オプション指示節

if (if-clause)

ブール式。

式の評価結果

動作

true

ランタイムは tag が発生するまで待機します。

false

節は無視されます。

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

この節を使用してオフロードを有効にするかどうかを制御します。 関連するオフロード文がすべて有効または無効になるように、関連するプラグマでこの節を適切に使用してください。

status ( statusvarname )

オフロード構造の実行状態を特定します。 statusvarname 変数には、実行状態を示す値が含まれます。 後述の「説明」セクションでステータス変数の初期化方法と設定可能な値について説明します。

stream ( handle )

handle で指定した stream へのすべてのオフロードの完了を待機します。

handle が 0 で、target 節がインテル® MIC アーキテクチャー・ベースの汎用デバイスの場合、すべてのデバイスのすべてのオフロードの完了を待機します。例: target(mic)

handle が 0 で、target 節がインテル® MIC アーキテクチャー・ベースの特定のデバイスの場合、そのデバイスのすべてのストリームの完了を待機します。 例えば、target(mic:1) を指定すると、デバイス 1 のすべてのオフロードの完了を待機します。

ストリームに関する詳細は、「ストリームを使用したオフロード」を参照します。

説明

このプラグマは、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);
    }
  }
}

関連情報