本文为学习笔记,故只对知识点依据自己的理解作概要总结,方便以后复习激活记忆。
注:本文中GPU的讲解以A100型号为例,V100跟A100的架构差别不大也可适用,但是其他架构可能会有所出入。
一、GPU硬件结构
NVIDIA A100 GPU的硬件结构
HBM2:显存
Memory Controller:负责控制HBM2和L2 Cache之间的通信
High-Speed Hub:GPU总线,将NVLink、PCI E、Engine以及XBAR(桥接器,图中并未显式给出)连接在一起
XBAR:GPU桥接器,将各个L2 Cache、GPC以及GPU总线连接在一起
NVLink:NVLink的接口,通过使用NVLink可以将几个GPU直接连接起来
L2 Cache:L2级缓存,负责缓存GPC的数据
GPC:图形处理簇,在人工智能领域负责CUDA编程中的Kernel层次(下文会详细说明)
TPC:纹理处理簇,NVIDIA为了让GPU对图像处理有更好的性能而进行的划分,在人工智能领域应该用不到
SM:多流式处理器,在人工智能领域负责CUDA编程中的Block层次(下文会详细说明)
SM的内部结构
Tex:用于纹理采样,人工智能领域应该用不到
L1 Data Cache/Shared Memory:L1级缓存,一个SM中的多个CUDA core可以共享
SFU:特殊函数处理单元,用于执行如正弦、余弦、倒数以及平方根等函数操作
LD/ST:用于执行存取指令,这里的存取是向显存中存取
CUDA Core:图中每个小区域中的所有INT32 Core、FP32 Core、TENSOR Core(该图中共有四个区域)算一个CUDA Core,一个CUDA Core在一个时钟周期内对应一个线程束
INT32:用于处理INT型计算
FP32/FP64:用于处理浮点型计算
TENSOR Core:张量计算核心,用于处理矩阵运算,可实现混合精度运算,是GPU加速训练的关键
Register File:寄存器,用于临时存储计算时需要的数据(跟CPU里的寄存器功能一样)
Warp Scheduler:线程束调度器,SM一个时钟周期内会下发一个线程束(32个线程)给CUDA Core进行执行,但是并不能保证一个线程束的线程在进行并行或并发执行后结果和顺序执行一样,可能会产生错误,因此需要一个调度器来进行调度。线程束调度器的具体工作是先对线程进行锁同步(这里我理解是各个Warp之间也会锁同步,而不仅仅是Warp内部),然后将线程拆解成指令传到Dispatch Unit中
Dispatch Unit:负责发射指令
L0 Instruction Cache:L0级指令缓存
L1 Instruction Cache:L1级指令缓存,存储一个Block的所有指令
上文中介绍的仅仅是NVIDIA官方开源出来的A100中的全部组件,除此之外,GPU中还有一些其他没有开源的组件没有在图中体现出来(例如DMA引擎和读写电路)
二、GPU层次划分
上文中提到了Kernel、Block等执行层次,这些层次主要与CUDA编程有关。在多线程的CUDA编程中,会依据存储空间来划分层次
Kernel:在CUDA中用_global_符号声明,一个Kernel对应硬件层面的一个GPC,共享L2 Cache中的一块存储区域。这是因为一个Kernel在执行时会启动一个Grid单位的线程,并将其放到一个GPC上执行
Grid:执行Kernel时启动的线程单位,一个Kernel的执行会启动一个Grid单位的线程,所以一个Grid内的不同Block可以通过L2 Cache来进行数据共享
Block:Block是Grid里面的划分,一个Grid的线程会划分为多个Block的线程来执行,一个Block的线程会放到一个SM中执行,共享一个L1 Data Cache/Shared Memory。因此Block之间无法通过Shared Memory来进行通信,这也就导致在运行时不同Block之间是不共享内存的,只会在运行结束后在Grid层次共享数据
Warp:线程束,一个时钟周期内由Warp Scheduler进行调度,由CUDA Core进行执行。一个Warp包含32个线程
Thread:线程,一个Warp的线程在执行时会被拆分为二进制机器指令交给各种Core进行并发或者并行执行,所以没有对应关系
三、GPU通信方式
多级 GPU 通信技术概览 - 知乎
这篇文章已经对GPU所采用的通信技术进行了全面且详细的说明,本文在此不再对各种通信技术进行赘述,仅写一些自己的理解和学到的一些其他知识
GPU的通信技术其实就包括两方面:GPU Direct和非GPU Direct。这是因为GPU Direct其实就是NVIDIA对于GPU通信技术进行的各种改进,而原先的那些“默认方案”则是非GPU Direct部分,这部分其实就是将GPU当成一般的IO设备进行处理
GPU Direct:包括GPU Direct Storage、GPU Direct P2P、NVLink、GPU Direct RDMA、GPU Direct Video(本文不进行介绍,感兴趣可以自行搜索)
在对GPU Direct技术进行说明之前,先说明一下DMA引擎和读写电路。由于该部分NVIDIA并未开源,所以目前无法介绍其具体结构,仅介绍其功能(均以A100为例,可能其他架构的NVIDIA GPU不适用)
DMA引擎:NVIDIA A100的DMA引擎是经过特殊化设计的,与普通的DMA引擎不同,它可以直接访问某些I/O设备,而这一过程普通的DMA引擎需要经过内存进行中转。此外,DMA引擎需要CPU进行启动,在使用时需要通过中断来让CPU执行中断程序,GPU不能自启动DMA引擎
读写电路:上文中提到过,A100 GPU内部具有处理LD/ST指令的结构,这也就是说其具有访存能力,不过之前提到的只针对本GPU的显存。读写电路这个结构使得两个GPU之间可以直接读写对方的显存,这通常被称为P2P Access,而使用DMA引擎的方法被称为P2P Copy。读写电路只有在P2P Access中才能使用,也就是说只能是两个兼容的GPU进行通信才可以使用。这之间的链路可以是PCIe也可以是NvLink(10系和20系的部分型号都可以使用PCIe进行P2P,但是30系开始就不行了,只能用NvLink进行P2P),不过由于一个周期的时间的限制,P2P Access Read只能在使用NvLink并且GPU处理能力较强的情况下使用(比如A100 GPU+NvLink的情况下就可以)
GPU Direct Storage:GPU与外存使用DMA引擎直接走PCIe进行数据传输,无需内存中转
GPU Direct P2P:包括P2P Copy和P2P Access,在上文中均已介绍
NVLink:由于PCIe总线的传输速度过慢,在采用P2P Access时PCIe的传输速度已经成为瓶颈,所以在原有GPU Direct P2P技术的基础上改换传输通道而产生的技术。这项技术的具体做法是在GPU与GPU之间搭建直接连接的高带宽物理链路,并且配备专用的接口和协议。现在,NVLink已经发展出了NVSwitch技术(即NVLink的交换机),关于NVSwitch技术的具体内容可以看从NVLink到NVSwitch,英伟达最黑科技【AI芯片】GPU详解06_哔哩哔哩_bilibili,本文的部分内容参考了ZOMI老师的相关视频,想详细了解相关技术请务必观看
RDMA技术是一种把网络通信功能从CPU卸载到智能网卡上的技术。当CPU处理到需要访问其他主机的内存(访问网络)时,原本会调用操作系统内核中的网络协议栈,但是如果程序访问网络的方式是调用RDMA,那么CPU就会产生中断并执行中断程序,随后智能网卡便开始执行网络协议操作,同时CPU中断结束,重新进行任务调度开始执行别的进程。简单来讲,就是一个主机访问另外一个主机的内存时,可以将网络的处理操作放到网卡上进行,CPU继续干自己的事。RDMA目前主要有三种协议:IB、RoCE、iWARP。具体内容本文不进行详细说明,感兴趣可以自行搜索
而GPU Direct RDMA就是通过网卡和GPU的DMA引擎直接通信来实现的,RDMA Read和Write操作可以直接通过DMA引擎来访问GPU的显存,这一功能目前由NVIDIA独占
最后,感谢ZOMI老师的视频,真的学到很多,对人工智能感兴趣的话请务必看一下他的视频ZOMI酱的个人空间-ZOMI酱个人主页-哔哩哔哩视频