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