1 GPU架构的发展
架构名发布年份显卡名称每个SM中SP的数量Tesla2008Fermi2010GTX400 GTX500GF100:32;GF10X:48Kepler2012GTX600 GTX700192Maxwell2014GTX800 GTX900 Jetson-Nano128Pascal2016GP100 GTX1000 MX150 MX250 Jetson-TX2Volta2017GV100 Tesla-V100 Jetson-XavierTuring2018.8RTX200064
2 GPU总体硬件资源
G
P
U
=
显存
+
计算单元
GPU = \text{显存} + \text{计算单元}
GPU=显存+计算单元
显存(Global Memory):显存是在GPU板卡上的DRAM,类似于CPU的内存,相当于是CPU旁边的那堆DDR之类的。特点是容量大(可达16GB甚至以上),速度慢(这个速度慢是相对于数据处理速度而言的),显存对于CPU和GPU都可以访问的。计算单元(Streaming Multiprocessor,SM):执行计算的单元。每一个SM都有自己的控制单元(Control Unit),寄存器(Register),缓存(Cache),指令流水线(execution pipelines)等内容。
3 计算单元SM
3.1 流多处理器(Streaming Multiprocessor,SM)总述
一个GPU可以有一个或者多个SM(上图中深橙色的框)。SM可以看做GPU的心脏,也叫GPU大核。SM可以类比到CPU核心。
相同架构的GPU包含的SM数量则根据GPU的中高低端来定,有低端型号只有1个SM,高端型号多达30个SM。常说的GPU的计算能力定义了这些SM的功能,但不是代表GPU中有多少条SM。
理论上GPU的计算能力决定驻留在SM上的线程块的最大数量。(可以理解为SM定义最多能运行的线程块数量)。
线程块的数量可能还会受到如下两方面的限制,所以实际使用中它可能会低于最大值:
SP的寄存器数量硬件限制线程块消耗的共享内存量硬件限制
register和shared memory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的Block。因此,这些资源是限制SM中active warps的最主要因素,也就限制了并行能力。
Kepler中叫做SMX,Maxwell中叫做SMM。SMM,SMX是之后对SM的升级,区别不是很大。每个SM的内核数不是一个非常有用的指标,在这一点上不需要考虑太多。
3.2 SM的内部硬件结构
分为如下这些主要部分:
3.2.1 流处理器(Streaming Processor ,SP)
SP 是GPU最基本的处理单元,也称为CUDA core。
每个SM中包含几十或者上百个CUDA核心,依据GPU架构而不同。我们所说的几百核心GPU中这个几百指的就是SP的数量(图三中深蓝色的框)。
SP只运行一个线程,每个SP都有自己的寄存器集(图二中浅灰色的框,同时也就是2.2.3中的Register File)。
GPU的CUDA core只相当于CPU处理器中的执行单元,负责执行指令进行运算,并不包含控制单元(2.2.2中的Warp Scheduler相当于控制单元)。
SP 内部包括承接控制单元指令的Dispatch Port、Operand Collector,以及浮点计算单元FP Unit、整数计算单元Int Unit,另外还包括计算结果队列。当然还有Compare、Logic、Branch等。相当于微型CPU。
具体的指令和任务都是在SP上处理的。GPU之所以可以进行并行计算,也就是在GPU的体系结构中可以实现很多个SP同时做处理。这个并行计算是通过单指令多线程 (Single Instruction Multiple Threads,SIMT)实现的。现在SP的术语已经有点弱化了,而是直接使用thread来代替。一个SP对应一个thread。
另外一些处理单元我们都归为SP
Tensor Cores:英伟达图灵架构专属处理单元,专门负责处理矩阵运算,和负责人工智能相关的运算。
RT Core:英伟达图灵架构专属处理单元,专门负责处理光线追踪运算。
一个SM中的所有SP是由Warp调度分配的线程束进行并行操作的,共享同一个shared memory和instruction unit。
3.2.2 Warp调度 (Wrap Scheduler)& 指令调度单元(Dispatch Units)
这个模块负责Warp调度(之后的Warp我翻译为线程束),用于将一批批的Warp发送给特定的计算核心SP执行计算。一个Warp由32个线程组成。Dispatch Units负责将Warp Scheduler的指令送往Core执行(也就是上面的SP)
SM中的SP会分成成组的Warp,每组32个。Wrap Scheduler会从在SM上的所有Warp中进行指令调度。从已经有指令可以被执行的Warp中挑选然后分配下去。这些Warp可能来自与驻留在SM上的任何线程块。
通常,希望驻留多个线程块这样就可以随时有Warp分配下去,以便在任何给定时刻,SP都可以忙于运行任何Warp通过调度准备就绪的指令。
例如,这是个整形运算,发给INT32(可以理解为一种SP中间的计算单元),如果是个浮点数运算,发给FP32(可以理解为一种SP中间的计算单元),是个存取资源的操作,发给LD/ST,以此类推。
INT32和FP32处理能力是有差别的,其中,FP处理能力相比INT可能有两倍或者更高的差距。因为GPU处理浮点运算多,所以各大厂商可能将浮点运算能力设计的强大一些。所以在大多数情况下编写shader的时候,适当避免一些整形操作改用浮点运算代替,可能性能还反而好一些。
当然,也不可能让浮点运算单元做所有事情但是整形运算单元什么都不干,矫枉过正了,所以该有必要整形处理还是继续整形处理。
对于特定的GPU架构(例如英伟达费米架构),可能对应多个Dispatch Units,可以将若干互不干扰的操作,优化成一周期执行完毕
例如一个简单指令计算与一个存储取出操作,由于他们各自使用不同的处理区域进行处理,可以考虑并行执行)
3.2.3 寄存器(Register File)
每个SP都有自己的寄存器。这个部分是比较稀缺的资源,限制可以并行的程序数量。
3.2.4 LD/ST(Load/Store)
负责从显存当中将数据加载到寄存器,或者从寄存器当中写回到显存。
这个单元处理操作都是异步的,也就是说其他单元在高速处理指令的时候,如果需要加载或者写回数据,则不会在这里等待LD/ST返回数据,而是跳转执行其他指令,待LD/ST把数据取到或者写回之后,再继续执行需要这些数据的后续指令。
3.2.5 特殊运算单元(Special Function Units,SFU)
执行特殊数学运算(sin、cos、log等)
3.2.6 高速缓冲器(cache)
这些缓冲器主要用于何处到何处的缓冲可以参考4.0~4.3的架构图查看
全局内存缓存(Uniform Cache,U-Cache)
指令缓存(Instruction Cache,I-Cache)
纹理缓存(Texture Cache,T-Cache)
3.2.7 多线程的指令集(Multithreaded Instruction Unit)
3.2.8 纹理读取单元(Tex)
通常这个单元负责纹理采样,包括但不限于,将纹理从专属压缩格式(例如安卓的ETC,ETC2,ASTC等,以及iOS的ASTC,PVRTC等)转换成Color返回给寄存器,负责处理纹理读取相关指令(如 tex2D等),某些情况下,也处理将纹理从显存读取到缓存的这类操作。
这个单元处理操作也是异步的。类似LD/ST单元。区别是,纹理处理单元的数据是只读的。
3.2.9 基于标量寄存器的指令集(Scalar register-based ISA)
3.2.10 双精度单元(Double Precision Unit)
要注意的是CUDA Core是Single Precision的,也就是计算Float单精度的。双精度Double Precision是那个黄色的模块(4.0中的图二)。所以一个SM里边有32个DP Unit,有64个CUDA Core,所以单精度双精度单元数量比是2:1。
3.2.11 共享内存池(Shared Memory)
每个SM都有属于本SM的共享内存池,分配给在此SM上运行的所有线程块。
多个线程块在一个SM上面运行的时候会分别使用部分共享内存池。
3.2.12 多边形引擎(PolyMorph Engine)
负责属性装配(attribute Setup)、顶点拉取(Vertex Fetch)、曲面细分、栅格化(这个模块可以理解专门处理顶点相关的东西)。
3.2.13 内部链接网络(Interconnect Network)
4 一些GPU的硬件框架示意图
4.0 不知名结构图
4.1 GeForce GTX 580
以NVIDIA GeForce GTX 580为例,每个GPU Core的内部如下:
每个SM有32个CUDA core(也就是SP),共享相同的取指/译码部件,合起来成为一个核心。每个SM最多能支持48个warp,也就是能管理
48
∗
32
=
1576
48*32=1576
48∗32=1576个实时线程,
拥有16个SM。而16个SM最多可以管理多达24576个线程。
一个GTX 580包含16个这样的结构,总共
16
∗
32
=
512
16*32 = 512
16∗32=512个CUDA core,可以并发执行
1536
∗
16
=
24576
1536*16=24576
1536∗16=24576个CUDA threads.
4.2 GM204
16个SM,每个SM中有128个CUDA核心,4个warp scheduler。
SM中有大量的寄存器资源,有64k 32-bit寄存器。
SM中另外一个重要资源是Shared Memory,有96KB的Shared Memory。
在GM204的SM结构图里我们可以看到,SM被划分成四个相同的块,每一块中有单独的Warp Scheduler,以及32个CUDA核心。Warp正是在这里被执行。32个CUDA核心共享一个Warp Scheduler
4.3 Turing架构的SM
Last 参考文献
GPU 初理解 - 简书
GPU架构之处理模块 - 知乎
GPU中的基本概念 - 云+社区 - 腾讯云
CUDA, 软件抽象的幻影背后 之二 | 奇点视觉
CUDA, 软件抽象的幻影背后 | 奇点视觉
GPU编程1–GPU中的基本概念 - 知乎
(3条消息) gpu的单位表示_GPU中的基本概念_weixin_39717121的博客-CSDN博客
CUDA的thread,block,grid和warp - 知乎
GPU编程3–GPU内存深入了解 - 知乎
GPU架构之Hierarchy Memory多级存储 - 知乎
cuda编程(一):GPU概念与架构 - 知乎
GPU计算 – GPU体系结构及CUDA编程模型
Nvidia GPU架构 - Cuda Core,SM,SP等等傻傻分不清?_咚咚锵的博客-CSDN博客_cuda sm
Fermi威力完美呈现,GeForce GTX 580全球同步评测 - 超能网