如何在应用程序结束时获取CUDA运行时错误的摘要

时间:2012-10-29 20:24:12

标签: cuda

我发现每个单独的代码(cudaMalloc,cudaMemCpy,内核代码......)获得cuda状态报告很有用但很无聊。无论如何在代码结束时一次性完成(如果我不关心错误来自哪里)?

1 个答案:

答案 0 :(得分:3)

您可以使用宏来检查错误,因此几乎不需要编写额外的代码。我在下面列出了几个允许你编写CUDA调用的函数,例如:

cudaCheck(cudaMalloc(&my_array, 10));

并且在调用内核之后:

cudaCheckLastError("MyKernel failed");

这种方法的优势在于,您可以获得有关失败的确切信息,并且您的程序不会继续运行。我建议你使用这种方法,因为从长远来看,它可以为你节省大量的工作。

在更多学术笔记中,您可能会使用异步CUDA调用,然后在最后检查错误。所以,例如:

cudaMemcpyAsync(...);

然后,您可以在最后运行cudaDeviceSynchronize();,这将返回发生的最新错误(如果发生任何错误)。

但实际上并不推荐。有关详细信息,请参阅“CUDA C编程指南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);
  }
}