0

個々のコード(cudaMalloc、cudaMemCpy、カーネルコード...)ごとにcudaステータスレポートを取得することは便利ですが、退屈であることがわかりました。とにかく、コードの最後で一度だけそれを行うことはありますか(エラーがどこから来ているのか気にしない場合)?

4

1 に答える 1

3

マクロを使用してエラーをチェックできるため、追加のコードを記述する必要はほとんどありません。以下に、次のようなCUDA呼び出しを記述できる関数をいくつか含めました。

cudaCheck(cudaMalloc(&my_array, 10));

そして、カーネルを呼び出した後:

cudaCheckLastError("MyKernel failed");

このアプローチの利点は、何が失敗したかについての情報を正確に取得でき、プログラムが実行を継続しようとしないことです。長期的には多くの作業を節約できるため、この方法を使用することをお勧めします。

もっとアカデミックなメモでは、おそらく非同期CUDA呼び出しを使用して、最後にエラーをチェックすることができます。したがって、たとえば:

cudaMemcpyAsync(...);

次に、最後に実行できますcudaDeviceSynchronize();。これにより、発生した最新のエラー(発生した場合)が返されます。

しかし、それは本当にお勧めできません。詳細については、CUDACプログラミングガイド4.2の3.2.8章「エラーチェック」を参照してください。

エラーをチェックするためのマクロ。エラーが発生した場合、これらはエラーを出力し、プログラムを終了します。

.h:

void __cudaCheck(cudaError err, const char* file, const int line);
#define cudaCheck(err) __cudaCheck (err, __FILE__, __LINE__)

void __cudaCheckLastError(const char* errorMessage, const char* file, const int line);
#define cudaCheckLastError(msg) __cudaCheckLastError (msg, __FILE__, __LINE__)

.cpp:

void __cudaCheck(cudaError err, const char *file, const int line)
{
  if( cudaSuccess != err) {
    fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n",
      file, line, (int)err, cudaGetErrorString( err ) );
    exit(-1);
  }
}

void __cudaCheckLastError(const char *errorMessage, const char *file, const int line)
{
  cudaError_t err = cudaGetLastError();
  if( cudaSuccess != err) {
    fprintf(stderr, "%s(%i) : getLastCudaError() CUDA error : %s : (%d) %s.\n",
      file, line, errorMessage, (int)err, cudaGetErrorString( err ) );
    exit(-1);
  }
}
于 2012-10-30T00:31:34.153 に答える