DPCT1003#

メッセージ#

移行された API はエラーコードを返しません。(*, 0) が挿入されます。このコードを書き直す必要があるかもしれません。

詳細な説明#

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

SYCL* では、エラーの報告に例外を使用しており、エラーコードは使用していません。

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

修正方法の提案#

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

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

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

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

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

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

1  void 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 }

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

1  void 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  }