インテル® C++ コンパイラー 16.0 ユーザー・リファレンス・ガイド
このトピックは、インテル® グラフィックス・テクノロジーをターゲットとする IA-32 およびインテル® 64 アーキテクチャーにのみ適用されます。
offload プラグマに続く文は、プロセッサー・グラフィックスで実行するアウトライン関数に変換されます。このコードは、ほかの関数を呼び出すことができます。呼び出された関数がプロセッサー・グラフィックスでも利用できることを保証するには、次の特別な関数属性を指定する必要があります。
Windows*、Linux* |
__declspec( target (gfx)) function-declaration |
Linux* |
__attribute__((target (gfx))) function-declaration |
プログラムの関数はすべて、常に CPU 向けにコンパイルされ、CPU で呼び出すことができます。ただし、この特別な属性で明示された関数のみ、オフロードコードで呼び出すことができます。また、これらの関数のみ、プロセッサー・グラフィックスで呼び出すことができます。
グローバル変数は同様の方法で扱われます。グローバル変数はすべて、CPU コードに常に存在します。しかし、ターゲット属性を含むグローバル関数のみ、ターゲットにオフロードされるバイナリーにコンパイルされます。次の特別な変数属性を指定します。
Windows*、Linux* |
__declspec( target (gfx))variable-declaration |
Linux* |
__attribute__((target (gfx))) variable-declaration |
ターゲット属性で明示された関数とデータのみターゲットバイナリーにコンパイルすると、プロセッサー・グラフィックスのコードが可能な限り小さくなることが保証されます。
コンパイラーは、ターゲット属性を含まないオフロードコード内で参照された関数とデータに対して警告を出力します。
オフロード構造内の関数呼び出しは、関数をターゲットで利用できるように自動的に宣言しません。関数がターゲット上で利用できることを保証するには、関数定義に適切なターゲット属性が含まれていなければなりません。
ターゲット属性を含む変数または関数の定義とすべての宣言は、すべてのコンパイル単位で互いに一致していなければなりません。
__declspec(target(gfx)) // ホストとターゲットでグローバル変数を割り当てます。 int global = 55; __declspec(target(gfx)) // 関数 foo のホストバージョンとターゲットバージョンを作成します。 int foo() { return ++global; } int main (int argc, char* argv) { int i; #pragma offload target(gfx) inout(global) // 次のループをターゲットにオフロードします。 _Cilk_for (int i = 0; i < 1; i++) { foo(); } printf("global = %d (should be 56)\n", global); if (global == 56) { printf("Passed\n"); return 0; } else { printf("Failed\n"); return 1; } }