DPCT1018

メッセージ

<API name> は移行されましたが、生成されたコードのパフォーマンスは、以下の <reason> により最適ではない可能性があります。

詳細な説明

この警告は、次のケースで表示されます。

  • cublasSetMatrix 関数の移行。インテル® DPC++ 互換性ツールは、cublasSetMatrix をホストからデバイスへのメモリーコピーに置き換えました。cublasSetMatrixrows パラメーターが lda パラメーターよりも小さい場合、生成されたコードは行列で利用可能な実際のデータ (rows*cols) よりも多くのデータ (lda*cols) をコピーします。

    パフォーマンスを向上するには、ldaldb の値を変更することを検討してください。rows パラメーターが lda 以上の場合、このコードには何もする必要はありません。

  • cublasSetVector 関数の移行。インテル® DPC++ 互換性ツールは、cublasSetVector をホストからデバイスへのメモリーコピーに置き換えました。cublasSetVectorincx パラメーターが incy パラメーターと等しく、1 よりも大きい場合、生成されたコードはベクトルで利用可能な実際のデータ (n) よりも多くのデータ (incx*n) をコピーします。パフォーマンスを向上するには、incxincy の値を変更することを検討してください。

修正方法の提案

cublasSetMatrix の rows パラメーターが lda パラメーターよりも小さく、パフォーマンスの問題が見つかった場合、ldaldb の値を変更することを検討してください。

cublasSetVectorincx パラメーターが incy パラメーターと等しく、1 よりも大きく、パフォーマンスの問題が見つかった場合、incxincy の値を変更することを検討してください。

例えば、以下のオリジナル 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}