CUDAカーネル内の実行時エラーを引き起こします -- exception フィールド と error-handling フィールド と cuda フィールド と custom-error-handling フィールド 関連 問題

Triggering a runtime error within a CUDA kernel












1
vote

問題

日本語

CUDAでは、例外を捨てることはできません。しかし、私たちは進行できない卓越した状況に達することができ、そして私たちは例外を投げたでしょう。

だから、2番目に最善として、私たちは不当な作業をやめて何かが間違っていることを示すために、少なくともランタイムエラーを引き起こすことができます。

CUDAカーネルでそうするのは良いことです。

  1. 未定義の動作を引き起こさない
  2. 到達したカーネルの実行を停止する
  3. コンパイラの警告/エラー
  4. をトリガーしません

英語

In CUDA, we can't throw exceptions; but - we can and do occasionally reach exceptional situations in which we can't proceed, and on the host we would have thrown an exception.

So, as a second best, we can at least trigger a runtime error to stop doing unreasonable work and indicate that something went wrong.

What's a good to do so in a CUDA kernel, which:

  1. Doesn't cause undefined behavior
  2. Will stop kernel execution once reached
  3. Will not trigger a compiler warning/error

?

</div
           
     
     

回答リスト

5
 
vote
vote
ベストアンサー
 

オプション1アサーション:

現在サポートされているすべてのGPUには、こちら

ドキュメントから直接:

<事前> <コード> #include <assert.h> __global__ void testAssert(void) { int is_one = 1; int should_be_one = 0; // This will have no effect assert(is_one); // This will halt kernel execution assert(should_be_one); } int main(int argc, char* argv[]) { testAssert<<<1,1>>>(); cudaDeviceSynchronize(); return 0; }

実行中にアサーション呼び出しを発行するカーネルによって報告される専用のCUDAランタイムエラー<コード> cudaErrorAssert があります。他のすべてのデバイス側のランタイムエラーに従って、コンテキストはエラーで破棄され、新しいコンテキストを作成する必要があります( cudaDeviceReset() を呼び出して)。

ドライバの制限のため、MacOSではサポートされていない(残念ながら)。

オプション2不正な命令

インラインPTXとASM( "Trap;")を使用して違法な命令。

これはそれを実証するいくつかのコードです:

<事前> <コード> #include <cuda_runtime.h> #include <device_launch_parameters.h> #include <cstdio> #include <cstdlib> __global__ void kernel(int i) { if(i > 0) { asm("trap;"); } ::printf("%d ", i); } inline void error_check(cudaError_t err, const char* file, int line) { if(err != cudaSuccess) { ::fprintf(stderr, "CUDA ERROR at %s[%d] : %s ", file, line, cudaGetErrorString(err)); abort(); } } #define CUDA_CHECK(err) do { error_check(err, __FILE__, __LINE__); } while(0) int main() { kernel<<<1, 1>>>(0); CUDA_CHECK(cudaGetLastError()); CUDA_CHECK(cudaDeviceSynchronize()); kernel<<<1, 1>>>(1); CUDA_CHECK(cudaGetLastError()); CUDA_CHECK(cudaDeviceSynchronize()); }

どの出力:

0

CUDAエラー... Kernel.cu [31]:不正な指示が発生しました

 

Option 1 Assertions:

All presently supported GPUs include an in kernel assertion mechanism, described here.

Directly from the documentation:

#include <assert.h>  __global__ void testAssert(void) {     int is_one = 1;     int should_be_one = 0;      // This will have no effect     assert(is_one);      // This will halt kernel execution     assert(should_be_one); }  int main(int argc, char* argv[]) {     testAssert<<<1,1>>>();     cudaDeviceSynchronize();      return 0; } 

There is a dedicated CUDA runtime error cudaErrorAssert which will be reported by any kernel which fires an assertion call during execution. As per all other device side runtime errors, the context will be destroyed on the error and a new context will need to be created (by calling cudaDeviceReset()).

Note that is (unfortunately) not supported on MacOS because of driver limitations.

Option 2 Illegal Instruction

You can use inline ptx and asm("trap;") to trigger an illegal instruction.

Here is some code demonstrating that:

