最初に、この質問と、harrism と tera による回答(昨日の質問/回答)を読む必要があります。
次のようなものを使用したくなるかもしれません
if (there_is_an_error) {
*status = MY_ERROR_CODE; // store to device pointer
__threadfence(); // ensure store issued before trap
asm("trap;"); // kill kernel with error
}
私の意見では、これは「優雅」という条件を正確には満たしていません。トラップにより、カーネルが終了し、ランタイムが報告しcudaErrorUnknown
ます。ただし、カーネルの実行は非同期であるため、このエラーをキャッチするには、ストリーム/デバイスを同期する必要があります。これは、不正確なエラーが発生しても問題ない場合を除き、すべてのカーネル呼び出しの後に同期することを意味します (つまり、後でエラー コードをキャッチしない場合があります)。後続の CUDA API 呼び出しへの呼び出し)。
しかし、これはまさに CUDA におけるカーネル エラー処理の方法であり、適切に記述されたコードはデバッグ ビルドで同期してカーネル エラーをチェックし、リリース ビルドで不正確なエラー メッセージを解決する必要があります。残念ながら、それ以上に優雅な方法はないと思います。
編集: Compute 機能 2.0 以降では、 assert() を使用して、デバッグ ビルドのエラーで終了できます。これがあなたが望むものかどうかは不明でした。