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

offload

文をターゲット上で実行します。 このプラグマは、インテル® MIC アーキテクチャーにのみ適用されます。

構文

#pragma offload specifier[specifier...]

specifier は次のいずれかです。

<expression-stmt>

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

引数

target-name

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

target-number

signal 節と wait 節に必須。

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

-1

ターゲット上での実行を指定します。 ランタイムシステムは特定のターゲットを選択します。CPU で実行することはできません。 オフロードプログラムの実行に必要な正しいターゲット・ハードウェアがシステムで利用できない場合、プログラムは実行に失敗してエラーメッセージを出力します。

>=0

0 以上の値は、特定のターゲット上での実行を指定します。 特定のターゲットの番号は次のように指定します。

target=target-number % number_of_targets

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

<-1

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

この引数を指定しない場合、ランタイムシステムがコードを実行する CPU またはターゲットを選択します。複数のターゲットが利用可能な場合は、特定のターゲットを選択します。

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

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

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

if-specifier

ブーリアン式。

式が TRUE と評価されると、プログラムは文をオフロードしようとします。指定したターゲットがシステムにない、またはその時点で完全にロードされていて利用できない場合、文は CPU で実行されます。

式が FALSE と評価されると、そのオフロードの文は CPU 上で実行されます。ほかのオフロード節には影響しません。

このプラグマに signal 節または wait 節を指定している場合、式が FALSE と評価されると、動作は不定になります。

同じ宣言子でこの節と mandatory 節を一緒に使用しないでください。

signal

オプションで指定可能な整数式。非同期データ転送または計算処理のハンドルになります。演算は オフロードで処理され、CPU でプラグマ以降のコードを実行中に out 節によりオフロードから結果が返されます。この節がない場合、オフロード全体と関連するデータ転送は同期して実行されます。CPU は、プラグマが完了するまでそれ以降のコードを実行しません。

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

wait

オプションで指定可能な整数式。開始した非同期データ転送または非同期計算を待つ場合に指定します。

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

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

mandatory

オプションで指定可能な節。ターゲットで実行する必要がある場合に指定します。CPU で実行することはできません。オフロードプログラムの実行に必要な正しいターゲット・ハードウェアがシステムで利用できない場合、プログラムは実行に失敗してエラーメッセージを出力します。

同じ宣言子でこの節と if-specifier 節を一緒に使用しないでください。

offload-parameter

次のいずれかです。

  • in ( variable-ref [, variable-ref] [ modifier[ modifier ] ] )

  • out ( variable-ref [, variable-ref] [ modifier[ modifier ] ] )

  • inout ( variable-ref [, variable-ref] [ modifier[ modifier ] ] )

  • nocopy ( variable-ref [, variable-ref] [ modifier[ modifier ] ] )

ヘテロジニアス環境でプログラムを実行すると、プログラム変数は CPU とターゲット間でコピーされます。この節は、変数がコピーされる方向 (ポインターの場合はコピーされるデータの量) を指定します。

in ターゲット領域への入力に使用する変数。この値はターゲット領域が完了した後にコプロセッサーから CPU にコピーされません。
out ターゲット領域の出力に使用する変数。 ホスト CPU はこの変数をターゲットにコピーしません。
inout

CPU からターゲットおよびターゲットから CPU にコピーされる変数。

nocopy

以前のターゲットの実行から再利用される値、またはオフロードされたコードセクション内で使用される値を含む変数は、コピーを防ぐために nocopy 節にリストします。

in または outelement-count-expr 式 (後述の modifier の説明を参照) は、式が記述される文または節の前で評価されます。

宣言からサイズが分かる配列変数は全体でコピーされます。 配列のサブセットを処理する場合、サブセットの開始要素へのポインターと element-count-expr を使用して配列のサブセットを転送します。

in 節にリストされないデータポインター変数は構造内で初期化されないため、逆参照できるようになる前に値を割り当てる必要があります。

variable-ref

次のいずれかです。

  • C/C++ 識別子。

  • variable-ref.identifier

  • array-slice

array-slice

variable-ref '[' integral-expression [ : integral-expression ] ']'

array-slice は、1 つの連続する配列要素のセットを表す配列式です。

modifier

次のいずれかです。

  • length(element-count-expr)

    element-count-expr は整数式で、ランタイムに計算されます。 ポインター変数または可変長配列とともに使用します。

    • ポインター変数。

      ホスト CPU とターゲットのメモリーアドレスが対応していないため、ポインター変数の値はホスト/ターゲットのインターフェイス間でコピーされません。 代わりに、ポインターが指すオブジェクトがターゲットに、またはターゲットからコピーされ、ポインター変数の値が更新されます。 デフォルトでは、単一要素がコピーされます。

      element-count-expr を使用して、ポインターが指すデータとして見なすポインター型の要素の数を指定できます。 式の値が 0 または負の場合、ランタイムエラーが発生します。

    • 可変長配列。

      element-count-expr は、CPU とターゲット間でコピーする要素の数を指定します。

