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