問題: バッファーを初期化するためホストポインターへの const 参照

アプリケーションを C++ から SYCL* に移行する場合、この問題が暗黙的に存在する可能性があります。関数に引数を私規則は、C++ で定義されています。関数に読み取り専用のパラメーターが必要である場合、それらは const 参照として送信されますが、読み取り/書き込みが必要なパラメーターには const は含まれません。アルゴリズムがバッファーを構築する際に const 参照を使用すると、SYCL* アルゴリズムでは2次的な問題が生じます。データを使用するために必要なアクセサーのタイプは、バッファーの構築時には不明であるため、インテル® oneAPI DPC++/C++ コンパイラーは保守的にバッファーの作成中に const 参照のコピーを作成します。大きな配列では発生するコストは小さくはありません。すべてのデータが共有メモリーを介して通信され、データポインターをホストポインターにコピーする必要がないため、この問題は CPU デバイスのみに影響します。

va_const.cpp の例はこの問題を示しており、確認すべきアプリケーションのバッファーコピーが分かります。

このコピーを排除するには、次に示すようにコードを変更する必要があります。

// 古いコード: // 関数プロトタイプは、読み取り専用バッファーに const として渡されます。
// これは C++ で推奨される実用的な方法です。 
// 
// void vec_add(queue &q, const float A[], const float B[], ...){ 

void vec_add(queue &q, float A[], float B[], float C[],
             const int size) {
  ...
}

C++ で推奨される方法は、読み取り専用パラメーターを const 値として渡すことです。しかし、これによりインテル® oneAPI DPC++/C++ コンパイラーは保守的となり、コピーを作成します。C++ コードを SYCL* に移行する場合、静的規則チェックによりそのようなアプリケーションの問題を特定できます。