首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUFFT错误处理

CUFFT错误处理
EN

Stack Overflow用户
提问于 2013-04-28 19:53:58
回答 2查看 3.3K关注 0票数 4

我使用以下宏处理CUFFT错误:

代码语言:javascript
复制
#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编程:开发人员使用GPU并行计算指南“建议使用以下宏

代码语言:javascript
复制
#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调用,除了调用内核。”但是,当在CUFFT例程调用中使用CUDA_CALL时,编译器将返回

代码语言:javascript
复制
a value of type "cufftResult" cannot be used to initialize an entity of type "const cudaError_t". 

因此,cufftResultcudaError_t似乎不能立即兼容。

进一步研究一下,从这个NVIDIA CUDA图书馆链接来看,cudaGetErrorString似乎需要一个cudaError_t输入类型。

我的问题如下:

  1. 是否有办法使cufftResultcudaError_t兼容,以便我可以在CUFFT例程上使用CUDA_CALL并从错误代码接收消息字符串?
  2. 为CUFFT库实现不同的错误有什么技术原因吗?:-)

谢谢。

编辑: ROBERT的答案

我已经将CufftSafeCall例程修改为

代码语言:javascript
复制
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); \
}

}

若要返回错误类型字符串,请执行以下操作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-28 20:42:17

cufft不是cuda运行时api的一部分。cufft是一个独立的函数库。由于它是独立的,所以不使用cuda运行时api库来创建袖带错误枚举是有意义的;这样的链接阻碍了模块、代码和库的独立开发。

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

由于枚举值从袖口回来库调用独立于枚举值从cuda运行时返回 api (而且大多与枚举值正交),所以我认为在单个宏中协调这两个集合是不可能的。而且,由于cuda调用和cufft调用可能混合在任何代码中,所以我想不出一种环保的方法。然而,其他人可能会想出一种聪明的方法。

如果您希望字符串解析器具有袖带错误枚举,那么在/usr/local/cuda/samples/common/inc/helper_cuda.h (假设标准linux 5安装)中有一个可能会引起您的兴趣。为了方便起见,把它贴在这里:

代码语言:javascript
复制
#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
票数 4
EN

Stack Overflow用户

发布于 2017-08-30 06:45:43

我在我的项目中使用了以下宏:

代码语言:javascript
复制
// NOTE: include cufft to import '_cudaGetErrorEnum(cufftResult error)'
#include <cufft.h>
#include <helper_cuda.h>

#define CHECK_CUFFT_ERRORS(call) { \
    cufftResult_t err; \
    if ((err = (call)) != CUFFT_SUCCESS) { \
        fprintf(stderr, "cuFFT error %d:%s at %s:%d\n", err, _cudaGetErrorEnum(err), \
                __FILE__, __LINE__); \
        exit(1); \
    } \
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16267149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档