offload

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

構文

#pragma offload specifier[specifier...]

<statement>

specifier は次のいずれかです。

引数

target-name

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

target-number

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

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

-1

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

>=0

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

coprocessor=target-number % number_of_coprocs

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

<-1

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

例えば、4 つのコプロセッサーを搭載したシステムの場合:

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

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

if-specifier

ブーリアン式。

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

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

tag

tag 式は、ベースライン言語のアドレス式です。

signal とともに使用された場合、非同期処理 (データ転送または演算) のハンドルとなります。

wait とともに使用された場合、tag 式は signal 節の式と同じ値を使用した、開始した非同期処理のハンドルとなります 処理は、非同期演算または非同期データ転送です。

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 とターゲット間でコピーされます。offload-parameter は、変数がコピーされる方向 (ポインターの場合はコピーされるデータの量) を指定します。

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

CPU からコプロセッサーおよびコプロセッサーから CPU にコピーされる変数。

nocopy

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

nocopy 節を使用してすべてのオフロード・インスタンスで値を保持している場合、自動的に記憶領域が割り当てられる非スカラー変数 (スタック変数) の値はすべてのオフロード・インスタンスで保持されないことに注意してください。ただし、静的に割り当てられるすべての変数は保持され、自動的に割り当てられる非配列変数もすべてのオフロード・インスタンスで保持されます。

単に CPU とターゲット間のデータ転送を抑制するために 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 と評価されると、リストの各変数に割り当てられたメモリーに対する操作は行われません。 割り当てられたメモリーは後の節で再利用できます (データ保持)。

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

  • 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* 構造、または単一の呼び出し文をリモート実行するように指定できます。

データセットのサイズのようなランタイムの条件に基づいて文をオフロードするかどうか決定することができます。 if-specifier は、条件を指定します。

signal ( tag ) はオプションです。 オフロードを開始した後、CPU で実行を続ける場合に指定します。 演算は オフロードで処理され、CPU でプラグマ以降のコードを実行中に out 節によりオフロードから結果が返されます。 この節がない場合、オフロード全体と関連するデータ転送は同期して実行されます。 CPU は、プラグマが完了するまでそれ以降のコードを実行しません。

wait ( tag[, tag, ...] ) はオプションです。 開始した非同期データ転送または非同期計算を待つ場合に指定します。

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

mandatoryif は一緒に指定することはできません。

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

#pragma 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 )

関連情報


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