DPCT1045
目次
DPCT1045#
メッセージ#
この API では、<行列タイプ> 疎行列タイプの移行のみがサポートされています。ソースコードの調整が必要な場合があります。
詳細な説明#
この警告は、使用中の行列タイプがサポートされていないか、行列タイプを特定できない場合に表示されます。
修正方法の提案#
行列タイプに応じて、対応が異なります。
ルーチンでサポートされる場合: この警告を無視します。
ルーチンでサポートされない場合: スパース 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]
9 void 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]
9 void 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]
20 void 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 }