CPU与GPU的计算模块差别![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1b3ebf5c9b555ee34fb435b7f3817101.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2ea1472667cf0277e6321e5579eab1ae.png)
以上为CPU架构与GPU架构的主要区别:
图一可见:CPU在ALU的计算一个步骤之外还有许多额外的开销。
图二展示了CPU,AVX(高级矢量扩展指令集),以及GPU的计算模块。可以看出GPU在ALU的数量上具有相当大的优势,因此在计算密集度高的场景上有可以有相对高的计算能力。
以上为完整的GPU结构。
图三中的每一个绿色小块都是一个SM,而每个SM的详细结构如图四。
CPU与GPU的存储单元差别
可以看出GPU拥有更大的register,且其L1 cache受programmer控制。属于显式的存储控制。
而CPU则依靠内部的流水线操作进行调度,属于隐式的存储控制。
下图则给出了不同等级的存储访问时的延迟实例。
GPU编程模型
1、上图中引出了GPU使用中无法绕开的一个概念:kernel。
由于GPU的实现是多线程的,其加速计算的根本也是基于多线程中warps的快速转换。
kernel的定义是一组线程块(block)组成的网格(grid),而这些block之间相互独立,没有依赖关系,可以被GPU以任意顺序调度。
Q:为什么要把thread封装为block?为什么要把block封装为kernel?同一个block的thread除了需要执行同步之外,还有什么特点?同kernel问?
上图解释了GPU的硬件结构(SM)与软件线程块(block)的关系:
block对应于硬件的SM,一个block被一个SM执行,并且在执行中不会发生迁移。
而根据SM能提供的存储资源和线程块存储要求,几个同时并发的线程块(block)可以驻留在同一个SM内。如图,一个kernel中的8个block被分配给2个SM单元执行,或分成4个SM单元执行。
上图提到了warp的概念,warp是kernel执行的基本调度单位,有由32个线程组成。而在warp之上是block,32个warp组成一个block。在每个时钟周期,warp scheduler会选择一个准备好的warp,并将其分配到CUDA core里执行。