21

CUDAカーネルコードのアサーションと同等の手法は何ですか?

CUDA カーネル コードのアサートはないようです。カーネル コードでプログラマーのミスを簡単に見つける方法が必要です。true にする必要がある条件を設定でき、その条件が false の場合にカーネルがエラー メッセージを表示して救済するメカニズム。

4

3 に答える 3

6

cc 2.x以降のデバイスの場合、カーネル内でアサーション、を使用して、ホスト同期関数が呼び出されると、スレッドがstderrにメッセージを送信するようにすることができます。void assert(int expression)expression == 0

その他の場合、またはアサーションを使用できない場合(MacOSなど)、カーネルからホストにエラーメッセージまたはエラーコードを返すことはできません。

代わりに、エラー状態を設定してホストから確認します。各カーネル呼び出しにパラメーターとして渡されるエラー状態を格納するために、デバイスのグローバルメモリまたは(より適切な)マップされたホストメモリを使用します。カーネルでifステートメントを使用し、ステートメントが失敗した場合は、エラーコードを設定して戻ります。カーネル呼び出し後にホストからエラーコードを確認できますが、カーネルの起動後、エラーコードを確認する前に、ホストとデバイスを同期する必要があることに注意してください。これは開発には問題なく機能しますが、本番環境にはあまり機能しないと思います。

デバイスから直接エラーメッセージを印刷することについて

  • 1.x、2.x、および3.0カードでは、エミュレーションモードを使用してエラーメッセージを印刷できます。
  • 3.1フォワード(fermi上)では、明らかに、カーネルでprintfを使用してエラーメッセージを出力できます。すぐに機能するとは限らないようです。例: http: //forums.nvidia.com/index.php?showtopic = 182448
于 2011-02-25T07:13:32.923 に答える
4

アサートは 1 つのスレッドでのみ発生する可能性があることを指摘したいと思いますが、そのスレッドを早期に終了することにした場合、そのスレッドが存在しないと後で他のバグ (およびおそらく他のアサート) が発生する可能性があります。カーネルが完全にクラッシュし、GPU 上のすべての情報が失われる可能性があります。

また、「カーネル呼び出し内でアサートを使用する」で与えられた答えは、アサートが __ global__ 関数で直接使用され、__ device__ 関数内のどこかで深く使用されていない場合にのみ機能します。

私の提案は、アサートが失敗した場合でも、通常どおりコードを続行し、エラー メッセージを残すことです。マップされ固定されたメモリ (ホスト RAM メモリを GPU アドレス空間にマップする) を使用して、エラー コード/メッセージを保存できます。そうすれば、カーネルがクラッシュして GPU がリセットされた場合でも、そのマップされたメモリで貴重な情報を取得できる可能性があります。私が間違っていなければ、マップされた固定メモリは、Compute Capability 1.1 以降のほぼすべてのデバイスでサポートされています。

于 2011-02-26T19:32:09.103 に答える
3

これが役に立つかもしれません:

カーネル呼び出し内で assert を使用する

または、cudaThreadSynchronize() を使用してcudaErrorをキャッチすることもできます。これにより、カーネルがエラーを返す約 40 の理由の 1 つが得られます。ただし、ほとんどの場合、カーネルで if/else コマンドを使用してこれらの条件を確認できます。

于 2011-02-25T07:43:19.510 に答える