对于安全(或错误检查)的CUDA调用(对cudaMemcpy
,cudaMalloc
,cudaFree
等函数),我们可以定义wrapper,如下所示:< / p>
#define cuSafe(ans) { gpuCuSafe((ans), __FILE__, __LINE__); }
inline void gpuCuSafe(cudaError_t code, const char *file, int line) {
if (code != cudaSuccess) {
fprintf(stderr,
"GPU ERROR: '%s' in file %s (line %d)\n",
cudaGetErrorString(code), /* <----< */
file,
line);
exit(EXIT_FAILURE);
}
}
这些CUDA函数调用返回类型cudaError_t
的值。我们可以调用cudaGetErrorString(cudaError_t c)
来获取可能向程序的用户和开发人员提供信息的错误字符串(解释错误的错误字符串优于错误代码)。
在cuRAND API Documentation中,他们使用类似的方法来包装curand
函数调用。 curand
个函数返回curandStatus_t
类型的值。
我正在寻找一个返回表示返回的curandStatus_t
值的字符串(could be CURAND_STATUS_INITIALIZATION_FAILED
,CURAND_STATUS_NOT_INITIALIZED
等)的函数,但是,我无法在文档中找到任何类似的功能。
为了清楚起见,我希望能够做的是创建一个curandSafe
包装器(类似于上面的cuSafe
示例)
#define curandSafe(ans) { gpuCuRandSafe((ans), __FILE__, __LINE__);}
inline void gpuCuRandSafe(curandStatus_t status, const char *file, int line) {
if (status != CURAND_STATUS_SUCCESS) {
fprintf(stderr,
"GPU curand ERROR in file %s (line %d)\n",
/*curandGetStatusString(status)*/ // OR SOMETHING LIKE THAT
file,
line);
exit(EXIT_FAILURE);
}
}
我正在考虑使用switch-case
手动实现它,但想知道它是否有内置函数,因此它会处理可能的新状态代码。
答案 0 :(得分:1)
哦,我想我找到了similar question。在NVIDIA样本cuda_helper.c
中,您可以看到处理enum
的{{1}}值的函数。
curand
然而,对于这个问题,内置的,因此版本无关的解决方案会很好。