DPCT1000
目次
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 }