GPU结构与CUDA系列2GPU硬件结构及架构分析:流多处理器SM,流处理器SP,示例架构分析

Posted 呆呆象呆呆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPU结构与CUDA系列2GPU硬件结构及架构分析:流多处理器SM,流处理器SP,示例架构分析相关的知识,希望对你有一定的参考价值。

1 GPU架构的发展

架构名发布年份显卡名称每个SM中SP的数量
Tesla2008
Fermi2010GTX400 GTX500GF100:32;GF10X:48
Kepler2012GTX600 GTX700192
Maxwell2014GTX800 GTX900 Jetson-Nano128
Pascal2016GP100 GTX1000 MX150 MX250 Jetson-TX2
Volta2017GV100 Tesla-V100 Jetson-Xavier
Turing2018.8RTX200064

2 GPU总体硬件资源

G P U = 显存 + 计算单元 GPU = \\text{显存} + \\text{计算单元} GPU=显存+计算单元

  • 显存(Global Memory):显存是在GPU板卡上的DRAM,类似于CPU的内存,相当于是CPU旁边的那堆DDR之类的。特点是容量大(可达16GB甚至以上),速度慢(这个速度慢是相对于数据处理速度而言的),显存对于CPUGPU都可以访问的。
  • 计算单元(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的寄存器数量硬件限制
  • 线程块消耗的共享内存量硬件限制

registershared memorySM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的Block。因此,这些资源是限制SMactive warps的最主要因素,也就限制了并行能力。

Kepler中叫做SMXMaxwell中叫做SMMSMMSMX是之后对SM的升级,区别不是很大。每个SM的内核数不是一个非常有用的指标,在这一点上不需要考虑太多。

3.2 SM的内部硬件结构

分为如下这些主要部分:

3.2.1 流处理器(Streaming Processor ,SP)

SPGPU最基本的处理单元,也称为CUDA core

每个SM中包含几十或者上百个CUDA核心,依据GPU架构而不同。我们所说的几百核心GPU中这个几百指的就是SP的数量(图三中深蓝色的框)。

SP只运行一个线程,每个SP都有自己的寄存器集(图二中浅灰色的框,同时也就是2.2.3中的Register File)。

GPUCUDA core只相当于CPU处理器中的执行单元,负责执行指令进行运算,并不包含控制单元(2.2.2中的Warp Scheduler相当于控制单元)。

SP 内部包括承接控制单元指令的Dispatch PortOperand 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 memoryinstruction 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,以此类推。

INT32FP32处理能力是有差别的,其中,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)

执行特殊数学运算(sincoslog等)

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 CoreSingle 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 4832=1576​个实时线程,

拥有16个SM。而16个SM最多可以管理多达24576个线程。

一个GTX 580包含16个这样的结构,总共 16 ∗ 32 = 512 16*32 = 512 1632=512​​个CUDA core,可以并发执行 1536 ∗ 16 = 24576 1536*16=24576 153616=24576CUDA 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全球同步评测 - 超能网

以上是关于GPU结构与CUDA系列2GPU硬件结构及架构分析:流多处理器SM,流处理器SP,示例架构分析的主要内容,如果未能解决你的问题,请参考以下文章

GPU结构与CUDA系列3GPU软件抽象:Grid,Block,Thread,Warp定义说明与硬件的映射执行细节

学习笔记

GPU结构与CUDA系列4GPU存储资源:寄存器,本地内存,共享内存,缓存,显存等存储器细节

一文了解GPU并行计算CUDA

GPU结构与CUDA系列1GPU与CPU比较:GPU介绍设计差异计算流程

GPU结构与CUDA系列0背景知识:GFLOPS,带宽,延迟和吞吐量,乱序执行,上下文切换,指令集体系结构