DPCT1000#
メッセージ#
エラーを処理する if-stmt
が検出されましたが、書き換えることができませんでした。詳細は、結果ファイルのコメントを参照してください。
説明#
この警告は、インテル® DPC++ 互換性ツールが安全に削除できない複雑なエラー処理を検出した時に生成されます。
CUDA* API は、プログラムロジックで使用されるエラーコードを返します。SYCL* は例外によりエラーを報告するため、エラーコードを返しません。
元のコードのエラー処理が単純である場合 (エラーメッセージの出力と終了など)、データ並列 C++ (DPC++) (英語) アプリケーションではコードが削除されます。この場合、SYCL* は例外を発生し、例外メッセージを表示して終了します (例外ハンドラーは、インテル® DPC++ 互換性ツールによって自動的に生成されます)。
修正方法の提案#
エラーを処理する if-
文を確認して、代わりに例外ハンドラーを使うように書き換えます。
例えば、以下のオリジナル CUDA* コードについて考えてみます。
1void check_err(cudaError_t err, float **f) {
2 if (err != cudaSuccess) {
3 log_error();
4 }
5}
6
7void foo() {
8 float *f;
9 cudaError_t err = cudaMalloc(&f, 4);
10 check_err(err, &f);
11}
このコードは、以下の SYCL* コードに移行されます。
1void check_err(int err, float **f) {
2 /*
3 DPCT1000:1: Error handling if-stmt was detected but could not be rewritten.
4 */
5 if (err != 0) {
6 /*
7 DPCT1001:0: The statement could not be removed.
8 */
9 log_error();
10 }
11}
12
13void foo()
14 float *f;
15 ...
16 int err = (f = (float *)sycl::malloc_device(4, dpct::get_default_queue()), 0);
17 check_err(err, &f);
18}
このコードは次のように書き換えられます。
1void foo()
2 float *f;
3 try { 4 f = (float *)sycl::malloc_device(4, dpct::get_default_queue());
5 } catch (sycl::exception const &e) {
6 log_error();
7 }
8}