DPCT1045

メッセージ

この API では、<matrix type> 疎行列タイプの移行のみがサポートされています。コードを調整する必要があります。

詳細な説明

この警告は、使用中の行列タイプがサポートされていないか、行列タイプを特定できない場合に表示されます。

修正方法の提案

行列タイプに応じて、対応が異なります。

  • ルーチンでサポートされる場合: この警告を無視します。

  • ルーチンでサポートされない場合: スパース BLAS ルーチン (英語) に従ってコードを手動で修正します。

例えば、以下のオリジナル CUDA* コードについて考えてみます。


1// -- -- 
2// | 1 0 2 | 
3// A = | 0 3 4 | 
4// | 0 0 5 | 
5// -- -- 
6// a_val = [1, 2, 3, 4, 5] 
7// a_row_ptr = [0, 2, 4, 5] 
8// a_col_ind = [0, 2, 1, 2, 2] 
9void test_cusparseTcsrmm(cusparseHandle_t handle, cusparseMatDescr_t descrA, 
10 float alpha, float beta, float *b, float *c) { 
11 // malloc and set value 
12 float *a_val = my_malloc<float>(); 
13 int *a_row_ptr = my_malloc<int>(); 
14 int *a_col_ind = my_malloc<int>(); 
15 set_value(a_val); 
16 set_value(a_row_ptr); 
17 set_value(a_col_ind); 
18 
19 // calculate 
20 cusparseSetMatType(descrA, CUSPARSE_MATRIX_TYPE_SYMMETRIC); 
21 cusparseScsrmm(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, 4, 2, 5, 9, &alpha, 
22 descrA, a_val, a_row_ptr, a_col_ind, &beta, 5, b, c, 4); 
23 
24 // synchronize and check value 
25   ...
26 // free 
27 my_free(a_val); 
28 my_free(a_row_ptr); 
29 my_free(a_col_ind); 
30}

このコードは、以下の SYCL* コードに移行されます。

1// -- -- 
2// | 1 0 2 | 
3// A = | 0 3 4 | 
4// | 0 0 5 | 
5// -- -- 
6// a_val = [1, 2, 3, 4, 5] 
7// a_row_ptr = [0, 2, 4, 5] 
8// a_col_ind = [0, 2, 1, 2, 2] 
9void test_cusparseTcsrmm(sycl::queue *handle, 
10 std::shared_ptr<dpct::sparse::matrix_info> descrA, 
11 float alpha, float beta, float *b, float *c) { 
12 // malloc and set value 
13 float *a_val = my_malloc<float>(); 
14 int *a_row_ptr = my_malloc<int>(); 
15 int *a_col_ind = my_malloc<int>(); 
16 set_value(a_val); 
17 set_value(a_row_ptr); 
18 set_value(a_col_ind); 
19 
20 // calculate 
21 descrA->set_matrix_type(dpct::sparse::matrix_info::matrix_type::sy); 
22 /* 
23 DPCT1045:0: Migration is only supported for this API for the general sparse 
24 matrix type. You may need to adjust the code. 
25 */ 
26 dpct::sparse::csrmm(*handle, oneapi::mkl::transpose::nontrans, 4, 2, 5, 
27 &alpha, descrA, a_val, a_row_ptr, a_col_ind, &beta, 5, b, 
28 c, 4); 
29 
30 // synchronize and check value 
31 ... 
32 // free 
33 my_free(a_val); 
34 my_free(a_row_ptr); 
35 my_free(a_col_ind); 
36}

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

1// -- -- 
2// | 1 0 2 | 
3// A = | 0 3 4 | 
4// | 0 0 5 | 
5// -- -- 
6// a_val = [1, 2, 3, 4, 5] 
7// a_row_ptr = [0, 2, 4, 5] 
8// a_col_ind = [0, 2, 1, 2, 2] 
9// 
10// Original matrix A is a symmetric matrix. Only upper/lower data is used. 
11// To make it to be a general matrix, all data in the matrix need to be filled. 
12// -- -- 
13// | 1 0 2 | 
14// new_A = | 0 3 4 | 
15// | 2 4 5 | 
16// -- -- 
17// new_a_val = [1, 2, 3, 4, 2, 4, 5] 
18// new_a_row_ptr = [0, 2, 4, 7] 
19// new_a_col_ind = [0, 2, 1, 2, 0, 1, 2] 
20void test_cusparseTcsrmm(sycl::queue *handle, 
21 std::shared_ptr<dpct::sparse::matrix_info> descrA, 
22 float alpha, float beta, float *b, float *c) { 
23 // malloc and set value 
24 float *a_val = my_malloc<float>(); 
25 int *a_row_ptr = my_malloc<int>(); 
26 int *a_col_ind = my_malloc<int>(); 
27 set_value(a_val); 
28 set_value(a_row_ptr); 
29 set_value(a_col_ind); 
30 
31 float *new_a_val = my_malloc<float>(); 
32 int *new_a_row_ptr = my_malloc<int>(); 
33 int *new_a_col_ind = my_malloc<int>(); 
34 
35 // convert matrix data from symmetric format to general format 
36 std::tie(new_a_val, new_a_row_ptr, new_a_col_ind) = 
37 symmetric_to_general(a_val, a_row_ptr, a_col_ind); 
38 
39 my_free(a_val); 
40 my_free(a_row_ptr); 
41 my_free(a_col_ind); 
42 
43 // calculate 
44 descrA->set_matrix_type(dpct::sparse::matrix_info::matrix_type::ge); 
45 dpct::sparse::csrmm(*handle, oneapi::mkl::transpose::nontrans, 4, 2, 5, 
46 &alpha, descrA, new_a_val, new_a_row_ptr, 
47 new_a_col_ind, &beta, 5, b, c, 4); 
48 
49 // synchronize and check value 
50    ... 
51 // free 
52 my_free(new_a_val); 
53 my_free(new_a_row_ptr); 
54 my_free(new_a_col_ind); 
55}