CUFFT错误处理

时间:2013-04-28 19:53:58

标签: cuda nvidia cufft

我正在使用以下宏进行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编程:使用GPU并行计算的开发人员指南”一书建议使用以下宏

#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时,编译器将返回

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输入类型。

我的问题如下:

  1. 有没有办法让cufftResultcudaError_t兼容,这样我就可以在CUFFT例程上使用CUDA_CALL并从错误代码中接收消息字符串?< / em>的
  2. 为CUFFT库实施不同的错误有任何技术原因吗? : - )
  3. 感谢。

    关于罗伯特克罗维拉回答的编辑

    我已将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); \
    }
    

    }

    还返回错误类型字符串。

2 个答案:

答案 0 :(得分:3)

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

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

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

如果你想要一个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

答案 1 :(得分:0)

我在项目中使用以下宏:

// 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); \
    } \
}