DPCT1130#
メッセージ#
SYCL* 2020 標準は、動的並列処理 (デバイスコードでのカーネルの起動) をサポートしていません。コードを書き換えてください。
詳細な説明#
SYCL* はデバイスコードでのカーネル起動をサポートしていません。親カーネルと子カーネルをマージする必要があります。
修正方法の提案#
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1 __global__ void childKernel() {
2 ...
3 }
4 __global__ void parentKernel() {
5 ...
6 childKernel<<<4, 4>>>();
7 ...
8 }
9 void foo() {
10 ...
11 parentKernel<<<8, 8>>>();
12 ...
13 }
このコードは、以下の SYCL* コードに移行されます。
1 void childKernel() {
2 ...
3 }
4 void parentKernel() {
5 ...
6 /*
7 DPCT1130:0: SYCL 2020 standard does not support dynamic parallelism (launching
8 kernel in device code). Please rewrite the code.
9 */
10 childKernel<<<4, 4>>>();
11 ...
12 }
13 void foo() {
14 ...
15 dpct::get_in_order_queue().parallel_for(
16 sycl::nd_range<3>(sycl::range<3>(1, 1, 8) * sycl::range<3>(1, 1, 8),
17 sycl::range<3>(1, 1, 8)),
18 [=](sycl::nd_item<3> item_ct1) {
19 parentKernel();
20 });
21 ...
22 }
このコードは次のように書き換えられます。
1 void childKernel() {
2 ...
3 }
4 void parentKernel() {
5 ...
6 childKernel(); // childKernel() をデバイス関数として呼び出し、ワークを調整する必要があります
7 for each work item.
8 ...
9 }
10 void foo() {
11 ...
12 dpct::get_in_order_queue().parallel_for(
13 sycl::nd_range<3>(sycl::range<3>(1, 1, placeholder /* スレッドモデルに基づいて、
14 親カーネルと子カーネル間のグローバル範囲を調整します */),
15 sycl::range<3>(1, 1, placeholder /* スレッドモデルに基づいて、
16 親カーネルと子カーネル間のローカル範囲を
17 調整します */)),
18 [=](sycl::nd_item<3> item_ct1) {
19 parentKernel();
20 });
21 ...
22 }