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* コードについて考えてみます。

1  void 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* コードに移行されます。

1  void 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 }

このコードは次のように書き換えられます。

1  void 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 }