このステップでは、ホストとターゲットの両方で実行するように定義されているソースコードのセクションを確認します。
コードエディターでソースファイル src/CrossFade.cpp を開きます。
次のソースコードを探します。
#pragma offload target(gfx)if (do_offload) pin(inputArray1, inputArray2, outputArray: length(arraySize)) _Cilk_for (int i=0; i<arraySize; i++){ outputArray[i] = (inputArray1[i] * a1 + inputArray2[i] * a2) >> 8; }
インテル® Cilk™ Plus は、インテル® C++ コンパイラー 18.0 では非推奨の古い機能です。プロセッサー・グラフィックスへオフロードする代替手段は、将来のリリースで提供される予定です。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。
このコードブロックは、2 つの入力配列の加重和を計算します。コードブロックの最初に offload プラグマがあります。コンパイラーは、このプラグマで指定されたコードブロックを、ホストとターゲットの両方で実行するようにコンパイルします。
ホストとターゲットはメモリーを共有できます。共有するメモリー領域のアドレスは、明示的にオフロードランタイムに提供されなければなりません。そのためには、offload プラグマの pin 節を使用します。offload プラグマの構文は、in、out、inout 節の構文に似ています。
pin 節は、CPU とターゲット間で共有されるように変数を定義します。
in 節は、ターゲットの入力に使用する変数を定義します。この変数はホストにコピーされません。
out 節は、ターゲットの出力に使用する変数を定義します。ホストはこの変数をターゲットにコピーしません。
inout 節は、ホストとターゲット間でコピーする変数を定義します。
これらすべての節では、コンパイル時に配列の長さが不明な場合、要素数で長さを指定できる length 修飾子 (オプション) を指定できます。
プラグマの target 引数は、コードのオフロード先としてキーワード gfx で表されるターゲットを指定しています。
また、プラグマの if 節は、アプリケーションが実行時にコードをホストで実行するか、ターゲットで実行するかを制御します。if 節に渡された値が true と評価された場合、offload プラグマが指定されたコードは利用可能なターゲットで実行されます。if 節に渡された値が false と評価された場合、コードはホストでのみ実行されます。
offload プラグマの直後に _Cilk_for キーワードがあります。このキーワードは、ターゲット向けコードの重要な条件の 1 つを示しています: ターゲットへのオフロードが可能なのは並列ループまたは並列ループの入れ子のみで、これは offload プラグマの直後になければなりません。
デフォルトでは、コンパイラーはホストとターゲットの両方で実行するアプリケーションを生成しますが、同じソースコードを使用してホストでのみ実行するアプリケーションを生成することもできます。
次のステップでは、同じソースコードをコンパイルしてホストでのみ実行するアプリケーションを生成します。