DPCT1040#

メッセージ#

コードがデバイス上で使用される場合は、printf の代わりに sycl::stream を使用します。

詳細な説明#

オリジナルコードでホストとデバイスで使用される printf 文は、変更されません。DPC++ で出力を作成するには、デバイスでは sycl::stream を、ホストでは printf を使用する必要があります。

修正方法の提案#

  • printf 文がホストでのみ使用されている場合は、コードを変更する必要はありません。

  • printf 文がデバイスでのみ使用されている場合は、printf の代わりに sycl::stream を使用します。

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

1   __host__ __device__ void hd() { 
2     printf("Hello!\n"); 
3   } 
4 
5   __global__ void k() { 
6     hd(); 
7   } 
8 
9   void foo() { 
10    hd(); 
11    k<<<1, 1>>>(); 
12  }

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

1   void hd() { 
2   /* 
3   DPCT1040:0: Use sycl::stream instead of printf if your code is used on the 
4   device.
5   */ 
6     printf("Hello!\n"); 
7   } 
8 
9   void k() { 
10    hd(); 
11  } 
12 
13  void foo() { 
14    hd(); 
15    dpct::get_default_queue().parallel_for( 
16    sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)), 
17      [=](sycl::nd_item<3> item_ct1) { 
18        k(); 
19    }); 
20  }

このコードは次のように書き換えられます。

1   void hd_host() { 
2     printf("Hello!\n"); 
3   } 
4 
5   void hd_device(const sycl::stream &stream) { 
6     stream << "Hello!\n"; 
7   } 
8 
9   void k(const sycl::stream &stream) { 
10    hd_device(stream); 
11  } 
12 
13  void foo() { 
14    hd_host(); 
15    dpct::get_default_queue().submit([&](sycl::handler &cgh) { 
16    sycl::stream stream(64 * 1024 /*totalBufferSize*/, 80 /*workItemBufferSize*/, cgh); 
17 
18    cgh.parallel_for( 
19      sycl::nd_range<3>(sycl::range<3>(1, 1, 1), sycl::range<3>(1, 1, 1)), 
20      [=](sycl::nd_item<3> item_ct1) { 
21        k(stream); 
22      }); 
23    }); 
24  }