我发现为每段代码(cudaMalloc、cudaMemCpy、内核代码......)获取 cuda 状态报告很有用但很无聊。有没有办法在代码末尾做一次(如果我不在乎错误来自哪里)?
问问题
1054 次
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 回答