DPCT1047
目次
DPCT1047#
メッセージ#
<API name> の <parameter name> の意味が <API name> と異なります。移行したコードを確認する必要があります。
詳細な説明#
cuBLAS* と cuSolver* の getrf API では、LU 因数分解は P*A=L*U
として実行され、インテル® oneAPI マス・カーネル・ライブラリー API では A=P*L*U
として実行されます。行列 P の結果は異なる場合があります。
修正方法の提案#
行列 P がライブラリー API でのみ使用されている場合は、この警告を無視します。P が他の方法で使用される場合、P の値を調整する必要があります。
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1 void foo(cublasHandle_t handle, float **a_array, float **b_array, int *p_array,
2 int *info_array) {
3 cublasSgetrfBatched(handle, 2, a_array, 2, p_array, info_array, 1);
4 cublasSgetrsBatched(handle, CUBLAS_OP_N, 2, 2, a_array, 2, p_array, b_array,
5 2, info_array, 1);
6 }
このコードは、以下の SYCL* コードに移行されます。
1 void foo(dpct::queue_ptr handle, float **a_array, float **b_array, int *p_array,
2 int *info_array) {
3 /*
4 DPCT1047:0: The meaning of p_array in the dpct::getrf_batch_wrapper is
5 different from the cublasSgetrfBatched.You may need to check the migrated
6 code.
7 */
8 dpct::getrf_batch_wrapper(*handle, 2, a_array, 2, p_array, info_array, 1);
9 dpct::getrs_batch_wrapper(*handle, oneapi::mkl::transpose::nontrans, 2, 2,
10 const_cast<float const **>(a_array), 2, p_array,
11 b_array, 2, info_array, 1);
12 }
このコードは次のように書き換えられます。
1 void foo(dpct::queue_ptr handle, float **a_array, float **b_array, int *p_array,
2 int *info_array) {
3 // cublas/cusolver API getrs need the output of cublas/cusolver getrf as input.
4 // MKL/dpct helper API getrs need the output of MKL/dpct helper getrf as input.
5 // In this case, matrix P is only used as a temporary data between library API
6 // invocations, so the warning can be ignored.
7 dpct::getrf_batch_wrapper(*handle, 2, a_array, 2, p_array, info_array, 1);
8 dpct::getrs_batch_wrapper(*handle, oneapi::mkl::transpose::nontrans, 2, 2,
9 const_cast<float const **>(a_array), 2, p_array,
10 b_array, 2, info_array, 1);
11 }