用惯了cutil中的CUDA_SAFE_CALL,在driver API下编程也有一个类似的叫 CU_SAFE_CALL,不过这里就有一个恼人的问题了:
CU_SAFE_CALL在出错时打印的错误代码error code是以16进制显示的,程序员不好理解。
如果直接用CUDA_SAFE_CALL去调用driver API的函数会得到类型转换出错的编译提示,类似下面:
error: cannot convert ?.Uresult?.to ?.udaError_t?.for argument ?.?.to ?.onst char* cudaGetErrorString(cudaError_t)?
看了cutil.h以后容易明白的,driver API返回的是CUresult类型错误码,而cuda runtime API返回cudaError_t,看过manual可以猜到二者实际是一样的,但是编译器不认识。
如果我们想在driver API下得到CUDA_SAFE_CALL一样的错误提示,可以自己写一个宏,类似这样:
#define CU_SAFE_CALL_DECODED( call ) { /
CUresult err = call; /
if( CUDA_SUCCESS != err) { /
fprintf(stderr, "Cuda driver error in file '%s' in line %i: %s./n", /
__FILE__, __LINE__, cudaGetErrorString((cudaError_t)err) ); /
exit(EXIT_FAILURE); /
} }
用强制类型转换,否则编译器报错:)