【发布时间】:2023-04-04 07:54:01
【问题描述】:
是否有一个 CUDA 函数用于打印调用者提供的错误消息和描述当前 cudaStatus(或调用者提供的 cudaStatus)的错误消息 a-la-perror()?
【问题讨论】:
标签: c error-handling cuda runtime-error
是否有一个 CUDA 函数用于打印调用者提供的错误消息和描述当前 cudaStatus(或调用者提供的 cudaStatus)的错误消息 a-la-perror()?
【问题讨论】:
标签: c error-handling cuda runtime-error
我认为没有内置的 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<<<blocks, threads>>>(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
您可能也有兴趣讨论错误处理here。
回答下面的一个问题,你可以很容易地制作一个函数调用版本:
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);
}
}
【讨论】: