gpt4 book ai didi

cuda - CUFFT 错误处理

转载 作者:行者123 更新时间:2023-12-05 00:33:21 30 4
gpt4 key购买 nike

我正在使用以下宏进行 CUFFT 错误处理:

#define cufftSafeCall(err)      __cufftSafeCall(err, __FILE__, __LINE__)
inline void __cufftSafeCall(cufftResult err, const char *file, const int line)
{
if( CUFFT_SUCCESS != err) {
fprintf(stderr, "cufftSafeCall() CUFFT error in file <%s>, line %i.\n",
file, line);
getch(); exit(-1);
}
}

此宏不会从错误代码中返回消息字符串。 《CUDA Programming: a developer's guide to parallel computing with GPUs》一书建议使用以下宏
#define CUDA_CALL(call) { const cudaError_t err = (call); \
if(err != cudaSuccess) \
{ \
fprintf(stderr, "CUDA error in file '%s', line %d\n %s\nerror %d: %s\nterminating!\n",__FILE__, __LINE__,err, \
cudaGetErrorString(err)); \
cudaDeviceReset(); assert(0); \
} }

(注意:它在没有改变功能的情况下进行了一些定制)。这本书说:“这种技术适用于所有 CUDA 调用,除了内核调用。”但是,当使用 CUDA_CALL在 CUFFT 例程调用中,编译器返回
a value of type "cufftResult" cannot be used to initialize an entity of type "const cudaError_t". 

看来 cufftResultcudaError_t不立即兼容。

进一步调查,来自 NVIDIA CUDA Library链接,好像是 cudaGetErrorString需要 cudaError_t输入类型。

我的问题如下:
  • 有没有办法制作cufftResultcudaError_t兼容,以便我可以使用CUDA_CALL在 CUFFT 例程上并从错误代码中接收消息字符串?
  • 为 CUFFT 库实现不同的错误是否有任何技术原因? :-)

  • 谢谢。

    按照 ROBERT CROVELLA 的回答进行编辑

    我已将 CufftSafeCall 例程修改为
    inline void __cufftSafeCall(cufftResult err, const char *file, const int line)
    {
    if( CUFFT_SUCCESS != err) {
    fprintf(stderr, "CUFFT error in file '%s', line %d\n %s\nerror %d: %s\nterminating!\n",__FILE__, __LINE__,err, \
    _cudaGetErrorEnum(err)); \
    cudaDeviceReset(); assert(0); \
    }

    }

    也返回错误类型字符串。

    最佳答案

    cufft 不是 cuda 运行时 api 的一部分。 cufft 是一个独立的函数库。因为它是独立的,所以不要让 cufft 错误枚举依赖于 cuda 运行时 api 库是有意义的;这种联系阻碍了模块、代码和库的独立开发。

    所以当书中提到 CUDA 调用时,他们指的是 cuda 运行时 api,而不是 cufft 库 api。

    由于枚举值returned from cufft库调用独立于(并且大部分正交于)枚举值 returned from the cuda runtime api,我认为不可能以任何直接的方式在一个宏中协调这两个集合。而且由于 cuda 调用和 cufft 调用可能混合在任何代码中,我想不出一种环境方法来做到这一点。然而,其他人可能会想出一个聪明的方法。

    如果你想要一个 cufft 错误枚举到字符串解析器,/usr/local/cuda/samples/common/inc/helper_cuda.h 中有一个(假设安装了标准的 linux CUDA 5)可能感兴趣。为方便起见,将其粘贴在这里:

    #ifdef _CUFFT_H_
    // cuFFT API errors
    static const char *_cudaGetErrorEnum(cufftResult error)
    {
    switch (error)
    {
    case CUFFT_SUCCESS:
    return "CUFFT_SUCCESS";

    case CUFFT_INVALID_PLAN:
    return "CUFFT_INVALID_PLAN";

    case CUFFT_ALLOC_FAILED:
    return "CUFFT_ALLOC_FAILED";

    case CUFFT_INVALID_TYPE:
    return "CUFFT_INVALID_TYPE";

    case CUFFT_INVALID_VALUE:
    return "CUFFT_INVALID_VALUE";

    case CUFFT_INTERNAL_ERROR:
    return "CUFFT_INTERNAL_ERROR";

    case CUFFT_EXEC_FAILED:
    return "CUFFT_EXEC_FAILED";

    case CUFFT_SETUP_FAILED:
    return "CUFFT_SETUP_FAILED";

    case CUFFT_INVALID_SIZE:
    return "CUFFT_INVALID_SIZE";

    case CUFFT_UNALIGNED_DATA:
    return "CUFFT_UNALIGNED_DATA";
    }

    return "<unknown>";
    }
    #endif

    关于cuda - CUFFT 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16267149/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com