DPCT1120
目次
DPCT1120#
メッセージ#
<変数名> はデバイスメモリー内にあり、追加の引数としてデバイス関数に渡されます。ここで <変数名> はテンプレート変数であるため、デバイス関数内の追加パラメーターの宣言、コマンドグループで参照される変数、およびデバイス関数が正しくない可能性があります。ソースコードの調整が必要な場合があります。
詳細な説明#
<変数名> はデバイスメモリー内にあり、追加の引数としてデバイス関数に渡されます。ここで <変数名> はテンプレート変数であるため、デバイス関数内の追加パラメーターの宣言、コマンドグループで参照される変数、およびデバイス関数もテンプレート変数である必要があり、移行結果が正しくない可能性があります。ソースコードの調整が必要な場合があります。
修正方法の提案#
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1 struct Foo {
2 int x;
3 __host__ __device__ Foo() {}
4 __host__ __device__ ~Foo() {}
5 };
6
7 template <typename T> __constant__ T cmem;
8
9 __global__ void kernel() {
10 ...
11 int x = cmem<Foo>.x;
12 ...
13 }
14
15 void foo() {
16 ...
17 kernel<<<1, 1>>>();
18 ...
19}
このコードは、以下の SYCL* コードに移行されます。
1 struct Foo {
2 int x;
3 Foo() {}
4 ~Foo() {}
5 };
6
7 /*
8 DPCT1120:0: cmem is in device memory and passed into device functions as an
9 extra arguments.As cmem is a template variable here, then the declaration of
10 an extra parameter in device functions, the variable referenced in command
11 group, and device functions may be incorrect as a result.You may need to
12 adjust the code.
13 */
14 template <typename T> static dpct::constant_memory<T, 0> cmem;
15
16 void kernel(T cmem) {
17 ...
18 int x = cmem<Foo>.x;
19 ...
20 }
21
22 void foo() {
23 ...
24 cmem.init();
25
26 dpct::get_in_order_queue().submit([&](sycl::handler &cgh) {
27 auto cmem_ptr_ct1 = cmem.get_ptr();
28
29 cgh.parallel_for(
30 sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)),
31 [=](sycl::nd_item<3> item_ct1) {
32 kernel(*cmem_ptr_ct1);
33 });
34 });
35 ...
36 }
上記は次のように書き換える必要があります。
1 struct Foo {
2 int x;
3 Foo() {}
4 ~Foo() {}
5 };
6
7 template <typename T> static dpct::constant_memory<T, 0> cmem;
8
9 template <class T>
10 void kernel(T cmem) {
11 ...
12 int x = cmem.x;
13 ...
14 }
15
16 void foo() {
17 ...
18 cmem<Foo>.init();
19
20 dpct::get_in_order_queue().submit([&](sycl::handler &cgh) {
21 auto cmem_ptr_ct1 = cmem<Foo>.get_ptr();
22
23 cgh.parallel_for(
24 sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)),
25 [=](sycl::nd_item<3> item_ct1) {
26 kernel(*cmem_ptr_ct1);
27 });
28 });
29 ...
30 }