【问题标题】:Is there a CUDA equivalent of perror()?是否有相当于 perror() 的 CUDA?
【发布时间】:2023-04-04 07:54:01
【问题描述】:

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

【问题讨论】:

    标签: c error-handling cuda runtime-error


    【解决方案1】:

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

    【讨论】:

    • 为什么是宏而不是函数调用?
    • 没有什么特别的原因。您可以轻松地制作它的函数调用版本。我用一个创建为函数而不是宏的示例编辑了答案。
    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 2017-01-08
    • 2010-10-16
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多