alloc_if ( condition ) | free_if (condition ) condition はブーリアン式です。

alloc_if は、オフロードがターゲットで実行されるときに in 節の割り当て変数がターゲットに新しいメモリーブロックを割り当てるかどうかを制御するブーリアン条件を指定します。 式が TRUE と評価されると、節でリストされている各変数に新しいメモリーが割り当てられます。 条件が FALSE と評価されると、ターゲットにすでに割り当てられている値が再利用 されます (データ保持)。 前のオフロードに対して free_if (0) 節を使用し、十分なサイズのメモリーブロックがターゲットの変数に割り当てられていることを確認する必要があります。

free_if は、in 節の割り当て変数に割り当てたメモリーを解放するかどうかを制御するブーリアン条件を指定します。 式が TRUE と評価されると、節でリストされている各変数に割り当てられたメモリーは解放されます。 条件が FALSE と評価されると、リストの各変数に割り当てられたメモリーに対する操作は行われません。 割り当てられたメモリーは後の節で再利用できます (データ保持)。

alloc_if 修飾子と free_if 修飾子のデフォルト設定は次のとおりです。

alloc_if

free_if

in

true

true

inout

true

true

out

true

true

nocopy

false

false

詳細は、「ポインター変数のメモリー割り当ての管理」を参照してください。

  • align (expression): expression の値は 2 の累乗でなければなりません。 この修飾子はポインター変数に適用され、インテル® MIC アーキテクチャーで割り当てたポインターデータの最小アライメントに合わせます。

  • alloc (array-slice): array-slice は、割り当てが必要な配列要素のセットを指定します。 in/ out 式で指定されたデータは、ターゲット上に割り当てられた配列の対応する部分に転送されます。 詳細は、「部分配列の一部へのメモリー割り当て」を参照してください。

  • into (var-exp): var-exp は変数式です。 into 修飾子は、CPU 上の 1 つの変数からターゲット上の別の変数へ (またはその逆に) データを転送します。 into 修飾子を使用する場合、variable-ref では 1 つの項目のみ指定できます。 詳細は、「1 つの変数から別の変数へのデータの移動」を参照してください。

説明

offload は、データを転送して計算をオフロードします。

任意の文 (複合文を含む)、または OpenMP* parallel プラグマの前に offload プラグマを記述して、複合文、トップレベルの OpenMP* 構造、または単一の呼び出し文をリモート実行するように指定できます。

offload プラグマの内部で __MIC__ プリプロセッサー・マクロを使用しないでください。ただし、プラグマから呼び出されるサブプログラムでこのマクロを使用することは可能です。

このプラグマがあると、次の処理が行われます。

  1. if 節がない場合は、ステップ 3 に進みます。

  2. ホスト CPU で、if 式を評価します。 式が TRUE と評価された場合は、ステップ 3 に進みます。それ以外の場合は、ホスト CPU の領域を実行し、終了します。

  3. ターゲットを取得します。取得に成功した場合は、ステップ 4 に進みます。 それ以外の場合は、ホスト CPU の領域を実行し、終了します。

  4. ホスト CPU で、in および out 節で使用されている alloc_iffree_ifelement-count-expr 式と out 節で使用されている element-count-expr 式をすべて計算します。

  5. ホスト CPU で、オフロードへの入力である変数値をすべて収集します。

  6. ホスト CPU からターゲットに入力値を送ります。

  7. ターゲットで、可変長 out 変数のメモリーを割り当てます。

  8. ターゲットで、入力値を対応するターゲットの変数にコピーします。

  9. ターゲットで、オフロード領域を実行します。

  10. ターゲットで、out 節で使用されている element-count-expr 式をすべて計算します。

  11. ターゲットで、オフロードの出力である変数値をすべて収集します。

  12. ターゲットからホスト CPU に出力値を送ります。

  13. ホスト CPU で、受け取った値を対応するホスト CPU の変数にコピーします。

次の例は、可変長配列を使用して CPU とターゲット間でコピーする要素の数を指定しています。

void sample(const int nx)
{
  float temp[nx];
  #pragma offload target(mic) in(temp : length(nx))
  {
    ...
  }
}

次の例は、in/out 節の variable-ref の指定方法を示します。

typedef int ARRAY[10][10]; 
int a[1000][500];
int *p;
ARRAY *q;
int *r[10][10];
int i, j;
struct { int y; } x;
#pragma offload …  in( a )
#pragma offload … out( a[i:j][:] )
#pragma offload …  in( p[0:100] )
#pragma offload …  in( (*q)[5][:] )
#pragma offload …  in( r[5][5][0:2] )
#pragma offload … out( x.y )

関連情報


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