Reference
错误类型
CUDA 的 Runtime API 都带有 cudaError_t 类型的返回值,其是一个封装了各错误码的枚举类,常见的取值如下:
cudaSuccess:函数执行成功,没有错误cudaErrorInvalidValue:传递给 API 调用的一个或多个参数不在可接受的范围内cudaErrorMemoryAllocation:无法分配足够的内存来执行请求的操作cudaErrorInitializationError:无法初始化 CUDA 驱动程序cudaErrorCudartUnloading:无法检测到 CUDA 驱动
更多的取值信息详见 CUDA 官方文档
错误检测
CUDA 提供了相应的错误信息函数,常用的有以下两个:
cudaGetErrorName():返回错误代码cudaError_t对应的错误类型名cudaGetErrorString():返回错误代码cudaError_t对应的具体信息
在 CUDA 运行时,每个线程都会维护一个初始值为 cudaSuccess 的错误变量,并在每次发生错误时被错误代码覆盖,使用如下两个函数可以检测出现错误时的错误代码:
cudaGetLastError():返回维护的错误变量值cudaPeekAtLastError():返回维护的错误变量值并将其重置为cudaSuccess
利用上述的函数,即可组合使用来检测 runtime API 是否运行成功,例如:
cudaMalloc(...)
printf("cudaMalloc function : %s\n",cudaGetErrorString(cudaGetLastError()));
封装实例
下面给出一个将 cudaGetErrorString() 封装成 error.cuh 中的一个宏的实例
#pragma once
#include <stdio.h>
#define CHECK(call) \
do { \
const cudaError_t error_code = call; \
if (error_code != cudaSuccess) { \
printf("CUDA Error:\n"); \
printf(" File: %s\n", __FILE__); \
printf(" Line: %d\n", __LINE__); \
printf(" Error code: %d\n", error_code); \
printf(" Error text: %s\n", \
cudaGetErrorString(error_code)); \
exit(1); \
} \
} while (0)
那么就可以在代码中这么使用:
#include "error.cuh"
int main() {
int *a;
CHECK(cudaMallocHost((void **) &a, sizeof(int)*100));
return 0;
}
CUDA运行时API会返回cudaError_t类型的错误码,文章介绍了cudaGetErrorName和cudaGetErrorString两个错误检测函数,用于获取错误类型名和具体信息。cudaGetLastError用于检查当前线程的错误状态。此外,文中提供了一个使用宏封装错误处理的示例,方便在代码中进行错误检测和打印。
869

被折叠的 条评论
为什么被折叠?



