有些错误是在编译过程中被编译器捕获,称为编译错误。有的错误是在运行时出现的称为运行时错误。在CUDA中运行时错误的检查包括使用一个检查CUDA运行时API函数返回值的宏函数及使用CUDA-MEMECHECK工具。
4.1 一个检查CUDA运行时错误的宏函数
前一章节学习了一些CUDA的运行时API函数,如分配设备内存的cudaMalloc()、释放内存的函数cudaFree(),及数据传输的API函数cudaMemcpy()。所有的运行时API函数都是以cuda为前缀的,并且返回值都是cudaError_t,只有返回cudaSuccess时代表成功调用了API函数。根据这样的规则。可以写出一个头文件error.cuh.包含一个CUDA运行时错误的宏函数,代码如下:
#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",__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)\
(1)改文件开头第一行#pragma once 是一个预处理命令,其作用是确保当前文件在一个编译单元中不被重复包含。该预处理命令与如下符合预处理命令作用相当,但更加简洁:
#ifndef ERROR_CUH_
#define ERROR_CUH_
头文件中的内容
#endif
(2)该宏函数的名称为CHECK(),参数call是一个CUDA运行时API。
(3)在定义宏时,如果一行写不下,则需要在行末写\,表示续行。
(4)在第七行定义了一个cudaError_t类型的变量error_code,并初始化为参数call的返回值。
(5)第八行判断该变量的值是否为cudaSuccess。如果不是,在第9-16行报告相关文件、行数、错误代码及错误的文字描述并退出程序。cudaGetErrorString()显然也是一个CUDA运行时的API函数,作用是将错误代号转化为错误的文字描述。
在使用宏函数时,只要将一个CUDA运行时API函数当做参数传入宏函数即可,例如以下宏函数的调用CHECK(cudaF

最低0.47元/天 解锁文章
1万+

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



