GPU硬件架构
GPU硬件架构
--本章节主要介绍GPU硬件架构与存储体系。
作者cpplinklist,联系方式:412012558@qq.com
注:本节内容主要参考文献为
- GPU编程与优化——大众高性能计算 方权民等。
- NVIDIA developer blog上的官方白皮书:例如:
https://developer.nvidia.com/pascal 等 - 大规模并行处理器编程实战 David B.Kirk
本节所有插图都截图自参考文献一。
本节内容推荐阅读:
- GPU编程与优化——大众高性能计算 第三章
- 大规模并行处理器编程实战 1.2
- CUDA C编程权威指南 程润伟等
- nvidia developer blog上的相关内容
1.硬件架构
到目前,NVIDIA一共推出了六种架构的GPU,那么这个架构到底是什么意思呢?
我们可以把GPU想象成一个大工厂,所谓异构计算就是把计算量繁重的任务转移到专门的计算硬件上,CPU做为主机,也就是甲方,他把任务分配给加速器,也就是干活的工厂,或者说是外包工厂。
那么这个工厂就有组织架构,和公司的组织架构相类似,小到一名员工,再到一个车间,一个部门,再到整个工厂,整个工厂还有很多大小不一的仓库。那么,每个车间里面有多少员工,每个车间里面每个工种的有多少,每个部门有多少个车间,整个工厂有多少个部门,就是所谓的架构。
干活的过程就是工人去仓库取原料(取显存中取数据),加工(计算),然后再把加工后的结果放回仓库(向显存中存放数据)。
但是如何指挥如此庞大的工厂有条不紊的进行生产工作,就是一门艺术了。如果写的代码比较好,功力比较深厚,那么就可以中分利用GPU的性能,如果要是写的比较扣脚,性能甚至低于CPU串行计算的效率(还不如不找外包)。
GPU也有它的架构,我们就按照工人->车间->部门->工厂的模式去类比理解GPU的架构。
首先先介绍一些概念,一次性罗列出来可能你很难记住,但是没关系,看到后面你可以再翻回来查看:
- 流处理器(stream processor,SP):也称为core,是GPU运算的最基本单元,类似于计算机组成课程中的CPU内部的ALU(不严谨),是执行计算的,是最普通,工厂中数目最多的工人。
- 渲染核:(shader core:SP):SP的另一个名称,或者说是SP的升级版,称为CUDA core,始于Fermi架构,你可以理解为经过科技升级,工种从民兵升级为剑士,变得更强。但是功能一样。
- 双精度浮点运算单元(DP):专用于双精度浮点运算的处理单元,一种特殊工种,只能用于双精度浮点运算。
- 特殊功能单元(special function unit,SFU):用来执行超越函数指令,如sin,cos 倒数,平方根等函数,另一种强大而又特殊的工种。
- 流处理器(stream multiprocessors,SM):从英文名字就可以理解出来,流处理器的集合,是GPU架构中的基本计算单元,可以理解为工厂架构中的车间,,由SP,DP,SFU等运算单元组成(DP和SFU是其他工种)。
- SMX:Kepler架构中的SM。
- SMM:Maxwell架构中的SM。
- 线程处理器簇(thread processing cluster,TPC),由SM控制器,多个SM和L1cache(L1缓存)组成。可以理解为工厂架构中部门,其中L1cache为一个多个SM公用的缓存,可以理解为多个车间公用的一个小仓库,存有一些必要的数据,避免了总是去全局总仓库取物品的时间浪费。(学过计算机组成的同学可能很好理解)。
- 图形处理器簇(graph processing cluster,GPC):类似与TPC,可以理解为工厂架构中的部门,但是不是TPC的替代品,再Pascal架构中,同时出现了GPC和TPC,且GPC包含TPC,可以理解为一级部门和二级部门。但是有的架构中没有TPC,有的架构中没有GPC,有的架构中TPC,GPC都没有,有的架构中TPC,GPC都有。说到底,部门这个概念本身就很弱,你可以把两个车间分配为一个部门,可以三个车间分配为一个部门。今天你可能和你对面的妹纸是一个部门的,明天可能由于组织架构调整,就和她不是一个部门了,但是她还是坐在你的对面。
- 流处理器阵列(scalable streaming processor array,SPA):所有处理器核心和高速缓存的综合,包含所有的SM,TPC,GPC.与存储系统共同构成GPU架构。也就是说,这里把所有的车间,和车间之间公用的小仓库(小仓库认为属于车间或多个车间共同私有),有一个算一个,都加起来,称为SPA,类似于全体生产部门,那么,整个工厂由全体生产部门+仓库构成。
- 存储控制器(memory controller,MMC)顾名思义,控制存储访问单元,我们可以想象每次从总仓库去取物品,都需要一个指挥,一个运输小车,一个工人专程开车去取。MMC就是这个指挥官。
- 存取单元(load/store unites,LD/ST)。运输小车?
那么我们整理一下思路。
SP/CUDAcore(工人)->SM(车间)->TPC/GPC(部门)->GPU(工厂)
按照这样的对应关系来理解GPU的架构。
TESLA架构
Tesla架构
Tesla架构的计算能力为1.X。其架构内的SP不支持双精度运算,双精度运算时通过增加DP实现的。相当于工人级别比较低,不能干技术含量较高的工作,在车间内安插几个专门干高技术工作的工人DP。
TESLA架构的SM如图。由8个SP和2个SFU组成。在GT200中增加了DP支持双精度运算。同时SM内包含寄存器,共享存储,常量存储等存储单元,其中,G80拥有8192个32位寄存单元(一个int4字节,一个字节八位,也就是一个32位寄存单元能存一个int类型变量),GT200扩充了一倍,共16384个。相当于这个车间内共有普通工人(SP)八个,高级工人(DP)一个,特殊技术工种(SFU)两个,要注意,高级工人(DP)和特殊工种(SFU)是拒绝做普通工作的。这就是一个车间内的组织架构图了
Tesla架构SM
然后2~3个SM配合L1Cache构成TPC。两个车间加一个公用小仓库构成一个TPC部门。
Tesla架构主要核心(TPC)型号有两种,G80和GT200,G80 TPC中两个SM和一个16KB的L1Cache组成一个TPC,GT200 TPC包含三个SM和24KB L1Cache.。每个TPC由一个SM控制器进行统一控制。
----->
Tesla TPC结构图
一个TESLA GPU内所有的TPC构成SPA,TESLA架构从整体上主要由两个部件组成,SPA和存储系统,即所有的车间加小仓库构成公司的总生产部门(SPA),公司(GPU)由总生产部门(SPA)加仓库系统构成。
G80核心
GT200核心
那么一个GPU内到底由多少个TPC呢?答案是不定的,如果你多花点钱,买一个功耗比较大的GPU,那么他就向GPU内多塞几个TPC,如果是笔记本用的小功率的GPU,那么它可以少塞几个。这就是所谓的GPU可扩展性,即我可以随意的增减工厂内的部门数量,但是工厂的架构是相同的。同样的,我也可以根据需求增减仓库的大小(显存的大小)。
比如GTX285包含10个GT200 TPC和8个存储控制器。而GTX275由10个TPC和7个存储控制器组成。GTX260+由9个TPC和7个存储控制器组成。
Fermi架构
所谓的新的架构我们可以理解为工厂组织架构的升级。SP的计算能力加强,计算核心体积减小,数目增加,缓存/共享存储的升级。我们可以对应的理解为单兵作战能力加强,单个车间内工人数目增加,车间之间小仓库的大小,摆放位置的合理性升级。
Fermi架构的计算能力是2.X,在Fermi架构开始,SP更名为CUDAcore。在刚才提到,TESLA GPU内SP无法进行双精度和完成32为整数运算。经过升级,SP进化为CUDAcore 后可以进行双精度运算和完整的32位浮点运算,也取消了DP。原有的TPC也变成了GPC(改了一种部门名称而已,类似于以前叫施工部,领导觉得不好听,现在改名叫项目部,但是干活的还是那么多工人,车间还是那么多车间),同时对原子操作进行了加强(有关原子操作内容以后再说)。
那么下图展示的是SM2.0和SM2.1的组成结构。其中SM2.0中包含了32个Core,16个LD/ST,4个SFU,两个线程束调度器,SM2.1对2.0进一步加强,Core数目增加到64个,LD/ST增加到32个,SFU增加到8个。
SM2.0
SM2.1
在Fermi架构中,4个SM和一个光栅单元(我到现在也不知道这东西是干啥的)组成一个GPC,所有GPC构成SPA。其他部分于Tesla类似,包括L2Cache,PCI-E结构,内存控制器(MMC),线程调度引擎等。每个内存控制器控制一个64位的显存分区,即每个内存控制器支持每次64位数据的合并访存。因此下图中的6个内存看控制器支持384位显存数据合并访问(TODO:)。
Kepler架构:
首先,又是升级,升级后就要改名,这次升级的是SM,改名叫SMX(也就是我们工厂的车间升级了,改名叫超级车间啦),增加了动态并行功能,引入Hyper-Q技术允许多个CPU线程同时在同一个GPU启动kernel函数进行运算(一个工厂可以同时接两个外包工作)。引入GPUDierct技术利用远程直接存储访问,支持GPU间直接数据通信等(两个工厂可以互相直接共享生产资料)。
SMX包含192个单精度CUDAcore,64个DP,32个SFUhe 32个LD/ST,其中单精度CUDA核依然可以进行双精度计算,而Kepler架构中额外增加DP是用来增强双精度运算性能的(GK110核心专位高性能计算设计)。SMX以单个warp(32线程)为单位进行调度。SMX还包含4个指令分发单元。8个指令调度器。可配置共享存储L1Cache共64KB,48KB只读存储。
SMX
Kepler GK110架构中由15个SMX和6个64位内存控制器,部分产品由所不同(Tesla K20c只有13个SMX和5个MMC)。官方的Kepler架构白皮书中没有提及GPC的概念,也没有TPC的概念(工厂没有了部门这一层级),因为13个15个SMX不能平均的分配到GPC中。其他组成部分类似,只是性能比之前有了大幅度的提升,比如支持PCI-E3.0接口等。
Kepler架构
MaxWell架构
Maxwell架构对SM再次升级,更名为SMM(SM of Maxwell?),其中包含128个CUDA核,32个SFU和32个LD/ST,四个指令分发单元和8个调度器(每个调度器每个时钟周期能启动1条指令)。SMM将L1Cache从Shared Memory中抽离了出来,提供了专门的shared Memory,将L1 Cache与Texture(纹理内存)相结合。在GM204中提供了96KB的共享存储,而在GM107中仍提供64KB共享存储。
可以简单的理解,即又对车间进行了升级,包括更多的工人,更合理的私有小仓库分配。
Votal架构
(TODO:)典型GPU:TeslaV100.
Pascal架构
Pascal架构是第六代GPU架构,GP100计算能力为6.0。这一代GPU相比于上一代具有非常强劲的性能提升(牙膏挤多了),典型的GTX10系列(1060等),Tesla P100都是Pascal架构的。
Pascal架构中的SM可分为两个处理块。每个处理块拥有32个单精度CUDACore,16个DP,8个LD/ST单元,8个SFU,一个指令buffer,一个warp调度器,2个指令分发单元,32768个32位寄存器,整个SM还拥有4个纹理单元和64KB共享存储。
其中Pascal架构中,2个SM组成一个TPC,5个TPC组成一个GPC(该架构中TPC和GPC同时出现,且是包含和被包含的关系)。一个完整的GP100核心含有6个GPC,30个TPC,60个pacal架构SM,8个512位宽的存储控制器(共4096位),3840个单精度CUDA核,240个纹理单元和4个NVLink单元,每个存储控制器管理512KB的L2Cache(共4096KB)。每个NVLink单元可以提供40GB/s的双向通信带宽。
当然,由于NVIDIA GPU的良好可扩展性,根据市场定位不同,不同的GPU产品SM数量和TPC数量均有差异,比如P100采用了GP100核心,但是并不完整,仅包含28个TPC,56个SM,3584个CUDAcore。
(NVlink是什么详细的以后再介绍,你可以理解为一种数据传输的高速公路,可以架在GPU和GPU之间,GPU和CPU(主机)之间,但是对应的主机需要支持NVlink,才能有效果)。
Turing架构
最新的GPU架构,增加了tensorcore(具体是啥我现在也没弄懂),增加了光线追踪功能。
GPU存储体系
GPU存储体系是影响GPU程序性能的重要因素之一,GPU设计了鲜明的层次式存储,使用好层次式存储时进行性能优化的关键。
学过计算机组成的小伙伴一定看过这种类似的图:
存储器速度,容量和价位的关系
形成这种存储结构是价格和存取速度的一种权衡,寄存器快,但是价格贵,硬盘便宜,但是慢。
同样的道理,GPU也有它的存储结构。
- 寄存器资源位于SMX上,数量有限,如果其中少数的CUDAcore占用了所有的寄存器,那么其他的CUDACore就什么都做不了。就像是车间内的工作台,如果每个任务一个人做,但是需要10个工作台,而车间内一共20工作台,那么,就只能有两个人在工作,其他人没有工作台可以用。
- 共享存储字Maxwell架构于L1Cache进行了分离,一般大小为64KB,可以通过编程控制,相当于SM内部的一个小仓库,小仓库的意义就在于离工作场所近,比如我有一个数据在一个SM内部经常使用,那么如果我每次都去全局内存取,就会很慢,好比一个车间执行一个生产任务,执行这个任务大家都需要用一个锤子,如果它每用一次,都派一个工人去工厂的大仓库里面取,那效率极低,如果能派一个工人去大仓库取一次,把它放在车间的小仓库里面,那么以后每次大家使用都可以节省很多时间。但是小仓库毕竟是小仓库,他的规模很小,所以只能用来存取很必要,经常使用的数据。
- 常量缓存,每个SMX上都有常量缓存,主要支持常量存储的缓存和广播功能,常量存储本身位于显存中,通过SMX上的常量缓存实现常量存储快速访问。
- 全局存储和纹理存储都位于显存当中,区别是纹理存储提供了专门的纹理缓存通道。