【发布时间】:2023-03-15 07:24:02
【问题描述】:
我正在使用以下宏来处理 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 Library 链接,似乎cudaGetErrorString 需要cudaError_t 输入类型。
我的问题如下:
- 有没有办法让
cufftResult和cudaError_t兼容,这样我就可以在CUFFT 例程上使用CUDA_CALL并从错误代码中接收消息字符串? - 为 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); \
}
}
也返回错误类型字符串。
【问题讨论】: