DPCT1038

メッセージ

マクロ引数にカーネル関数名を使用すると、移行の結果が正しくない場合があります。マクロの定義を確認する必要があります。

説明

カーネル関数呼び出しがマクロ定義で使用され、関数名がマクロ引数として渡される場合、ツールは関数パラメーターのタイプを判断できません。これにより、DPC++ コードが正しく生成されない可能性があります。

修正方法の提案

マクロ定義内のカーネル呼び出しを確認して、必要に応じて手動で調整してください。

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

1 __global__ void kernel(int c, int d) {} 
2 
3 void foo() { 
4 #define KERNEL_LAUNCH(NAME, a, b, c, d) NAME<<<a, b, 0>>>(c, d); 
5 KERNEL_LAUNCH(kernel, 3, 2, 1, 0) 
6 }

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


1 void kernel(int c, int d) {} 
2 
3 void foo() { 
4 #define KERNEL_LAUNCH(NAME, a, b, c, d) \ 
5 dpct::get_default_queue().submit([&](sycl::handler &cgh) { \ 
6 auto c_ct0 = c; \ 
7 auto d_ct1 = d; \ 
8 \ 
9 cgh.parallel_for( \ 
10 sycl::nd_range<3>(sycl::range<3>(1, 1, a) * sycl::range<3>(1, 1, b), \ 
11 sycl::range<3>(1, 1, b)), \ 
12 [=](sycl::nd_item<3> item_ct1) { kernel(c_ct0, d_ct1); }); \ 
13 }); 
14 /* 
15 DPCT1038:0: When the kernel function name is used as a macro argument, the 
16 migration result may be incorrect.You need to verify the definition of the 
17 macro.
18 */ 
19 KERNEL_LAUNCH(kernel, 3, 2, 1, 0) 
20 }

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


1 void kernel(int c, int d) {} 
2 
3 void foo() { 
4 #define KERNEL_LAUNCH(NAME, a, b, c, d) \ 
5 dpct::get_default_queue().submit([&](sycl::handler &cgh) { \ 
6 auto c_ct0 = c; \ 
7 auto d_ct1 = d; \ 
8 \ 
9 cgh.parallel_for( \ 
10 sycl::nd_range<3>(sycl::range<3>(1, 1, a) * sycl::range<3>(1, 1, b), \ 
11 sycl::range<3>(1, 1, b)), \ 
12 [=](sycl::nd_item<3> item_ct1) { NAME(c_ct0, d_ct1); }); \
13 }); 
14 KERNEL_LAUNCH(kernel, 3, 2, 1, 0) 
15 }