5

フォローアップ: CUDA: 他のすべてのスレッドを停止する

「悪い状態」が発生した場合にカーネルを終了する方法を探しています。プログラムのマニュアルによると、NVCC は例外処理をサポートしていません。ユーザー定義の cuda-error-code があるかどうか疑問に思っています。つまり、「悪い」場合は、このユーザー エラー コードで終了します。あるとは思えないので、私の他の考えは、それを引き起こすことです。

「悪い」ことが起こったら、ゼロで割ります。しかし、1 つのスレッドがゼロ除算を行うかどうかはわかりません。カーネル全体をクラッシュさせるのに十分なのか、それともそのスレッドだけをクラッシュさせるのに十分なのでしょうか?

カーネルを終了するためのより良い方法はありますか?

4

2 に答える 2

7

最初に、この質問と、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() を使用して、デバッグ ビルドのエラーで終了できます。これがあなたが望むものかどうかは不明でした。

于 2012-09-21T02:39:07.427 に答える
1

アサーションはあなたを助けるかもしれません。CUDA C Programming Guide の B.15 にあります。

于 2012-09-21T07:53:41.940 に答える