DPCT1000#

メッセージ#

エラーを処理する if-stmt が検出されましたが、書き換えることができませんでした。詳細は、結果ファイルのコメントを参照してください。

詳細な説明#

この警告は、インテル® DPC++ 互換性ツールが安全に削除できない複雑なエラー処理を検出した時に生成されます。

CUDA* API は、プログラムロジックで使用されるエラーコードを返します。SYCL* では、エラーの報告に例外を使用しており、エラーコードは使用していません。

元のコードのエラー処理が単純である場合 (エラーメッセージの出力と終了など) 、データ並列 C++ (DPC++) アプリケーションではコードが削除されます。この場合、SYCL* は例外を発生し、例外メッセージを表示して終了します (例外ハンドラーは、インテル® DPC++ 互換性ツールによって自動的に生成されます)。

修正方法の提案#

エラーを処理する if- 文を確認して、代わりに例外ハンドラーを使うように書き換えます。

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

1  void check_err(cudaError_t err, float **f) { 
2   if (err != cudaSuccess) { 
3   log_error(); 
4   } 
5  } 
6 
7  void foo() { 
8   float *f; 
9   cudaError_t err = cudaMalloc(&f, 4); 
10  check_err(err, &f); 
11 }

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

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

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

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