#include <cuda_runtime.h> #include <device_launch_parameters.h> #include <cstdio> #include <cstdlib>  __global__ void kernel(int i) {     if(i > 0) {         asm("trap;");     }      ::printf("%d ", i); }  inline void error_check(cudaError_t err, const char* file, int line) {     if(err != cudaSuccess) {         ::fprintf(stderr, "CUDA ERROR at %s[%d] : %s ", file, line, cudaGetErrorString(err));         abort();     } } #define CUDA_CHECK(err) do { error_check(err, __FILE__, __LINE__); } while(0)   int main() {     kernel<<<1, 1>>>(0);     CUDA_CHECK(cudaGetLastError());     CUDA_CHECK(cudaDeviceSynchronize());       kernel<<<1, 1>>>(1);     CUDA_CHECK(cudaGetLastError());     CUDA_CHECK(cudaDeviceSynchronize());  } 

which outputs:

0

CUDA ERROR at ...kernel.cu[31] : an illegal instruction was encountered

</div
 
 
 
 

関連する質問

0  カスタム例外を作成することによるRunTimeExceptionの処理  ( Runtimeexception handling by creating custom exception ) 
カスタムRunTimeExceptionクラスは、カスタム例外クラスのインスタンスではありません。しかしRunTimeExceptionは例外のインスタンスです。なぜ??? プロジェクトに2つの例外クラスを作成しました: <事前> <コード> public ...

12  Ajax関数に戻るためにカスタム例外で追加のプロパティを追加する  ( Add extra properties in custom exception to return to ajax function ) 
私は以下のようにカスタム例外クラスを持っています: <事前> <コード> <Serializable> Public Class SamException Inherits Exception Public Sub New() ...

2  404リダイレクトが発生したときに追加のクエリ文字列パラメータを追加する方法  ( How to add additional query string parameters when 404 redirect occurs ) 
現在、Webアプリケーションに404エラーのカスタムエラーページを使用しています。リダイレクトが発生すると、 aspxerrorpath にアクセスしようとしていたパスが含まれています。 global.asax内の Application_Error のエラー...

3  Win2K8 R2 X64のColdFusion 10で404エラーを処理する問題?  ( Problems handling 404 errors in coldfusion 10 on win2k8 r2 x64 ) 
カスタムエラーハンドラ(URLを実行URLを実行)を使用して、Windows 2008 R2 X64では、ColdFusion 10で404エラーを正しく処理しています。問題なく、以前のバージョンのCFでこれをやりました。 IISでは、Webサイトの機能の下で...

1  II7 + Win 2008 R2 + MVC4 +カスタムエラーに関するトラブル  ( Trouble with ii7 win 2008 r2 mvc4 custom error ) 
私は問題を解決する問題を解き、これを再現してみてください: 1) MVCサイト( IIS7 / NOT CASSINI )にある場合は、 "example.com"現在のアドレスをナビゲートしてみてください: "example.com/a/b" 結果:(...

1  System.Diagnostics.Eventing.Readerエラーをキャッチする方法PowerShell  ( How to catch a system diagnostics eventing reader error in powershell ) 
コードは次のように見えます: <事前> <コード> foreach ($machine in $lbx_workstations.SelectedItems) { $temp = (get-winevent -computername ...

7  カスタムエラーハンドラでdebug_backtrace()を使用すると、 "Memory ... Electeded"エラーが発生する方法?  ( How to avoid memory exhausted error when using debug backtrace in custom e ) 
私はこのウェブサイトのためのエラーハンドラをこのようなものです: <事前> <コード> function errorHandler($number, $string, $file, $line, $context, $type = '') { // save ...

0  InfoPathクライアントのWebサービスにカスタムエラーメッセージを表示する  ( Display custom error message in web service for infopath client ) 
私はデータベースにレコードを送信するカスタムWebサービスを持っています、 メイン/ソーステーブルのjf_id値への表参照に送信されるjf_id値。そのため、ユーザーが存在しないJF_IDの送信を試みる場合、SQLの例外は「参照整合性違反など」と言われています...

1173  参照 - このエラーはPHPで何を意味しますか?  ( Reference what does this error mean in php ) 
これは何ですか? これは、PHPをプログラムしている間に遭遇する可能性がある警告、エラー、および通知についての回答の数であり、修正方法はありません。これはコミュニティWikiであるので、誰もがこのリストへの追加と維持に参加して招待されています。 なぜこれは? ...

1  カスタム410エラーハンドラ  ( Custom 410 error handler ) 
共有サーバへのウイルス攻撃がクライアントのウェブサイトへの180のリンクを追加した後、私は手動でそれらを削除する時間を過ごしました、私は一般化された410ハンドラを含めることによって、将来の同様の攻撃を妨げたいと思います。このアプリケーションがそれらを使用して...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有