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}