是否有相当于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); } }