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 }