DPCT1084#

メッセージ#

<function name> 関数呼び出しには、統一できなかった異なるテンプレート・インスタンスの複数の移行結果があります。コードを調整する必要があります。

詳細な説明#

インテル® DPC++ 互換性ツールは、コードを正しく移行できませんでした。コードを手動で変更してください。

以下の例では、オリジナルコード、移行したコード、移行したコードを修正するために行った手動の変更を示します。

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


1   __constant__ int4 example_i[32]; 
2   __constant__ float4 example_f[32]; 
3 
4   struct example_int { 
5    __device__ int4 foo(int idx) const { return example_i[idx]; } 
6   }; 
7 
8   struct example_float { 
9    __device__ float4 foo(int idx) const { return example_f[idx]; } 
10  }; 
11 
12  template <typename T> __global__ void example_kernel() { 
13   T example_v; 
14   int idx = blockIdx.x * blockDim.x + threadIdx.x; 
15   float j = example_v.foo(idx).x; 
16  } 
17 
18  void foo() { 
19   example_kernel<example_int><<<1, 1>>>(); 
20   example_kernel<example_float><<<1, 1>>>(); 
21  }

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


1   static dpct::constant_memory<sycl::int4, 1> example_i(32); 
2   static dpct::constant_memory<sycl::float4, 1> example_f(32); 
3 
4   struct example_int { 
5    sycl::int4 foo(int idx, sycl::int4 const *example_i) const { 
6    return example_i[idx]; 
7    } 
8   }; 
9 
10  struct example_float { 
11   sycl::float4 foo(int idx, sycl::float4 const *example_f) const { 
12   return example_f[idx]; 
13   } 
14  }; 
15 
16  template <typename T> void example_kernel(const sycl::nd_item<3> &item_ct1, 
17   sycl::float4 const *example_f) { 
18   T example_v; 
19   int idx = item_ct1.get_group(2) * item_ct1.get_local_range(2) + 
20   item_ct1.get_local_id(2); 
21   /* 
22   DPCT1084:0: The function call "example_int::foo" has multiple migration 
23   results in different template instantiations that could not be unified.You 
24   may need to adjust the code.
25   */ 
26   float j = example_v.foo(idx).x(); 
27  } 
28 
29  void foo() { 
30   dpct::device_ext &dev_ct1 = dpct::get_current_device(); 
31   sycl::queue &q_ct1 = dev_ct1.in_order_queue(); 
32   q_ct1.submit([&](sycl::handler &cgh) { 
33   example_f.init(); 
34 
35   auto example_f_ptr_ct1 = example_f.get_ptr(); 
36 
37   cgh.parallel_for( 
38   sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)), 
39   [=](sycl::nd_item<3> item_ct1) { 
40   example_kernel<example_int>(item_ct1, example_f_ptr_ct1); 
41   }); 
42   }); 
43   q_ct1.submit([&](sycl::handler &cgh) { 
44   example_f.init(); 
45 
46   auto example_f_ptr_ct1 = example_f.get_ptr(); 
47 
48   cgh.parallel_for( 
49   sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)), 
50   [=](sycl::nd_item<3> item_ct1) { 
51   example_kernel<example_float>(item_ct1, example_f_ptr_ct1); 
52   }); 
53   }); 
54  }

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


1   static dpct::constant_memory<sycl::int4, 1> example_i(32); 
2   static dpct::constant_memory<sycl::float4, 1> example_f(32); 
3 
4   struct example_int { 
5    typedef sycl::int4 data_type; 
6    sycl::int4 foo(int idx, sycl::int4 const *example_i) const { 
7    return example_i[idx]; 
8    } 
9   }; 
10 
11  struct example_float { 
12   typedef sycl::float4 data_type; 
13   sycl::float4 foo(int idx, sycl::float4 const *example_f) const { 
14   return example_f[idx]; 
15   } 
16  }; 
17 
18  template <typename T> void example_kernel(const sycl::nd_item<3> &item_ct1, 
19   typename T::data_type const *example) { 
20   T example_v; 
21   int idx = item_ct1.get_group(2) * item_ct1.get_local_range(2) + 
22   item_ct1.get_local_id(2); 
23   float j = example_v.foo(idx, example).x(); 
24  } 
25 
26  void foo() { 
27   dpct::device_ext &dev_ct1 = dpct::get_current_device(); 
28   sycl::queue &q_ct1 = dev_ct1.in_order_queue(); 
29   q_ct1.submit([&](sycl::handler &cgh) { 
30   example_i.init(); 
31 
32   auto example_i_ptr_ct1 = example_i.get_ptr(); 
33 
34   cgh.parallel_for( 
35   sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)), 
36   [=](sycl::nd_item<3> item_ct1) { 
37   example_kernel<example_int>(item_ct1, example_i_ptr_ct1); 
38   }); 
39   }); 
40   q_ct1.submit([&](sycl::handler &cgh) { 
41   example_f.init(); 
42  
43   auto example_f_ptr_ct1 = example_f.get_ptr(); 
44 
45   cgh.parallel_for( 
46   sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)), 
47   [=](sycl::nd_item<3> item_ct1) { 
48   example_kernel<example_float>(item_ct1, example_f_ptr_ct1); 
49   }); 
50   }); 
51  }

修正方法の提案#

コードを手動で調整する必要があります。