GPU结构与CUDA系列2GPU硬件结构及架构分析:流多处理器SM,流处理器SP,示例架构分析
Posted 呆呆象呆呆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPU结构与CUDA系列2GPU硬件结构及架构分析:流多处理器SM,流处理器SP,示例架构分析相关的知识,希望对你有一定的参考价值。
1 GPU架构的发展
架构名 | 发布年份 | 显卡名称 | 每个SM中SP的数量 |
---|---|---|---|
Tesla | 2008 | ||
Fermi | 2010 | GTX400 GTX500 | GF100:32;GF10X:48 |
Kepler | 2012 | GTX600 GTX700 | 192 |
Maxwell | 2014 | GTX800 GTX900 Jetson-Nano | 128 |
Pascal | 2016 | GP100 GTX1000 MX150 MX250 Jetson-TX2 | |
Volta | 2017 | GV100 Tesla-V100 Jetson-Xavier | |
Turing | 2018.8 | RTX2000 | 64 |
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 参考文献
(3条消息) gpu的单位表示_GPU中的基本概念_weixin_39717121的博客-CSDN博客
CUDA的thread,block,grid和warp - 知乎
GPU架构之Hierarchy Memory多级存储 - 知乎
Nvidia GPU架构 - Cuda Core,SM,SP等等傻傻分不清?_咚咚锵的博客-CSDN博客_cuda sm
以上是关于GPU结构与CUDA系列2GPU硬件结构及架构分析:流多处理器SM,流处理器SP,示例架构分析的主要内容,如果未能解决你的问题,请参考以下文章
GPU结构与CUDA系列3GPU软件抽象:Grid,Block,Thread,Warp定义说明与硬件的映射执行细节
GPU结构与CUDA系列4GPU存储资源:寄存器,本地内存,共享内存,缓存,显存等存储器细节