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 }