P3 CUDA编程模型
我的参考视频
-
-
基础知识
- CUDA编程模型是异构的,需要CPU与GPU协同工作。
- CUDA中,分为host和device两个概念,host指代CPU及其内存,device指代GPU及其内存。
- CUDA程序里既包含host程序,也包含device程序,分别在CPU和GPU上运行。
- host和device之间可以进行通信,它们之间可以进行数据拷贝。
-
- 程序执行流程
-
- 分配host内存,并进行数据初始化
-
- 分配device内存,从host将数据拷贝到device上
-
- 调用CUDA核函数在device上完成指定的运算
-
- 在device上的运算结果拷贝到host上(例如,写入磁盘等)
-
- 释放device和host上分配的内存
-
- 调用CUDA核函数在device上执行并行计算:
-
核函数(kernel)使用 __global__ 符号声明
-
调用时需要<<>>来指定kernel执行的线程数量及结构
-
grid与block定义为dim3类型的变量,dim3可以视为包含3个无符号整数(x,y,z)成员的结构体变量,缺省值初始化为1。
-
以上两者可以灵活的定义为1-dim,2-dim,3-dim结构。在不同的GPU结构中,grid与block维度大小受限制。
* 在CUDA中,每个线程都要执行核函数,并且每个线程都会分配一个唯一的线程号 thread ID,这个ID值可以通过核函数的内置变量threadx来获得。
-
bs指代的是blocksize,一个块有256线程
-
gs指代的是gridsize,一个grid有 预先定义的线程数/bs(向上取整), 此处的(N+bs-1)/bs,就是向上取整。
-
一个kernel启动的所有线程称为一个网格(grid)
-
同一个网格中的线程共享全局内存空间,grid是线程结构的第一层
-
网格又划分成多个线程块block,这是第二层
-
线程块中有多个线程,32个线程为一个warp,这是第三层
-
GPU代码结构
总结就是 __global__ 和 __device__、__host__都不能共用,但是__device__和__host__可以共用,表示在CPU和GPU都能编译调用。