0
我发现获取每个单独代码片段(cudaMalloc,cudaMemCpy,内核代码...)的cuda状态报告是有用但无聊的。无论如何只要在代码结束时做一次(如果我不在乎错误来自何处)?如何获得应用程序结束时的CUDA运行时错误摘要
我发现获取每个单独代码片段(cudaMalloc,cudaMemCpy,内核代码...)的cuda状态报告是有用但无聊的。无论如何只要在代码结束时做一次(如果我不在乎错误来自何处)?如何获得应用程序结束时的CUDA运行时错误摘要
您可以使用宏来检查错误,因此几乎不需要额外的代码来编写。我已经包括了几个低于功能允许您编写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);
}
}