ホストとターゲットの両方で実行するコードのセクションを指定する

このステップでは、ホストとターゲットの両方で実行するように定義されているソースコードのセクションを確認します。

  1. コードエディターでソースファイル src/CrossFade.cpp を開きます。

  2. 次のソースコードを探します。

    #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 プラグマの構文は、inoutinout 節の構文に似ています。

これらすべての節では、コンパイル時に配列の長さが不明な場合、要素数で長さを指定できる length 修飾子 (オプション) を指定できます。

プラグマの target 引数は、コードのオフロード先としてキーワード gfx で表されるターゲットを指定しています。

また、プラグマの if 節は、アプリケーションが実行時にコードをホストで実行するか、ターゲットで実行するかを制御します。if 節に渡された値が true と評価された場合、offload プラグマが指定されたコードは利用可能なターゲットで実行されます。if 節に渡された値が false と評価された場合、コードはホストでのみ実行されます。

offload プラグマの直後に _Cilk_for キーワードがあります。このキーワードは、ターゲット向けコードの重要な条件の 1 つを示しています: ターゲットへのオフロードが可能なのは並列ループまたは並列ループの入れ子のみで、これは offload プラグマの直後になければなりません。

デフォルトでは、コンパイラーはホストとターゲットの両方で実行するアプリケーションを生成しますが、同じソースコードを使用してホストでのみ実行するアプリケーションを生成することもできます。

次のステップでは、同じソースコードをコンパイルしてホストでのみ実行するアプリケーションを生成します。

次へ: ホストでのみ実行するソースコードをコンパイルする