我正在使用以下宏进行 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".
看来,cufftResult
并cudaError_t
不能立即兼容。
从这个NVIDIA CUDA 库链接进行更多调查,似乎cudaGetErrorString
需要cudaError_t
输入类型。
我的问题如下:
- 有没有办法制作
cufftResult
和cudaError_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); \
}
}
也返回错误类型字符串。