DPCT1003#

メッセージ#

移行された API はエラーコードを返しません。(*, 0) が挿入されます。コードを修正する必要があります。

説明#

通常、これは CUDA* API がエラーコードを返し、それがプログラムロジックで使用されるために起こります。

SYCL* は例外によりエラーを報告するため、エラーコードを返しません。

インテル® DPC++ 互換性ツールは、(*, 0) オペレーターを挿入して生成されるアプリケーションがコンパイルできるようにします。このオペレーターは 0 を返し、プログラムロジックが期待する戻り値を新しい API が返されない場合に挿入されます。そのような場所は、プログラマーがすべてのコードを確認する必要があります。

修正方法の提案#

DPC++ アプリケーションで次の操作を行います。

  • エラーコードを使用するコードが不要な場合、そのコードと (*, 0) オペレーターを削除します。

  • エラーコードを使用するコードが必要な場合、そのコードを例外処理コードに置き換えて、例外ハンドラーで独自のロジックを使用します。

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

1void foo() { 
2 cudaError_t err; 
3 float *f; 
4 err = cudaMalloc(&f, 4); 
5 err = cudaFree(f); 
6}

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

1void foo() 
2 dpct::device_ext &dev_ct1 = dpct::get_current_device(); 
3 sycl::queue &q_ct1 = dev_ct1.default_queue(); 
4 int err; 
5 float *f; 
6 /* 
7 DPCT1003:0: Migrated API does not return error code. (*, 0) is inserted. You 8 may need to rewrite this code. 9 */ 
10 err = (f = (float *)sycl::malloc_device(4, q_ct1), 0); 
11 /* 
12 DPCT1003:1: Migrated API does not return error code.(*, 0) is inserted.You 13 may need to rewrite this code.14 */ 
15 err = (sycl::free(f, q_ct1), 0); 
16}

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

1void foo() 
2 dpct::device_ext &dev_ct1 = dpct::get_current_device(); 
3 sycl::queue &q_ct1 = dev_ct1.default_queue(); 
4 
5 float *f; 
6 f = (float *)sycl::malloc_device(4, q_ct1); 
7 sycl::free(f, q_ct1); 
8}