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}