DPCT1018#
メッセージ#
<API name> は移行されましたが、生成されたコードのパフォーマンスは、以下の <reason> により最適ではない可能性があります。
説明#
この警告は、次のケースで表示されます。
cublasSetMatrix
関数の移行。インテル® DPC++ 互換性ツールは、cublasSetMatrix
をホストからデバイスへのメモリーコピーに置き換えました。cublasSetMatrix
のrows
パラメーターがlda
パラメーターよりも小さい場合、生成されたコードは行列で利用可能な実際のデータ (rows*cols
) よりも多くのデータ (lda*cols
) をコピーします。パフォーマンスを向上するには、
lda
とldb
の値を変更することを検討してください。rows パラメーターがlda
以上の場合、このコードには何もする必要はありません。cublasSetVector
関数の移行。インテル® DPC++ 互換性ツールは、cublasSetVector
をホストからデバイスへのメモリーコピーに置き換えました。cublasSetVector
のincx
パラメーターがincy
パラメーターと等しく、1 よりも大きい場合、生成されたコードはベクトルで利用可能な実際のデータ (n
) よりも多くのデータ (incx*n
) をコピーします。パフォーマンスを向上するには、incx
とincy
の値を変更することを検討してください。
修正方法の提案#
cublasSetMatrix
の rows パラメーターが lda
パラメーターよりも小さく、パフォーマンスの問題が見つかった場合、lda
と ldb
の値を変更することを検討してください。
cublasSetVector
の incx
パラメーターが incy
パラメーターと等しく、1 よりも大きく、パフォーマンスの問題が見つかった場合、incx
と incy
の値を変更することを検討してください。
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1void foo() {
2 const int element_num = 128;
3 const int h_inc = 128;
4 const int d_inc = 128;
5 cublasSetVector(element_num, sizeof(float), data, h_inc, d_data, d_inc);
6}
このコードは、以下の SYCL* コードに移行されます。
1void foo() {
2 const int element_num = 128;
3 const int h_inc = 128;
4 const int d_inc = 128;
5 /*
6 DPCT1018:0: The cublasSetVector was migrated, but due to parameter h_inc
7 equals to parameter d_inc but greater than 1, the generated code performance
8 may be sub-optimal.
9 */
10 dpct::matrix_mem_copy((void *)d_data, (void *)data, d_inc, h_inc, 1,
11 element_num, sizeof(float));
12}
このコードは次のように書き換えられます。
1void foo() {
2 const int element_num = 128;
3
4 //Save the data in d_data continuously and change h_inc and d_inc from 128 to 1.
5 const int h_inc = 1;
6 const int d_inc = 1;
7
8 // Now there is no padding between each element, so memcpy can be used directly.
9 dpct::get_default_queue().memcpy(d_data, data, sizeof(float) * element_num).wait();
10}