1 GPU运行机制总述
1.0 GPU计算流程(CPU协同GPU计算)
1.1 Host与Device
1.2 Kernel
1.3 图解说明从CPU到GPU的运行机制
1.4 Single Instruction Multiple Threads(SIMT)
1 GPU的软件抽象
2 软件抽象和硬件结构的一一对应关系
2.1 Block对应于SM
2.2 Block与Thread之间的联系Warp 对应于 SM与SP之间的联系
2.3 Thread对应于SP
3 软件抽象和硬件结构对应关系的例子
3.1 软件抽象
1
Grid
对应的是年级
是抽象的划分组织方式
根据年级划分任务,Grid可以分为多个不同的班级
2
Block
对应的是班级
是抽象的划分组织方式
每个班级有若干的同学(线程),可能一个两个不同的年级会出现在同一层楼(SM),或者一层楼只有一个班级,或者没有班级,但是每一层楼的班级最大数量是固定的
3
Warp
对应的是兴趣小组
每个小组有32个学生;(同一时间他们一定是一个班级下的小组)
并且数量固定,即使凑不满这么多学生需要加进来不干活的学生,凑够一个小组
只要求他们有着一样的兴趣爱好(能执行相同的任务)
4
Thread
对应的是学生
一个Thread对应一个SP
每个学生都有个课桌 ,放自己的物品,不能让别人用,表示每个Thread在软件上都有自己的空间(寄存器等)
3.2 硬件资源
SM
对应的是教学楼的一个楼层
是实际存在的资源
一个楼层上可以有多个班级,年级和楼层并没有确定的对应关系,一个楼层中可以有很多来自不同的年级的Block
SM中的SP会被分成兴趣小组,承接不同的任务
SP
对应的是学生
一个SP对应一个Thread
是实际存在的资源
每个学生都有个课桌 ,放自己的物品,不能让别人用,表示每个SP在硬件上都有自己的空间(local memory + registers);
在楼层中,有公共的空间(走廊、厕所等),这一层楼的所有同学都可以停留,表示一个SM中有shared memory,这个SM上的Block都可以访问;(shared memory是不是所有的block都可以访问)
学校里的公共区域,比如操场、食堂等,所有同学都可以去运动、吃饭,表示GPU中有一些公共的存储空间供所有的Grid访问。
3.3 执行任务
4 用多线程掩盖延迟
Global Memory访存延迟可以达到数百个时钟周期,即便是最快的Shared Memory和寄存器在有写后读依赖时也需要数十个时钟周期。这似乎和CUDA强大的处理能力完全相悖。
为什么GPU具有这么高的计算能力?如果连寄存器都这么慢,怎么会有高性能呢?难道这不会成为最大的瓶颈吗?
因为这个高延迟的开销被掩盖了,掩盖在大量线程之下。更清楚的说,控制单元(Warp Scheduler)在多组线程之间快速切换,当一组线程Warp(一个线程组,在CUDA里叫做Warp)因为访存或其他原因出现等待时,就将其挂起,转而执行另一组线程,GPU的硬件体系允许同时有大量线程存活于GPU的SM(流多处理器)之中,这种快速切换保证资源的最大利用率——控制单元始终有指令可以发放,执行单元始终有任务可以执行,仍然可以保持最高的指令吞吐,每个单元基本都能保持充分的忙碌。
这就是GPU硬件设计中非常有特色的基本思想:用多线程掩盖延迟。这一设计区别于CPU的特点是,大量高延迟寄存器取代了少量低延迟寄存器,寄存器的数量保证了可以有大量线程同时存活,且可以在各组线程间快速切换。尽管每个线程是慢的,但庞大的线程数成就了GPU的数据吞吐能力。
下面图片可以说明:GPU用多个Warp掩盖延迟 / 与CPU计算模式的对比
GPU因为多个Warp可以快速切换来掩盖延迟,而CPU用快速的寄存器来减小延迟。两者的重要区别是寄存器数目,CPU的寄存器快但少,因此Context Switch代价高;GPU寄存器多而慢,但寄存器数量保证了线程Context Switch非常快。同时也是因为GPU对高延迟的容忍度比较高,他只追求在长时间内比较稳定的较大吞吐量,而不在意响应时间。
原文链接:https://blog.csdn.net/qq_41554005/article/details/119760698
4.1 多少线程才能够掩盖掉常见的延迟呢?
对于GPU,最常见的延迟大概要数寄存器写后读依赖,即一个局域变量被赋值后接着不久又被读取,这时候会产生大约24个时钟周期的延迟。为了掩盖掉这个延迟,我们需要至少24个Warp轮流执行,一个Warp遇到延迟后的空闲时间里执行其余23个Warp,从而保持硬件的忙碌。在Compute Capability 2.0,SM中有32个CUDA核心,平均每周期发射一条指令的情况下,我们需要24 ∗ 32 = 768 24*32 = 76824∗32=768个线程来掩盖延迟。
保持硬件忙碌,用CUDA的术语来说,就是保持充分的Occupancy,这是CUDA程序优化的一个重要指标。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41554005/article/details/119760698
2
5 关于现代GPU如此进行软件抽象和硬件设计的一些思考
LAST 参考文献:
gpu的单位表示_GPU中的基本概念_weixin_39717121的博客-CSDN博客
CUDA的thread,block,grid和warp - 知乎
GPU架构之Hierarchy Memory多级存储 - 知乎
Nvidia GPU架构 - Cuda Core,SM,SP等等傻傻分不清?_咚咚锵的博客-CSDN博客_cuda sm
Fermi威力完美呈现,GeForce GTX 580全球同步评测 - 超能网
参考:https://blog.csdn.net/u012294613/article/details/140448875
【GPU结构与CUDA系列3】GPU软件抽象:Grid,Block,Thread,Warp定义说明与硬件的映射执行细节_cuda grid block thread-CSDN博客