我使用以下宏处理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". 因此,cufftResult和cudaError_t似乎不能立即兼容。
进一步研究一下,从这个NVIDIA CUDA图书馆链接来看,cudaGetErrorString似乎需要一个cudaError_t输入类型。
我的问题如下:
cufftResult和cudaError_t兼容,以便我可以在CUFFT例程上使用CUDA_CALL并从错误代码接收消息字符串?谢谢。
编辑: ROBERT的答案
我已经将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); \
}}
若要返回错误类型字符串,请执行以下操作。
发布于 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安装)中有一个可能会引起您的兴趣。为了方便起见,把它贴在这里:
#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发布于 2017-08-30 06:45:43
我在我的项目中使用了以下宏:
// 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); \
} \
}https://stackoverflow.com/questions/16267149
复制相似问题