1.Linux 中的错误处理
#include voidperror (constchar*str);
//该函数会向stderr打印以str指向的字符串为前缀,后紧跟一个冒号,最后是errno表示的错误信息。举个栗子:
FILE *fd;
fd = fopen("file.txt","r");
if(NULL == fd) {
perror("fopen");
exit();
}
#include
char* strerror (interrnum);intstrerror_t (interrnum,char*buf, size_t len);
//这两个函数就是将errno作为输入实参,来将错误信息以字符串的形式返回或者写入buf里面。举个例子
FILE *fd;
fd = fopen("file.txt","r");
if(NULL == fd) {
fprintf(stderr,"fopen : %s\n", strerror(errno));exit();
}
2. CUDA中的错误处理
和errno变量类似,在CUDA编程中,也定义了错误类型 cudaError_t ,只不过这个错误值一般是runtime API的返回值。当且仅当这个API返回值为cudaSuccess时,才说明这个API调用正确。
当发生了API调用错误,我们如何知道错误信息呢
__host____device__cudaError_t cudaGetLastError ( void )__host____device__cudaError_t cudaPeekAtLastError ( void )
这两个函数获取最后的错误信息,返回值是一个cudaError_t类型。
不同的是,cudaGetLastError()函数将重新将系统的全局错误信息变量重置为cudaSuccess,而cudaPeekAtLastError() 函数不会有这样的操作。
注意事项:
任何CUDA API调用都会可能出错。因此,假如你要定位是否是API 1调用错误,要保证这个API之前的所有API调用都没有错误,然后在API 1调用后面加上cudaGetLastError();
Kernel的启动是异步的,为了定位它是否出错,记得加上cudaDeviceSynchronize()函数进行同步,然后再调用cudaGetLastError();
Ok, 同样的,我们得到了错误类型的值,如果知道它代表的错误信息含义呢?去参考手册上查找错误信息映射就太麻烦了,CUDA提供了如下的两个API来显示对应的错误信息:
__host__ __device__constchar* cudaGetErrorName ( cudaError_terror)__host__ __device__constchar* cudaGetErrorString ( cudaError_terror)
//可以类似下面这样来处理。
int cudaUtil::reportCudaErrorGPU(const char *message,const char *file,const char *function, int line)
{
cudaError_t cuda_err = cudaGetLastError();
if(cudaSuccess != cuda_err)
{
fprintf(stderr,"%s:(%s:%s:%d)\n",message,file,function,line);
fprintf(stderr,"%s\n", cudaGetErrorString(cuda_err));
//exit(1);
return -1;
}
return 0;
}
//调用的时候这样就可以了
ret = cudaUtil::reportCudaErrorGPU("cudaSetDevice error",__FILE__,__FUNCTION__,__LINE__);
if(ret
{
ret = -2;
break;
}
领取专属 10元无门槛券
私享最新 技术干货