0

我发现为每段代码(cudaMalloc、cudaMemCpy、内核代码......)获取 cuda 状态报告很有用但很无聊。有没有办法在代码末尾做一次(如果我不在乎错误来自哪里)?

4

1 回答 1

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);
  }
}
于 2012-10-30T00:31:34.153 回答