是否有相当于perror()的CUDA?
是否有CUDA函数用于打印调用者提供的错误消息,以及描述当前cudaStatus(或调用者提供的cudaStatus)的错误消息,a-la- perror() ?
我不认为有这样的内置cuda API函数。
这个宏将执行您所描述的内容:
#define cudaCheckErrors(msg) \ do { \ cudaError_t __err = cudaGetLastError(); \ if (__err != cudaSuccess) { \ fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \ msg, cudaGetErrorString(__err), \ __FILE__, __LINE__); \ fprintf(stderr, "*** FAILED - ABORTING\n"); \ exit(1); \ } \ } while (0)
使用上面的宏只是在任何cuda API调用或任何cuda内核调用之后插入它。 建议在每次 cuda API调用和内核调用后插入它,例如:
cudaMemcpy(d_A, A, sizeof(A), cudaMemcpyHostToDevice); cudaCheckErrors("cudaMemcpy fail"); my_kernel<<>>(d_A); cudaCheckErrors("kernel launch fail"); cudaDeviceSynchronize(); cudaCheckErrors("cudaDeviceSynchronize fail");
它打印用户定义的消息( msg
)并解码cuda API错误并打印相应的错误字符串消息:
Fatal error: kernel launch fail (invalid configuration argument at t128.cu:44) *** FAILED - ABORTING
您可能还对此处的error handling讨论感兴趣。
在回答下面的问题时,您可以轻松制作函数调用版本:
void cudaCheckErrors(char *msg){ cudaError_t __err = cudaGetLastError(); \ if (__err != cudaSuccess) { fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", msg, cudaGetErrorString(__err), __FILE__, __LINE__); fprintf(stderr, "*** FAILED - ABORTING\n"); exit(1); } }