DPCT1040
目次
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 }