是否有相当于perror()的CUDA?

时间:2013-04-29 15:09:29

标签: c error-handling cuda runtime-error

是否有CUDA函数用于打印调用者提供的错误消息,以及描述当前cudaStatus(或调用者提供的cudaStatus)的错误消息,a-la - perror()

1 个答案:

答案 0 :(得分:3)

我认为没有内置的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);
        }
}