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 }