CUDA程序的基本框架
单源CUDA程序的框架
包含头文件
定义常量或宏
声明 c++ 自定义函数和 cuda 核函数的原型
int main()
{
1. 分配主机和设备内存
2. 初始化主机中数据
3. 将某些数据从主机复制到设备
4. 调用核函数在设备中计算
5. 将某些数据从设备复制到主机
6. 释放主机和设备内存
}
c++ 自定义函数和 cuda 核函数的定义
CUDA核函数的要求
- 返回类型必须是void,但是可以在程序中return,但是不能返回任何值
- 必须使用__global__限定符,也可以使用C++中的限定符
- 支持C++重载
- 不支持可变的参数列表,参数必须确定
- 一般情况下,传递给核函数的数组、指针必须指向设备内存(统一内存编程机制除外)
- 类的成员函数不可以是核函数,一般用包装函数调用核函数,将包装函数定义为类成员
- 在计算能力3.5(3.5是版本号)之前,核函数间不能相互调用,在动态并行引入以后可以相互调用
- 无论从主机调用还是从设备调用,核函数都运行在设备上
自定义设备函数
核函数可以调用不带执行配置的自定义函数,即 设备函数。
设备函数在设备中执行、在设备中被调用;而核函数在设备中执行、在主机中被调用。
__global__
修饰的函数称为核函数,一般由主机调用、在设备中执行;__device__
修饰的函数称为设备函数,只能被核函数或其他设备函数调用、在设备中执行;__host__
修饰主机段的普通 c++ 函数,在主机中被调用、在主机中执行,一般可以省略;- 可以同时用
__host__
和__device__
修饰函数,从而减少代码冗余,此时编译器将 分别在主机和设备上编译该函数; - 不能同时用
__global__
和__device__
修饰函数; - 不能同时用
__global__
和__host__
修饰函数; - 可以通过
__noinline__
建议编译器不要将一个设备函数当作内联函数; - 可以通过
__forceinline__
建议编译器将一个设备函数当作内联函数。
设备函数可以有返回值。