DPCT1083

メッセージ

移行したコードのローカルメモリーのサイズは、オリジナルコードとは異なる場合があります。移行したコードの割り当てメモリーサイズが正しいことを確認してください。

説明

例えば、sycl::float3float3 のように、移行したコードではオリジナルコードとは異なるサイズになる型があります。移行したコードで、ローカルメモリーの割り当てサイズが正しいかどうかを確認します。

以下の例では、オリジナルコードの float3 を表すため 3*sizeof(float) を使用しています。移行したコードでは、sycl::float3 のサイズが異なるため、割り当てサイズの調整が必要です。

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

1
2
3
4
     _global_ void kernel() {   extern __shared__ float3 shared_memory[]; }

     int main()
     {   size_t shared_size = 3 * sizeof(float);   kernel<<<1, 1, shared_size>>>();  ... }

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
     void kernel(uint8_t *dpct_local)
     {   auto shared_memory = (float3 *)dpct_local; }
     int main() {
       /*
       DPCT1083
       */
       size_t shared_size = 3 * sizeof(float);
       get_default_queue().submit([&](handler &cgh) {
         accessor<...> dpct_local_acc_ct1(range<1>(shared_size), cgh);
         cgh.parallel_for(...,
             [=](nd_item<3> item_ct1) {
             kernel(dpct_local_acc_ct1.get_pointer());         });
       });
       ...
     }

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
     void kernel(uint8_t *dpct_local) {   auto shared_memory = (float3 *)dpct_local; }

     int main() {
       size_t shared_size = 1 * sizeof(float3);
       get_default_queue().submit([&](handler &cgh)
         Unknown macro: {
           accessor<...> dpct_local_acc_ct1(range<1>(shared_size), cgh);    cgh.parallel_for(...,        [=](nd_item<3> item_ct1) {
             kernel(dpct_local_acc_ct1.get_pointer());
           });
         }
       );
       ...
     }

修正方法の提案

ローカルメモリーの割り当てサイズを確認し、必要に応じて正しいサイズに置き換えます。