DPCT1088#

メッセージ#

マクロ定義には、統一できなかったフリークエリー関数の次元の複数の移行結果があります。コードを変更する必要があります。

詳細な説明#

インテル® DPC++ 互換性ツールは、コードを正しく移行できませんでした。手動でコードを変更する必要があります。

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

1   namespace cg = cooperative_groups; 
2 
3   #define TB(b) cg::thread_block b = cg::this_thread_block(); 
4 
5   __global__ void test1() { 
6     TB(b); 
7   } 
8 
9   __global__ void test2() { 
10    TB(b); 
11  } 
12 
13  void foo() { 
14    test1<<<dim3(2, 2, 2), dim3(2, 2, 2)>>>(); 
15    test2<<<2, 2>>>(); 
16  }

--assume-nd-range-dim=1 および --use-experimental-features=free-function-queries オプションを指定して移行すると、次のような SYCL* コードが生成されます。

1   /* 
2   DPCT1088:0: The macro definition has multiple migration results in the dimension 
3   of free queries function that could not be unified.You may need to modify the 
4   code.
5   */ 
6   #define TB(b) \ 
7   auto b = sycl::ext::oneapi::experimental::this_group< \ 
8   dpct_placeholder /* Fix the dimension manually */>(); 
9 
10  void test1() { 
11    TB(b); 
12  } 
13 
14  void test2() { 
15    TB(b); 
16  } 
17 
18  void foo() { 
19    sycl::device dev_ct1; 
20    sycl::queue q_ct1(dev_ct1, 
21      sycl::property_list{sycl::property::queue::in_order()}); 
22    q_ct1.parallel_for( 
23      sycl::nd_range<3>(sycl::range<3>(2, 2, 2) * sycl::range<3>(2, 2, 2), 
24      sycl::range<3>(2, 2, 2)), 
25      [=](sycl::nd_item<3> item_ct1) { 
26      test1(); 
27    }); 
28    q_ct1.parallel_for(sycl::nd_range<1>(sycl::range<1>(2) * sycl::range<1>(2), 
29      sycl::range<1>(2)), 
30      [=](sycl::nd_item<1> item_ct1) { 
31      test2(); 
32    }); 
33  }

このコードを以下のように手動で調整します。

1   #define TB(b, d) \ 
2   auto b = sycl::ext::oneapi::experimental::this_group<d>(); 
3 
4   void test1() { 
5     TB(b, 3); 
6   } 
7 
8   void test2() { 
9     TB(b, 1); 
10  } 
11 
12  void foo() { 
13    sycl::device dev_ct1; 
14    sycl::queue q_ct1(dev_ct1, 
15    sycl::property_list{sycl::property::queue::in_order()}); 
16    q_ct1.parallel_for( 
17      sycl::nd_range<3>(sycl::range<3>(2, 2, 2) * sycl::range<3>(2, 2, 2), 
18      sycl::range<3>(2, 2, 2)), 
19      [=](sycl::nd_item<3> item_ct1) { 
20      test1(); 
21    }); 
22    q_ct1.parallel_for(sycl::nd_range<1>(sycl::range<1>(2) * sycl::range<1>(2), 
23      sycl::range<1>(2)), 
24      [=](sycl::nd_item<1> item_ct1) { 
25      test2(); 
26    }); 
27  }

修正方法の提案#

このコードを手動で書き換えてください。