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