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

1 GPU架构的发展

image-20210813105221871

架构名发布年份显卡名称每个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=显存+计算单元

image-20210812221650018

  • 显存(Global Memory):显存是在GPU板卡上的DRAM,类似于CPU的内存,相当于是CPU旁边的那堆DDR之类的。特点是容量大(可达16GB甚至以上),速度慢(这个速度慢是相对于数据处理速度而言的),显存对于CPUGPU都可以访问的。
  • 计算单元(Streaming Multiprocessor,SM):执行计算的单元。每一个SM都有自己的控制单元(Control Unit),寄存器(Register),缓存(Cache),指令流水线(execution pipelines)等内容。

gpu

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相当于控制单元)。

image-20210812230056413

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 不知名结构图

image-20210817143954950

image-20210817151529475

4.1 GeForce GTX 580

NVIDIA GeForce GTX 580为例,每个GPU Core的内部如下:

img

每个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.

img

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

image-20210813162821404

4.3 Turing架构的SM

image-20210817150803532

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全球同步评测 - 超能网

  • 19
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NVIDIA GPU(图形处理器单元)架构与原理分析如下: NVIDIA GPU架构主要分为两个部分:SM处理器)和内存层次结构SM是NVIDIA GPU的核心组件,它由多个CUDA核心组成,用于处理并行计算任务。每个SM包含一定数量的CUDA核心,可以同时执行多个线程。SM还包括一些专用硬件单元,例如寄存器文件、共享内存和高速缓存。这些单元可以提供高效的数据存储和共享机制,以及加速计算速度。 NVIDIA GPU的内存层次结构包括全局内存、共享内存和寄存器文件。全局内存是最大的内存池,在所有SM中都可见。它用于存储大量数据,并在各个SM之间共享。共享内存是每个SM私有的一块内存空间,可以在SM内的线程之间进行快速共享。寄存器文件是每个CUDA核心私有的一块内存空间,用于存储核心执行时需要的数据。 NVIDIA GPU架构的原理是基于并行计算模型的。它可以同时执行大量线程,每个线程都在不同的CUDA核心上执行,从而实现高度并行的计算。通过将计算任务划分为小的线程块和网格,NVIDIA GPU可以将任务分配给多个SM并发执行,从而提高计算效率。 此外,NVIDIA GPU还支持CUDA编程模型,它可以使用CUDA编程语言进行开发。CUDA提供了丰富的API和工具,使开发者能够利用GPU的并行计算能力,提高计算性能和效率。 总而言之,NVIDIA GPU架构是一种基于并行计算的架构,通过同时执行大量线程和高效的内存层次结构,实现了高性能的数据处理和计算能力。它在许多领域,如科学计算、机器学习和游戏开发中发挥着重要的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值