文章目录
GPU架构介绍
SM 和 Warp Scheduler
GPU利用率是用来表示对GPU资源的占用情况,用GPU的专业术语来说就是表示其分配给 SM 的 warp 数量与其可支持的最大数量的比率。
那么什么是SM ?
如下图所示,我们可以看到在整个GPU架构中存在着大量的流式多处理器(Streaming Multiprocessor,SM),它占据着GPU的大部分空间。
从硬件上看:
- SP(Streaming Processor):流处理器, 是GPU最基本的处理单元,在fermi架构开始被叫做CUDA core。
- SM(Streaming MultiProcessor): 一个SM由多个CUDA core组成,每个SM根据GPU架构不同有不同数量的CUDA core,Pascal架构中一个SM有128个CUDA core。
- 从上面SM的展开图可以看出,每个SM都有自己的寄存器文件(shared memory)、共享内存(Register File)和缓存等资源,并且拥有很多Core资源,可以同时执行多个线程,可以说SM是GPU中的可独立计算单元。
虽然说SM中配有register file和shared memory等存储资源,但他们属于稀缺资源。这些有限的资源就使每个SM中active warps有非常严格的限制,也就限制了并行能力。在这种情况下,由哪些线程资源来占有这些稀缺资源执行任务,就离不开Warp Scheduler调度器。
那么什么是Warp Scheduler呢?
从软件上看:
- thread: 一个CUDA的并行程序会被以许多个thread来执行。
- block: 数个thread会被群组成一个block,同一个block中的thread可以同步,也可以通过shared memory进行通信。
- grid: 多个block则会再构成grid。
warp(线程束)是最基本的执行单元,一般一个warp包含32个并行thread,这些thread只能执行相同的指令。
例如,假如一个SM最大只能存储1024个线程的信息,但一个SM可以拥有超过1024个线程。
那么这时在SM内存的warp线程的调度单元就是Warp Scheduler。
一个SM的CUDA core会分成几个warp(即CUDA core在SM中分组),由warp scheduler负责调度。尽管warp中的线程从同一程序地址,但可能具有不同的行为,比如分支结构。
一个SM同时并发的warp是有限的,因为资源限制,SM要为每个线程块分配共享内存,而也要为每个线程束中的线程分配独立的寄存器,所以SM的配置会影响其所支持的线程块和warp并发数量。
GPU通信互联技术介绍
我们都知道,在GPU未出现前,CPU一直是计算机中的绝对核心,甚至连存储、内存、网络等子系统的能力都是CPU说了算。
但人算不如天算,没想到大数据分析、AI、视觉渲染、基因分析以及EDR仿真等需求的突然爆发,给了NVIDIA的GPU带了巨大增长空间。GPU的快速增长超出了所有人的预料,它几乎彻底颠覆了CPU在计算机系统中的地位,而传统的根据CPU为核心设计的互联通信方式在GPU高速增长的情况下开始慢慢成为了阻碍,原有的通信技术已经成为效率阻碍。
比如,传统方式如果想把数据从存储系统转运到GPU显存中,由于历史原因此过程受CPU管理。随着计算负载从较慢的CPU转移到较快的GPU后,I/O逐渐成为系统的性能瓶颈。面对这种情况,那么GPU就要在原有的计算机里"开路"了。
1、GPUDirect
GPUDirect是NVIDIA开发的一项技术,可实现GPU与其他设备(例如网络接口卡 (NIC) 和存储设备)之间的直接通信和数据传输,而不涉及CPU。
使用GPUDirect,网络适配器和存储驱动器可以直接读写GPU内存,减少不必要的内存消耗,减少CPU开销并降低延迟,从而显著提高性能。
使用 GPU Direct 技术,多个 GPU、网络和存储设备可以直接读写主机和设备内存,减少不必要的内存拷贝和 CPU 开销,降低网络延迟,进而获得性能的提升。
GPUDirect 技术发展阶段:
时间 | 技术 | 介绍 |
---|---|---|
2010 | GPUDirect Shared Access | 通过共享的固定主机内存(不推荐使用)提供了与第三方PCI Express设备驱动程序加速通信的支持 |
2011 | GPUDirect Peer to Peer | 允许GPU使用高速DMA传输直接在两个GPU的内存之间加载和存储数据 |
2011 | GPUDirect for Video | 为基于帧的设备(例如,图像采集卡,视频切换器,HD-SDI捕获和CameraLink设备)提供了优化的管道,可有效地将视频帧传入和传出NVIDIA GPU内存 |
2013 | GPUDirect RDMA(远程直接内存访问) | 使网络设备可以完全绕过CPU主机内存直接访问GPU内存 |
2019 | GPUDirect Storage | 支持在GPU内存和NVMe或NVMe-oF等存储设备之间传输数据的直接路径 |
GPUDirect Shared Access
GPUDirect SharedMemory 支持 GPU 与第三方 PCIe 设备通过共享的 host memory 实现共享内存。下图对未使用 GPUDirect 和使用 GPUDirect 后的 GPU 之间通信的数据拷贝进行了对比。
可以看出支持 GPUDirect SharedMemory 后,GPU 之间的通信仅需要两次拷贝:
- 先从 GPU 缓存拷贝到系统内存
- 对端 GPU 缓存从系统内存拷贝数据
相较于未使用 GPUDirect 减少了一次数据拷贝,降低了数据交换的延迟。
GPUDirect P2P
GPUDirect P2P支持GPU之间通过memory fabric(PCIe或NVLink)直接进行数据拷贝。CUDA driver原生支持P2P技术,开发者可使用最新的CUDA Toolkit和driver来实现GPU间直接通信(一般用于机内通信)。
GPUDirect for Video
GPUDirect for Video提供一个服务于frame-based的通过优化的流水线功能。设备包括:frame grabbers、video switchers、HD-SDI capture、CameraLink device,它可以把视频帧高效地向GPU显内中写入/读出。
过去处理视频的第三方硬件与GPU交互时,会引入不必要的延迟,如图左边所示。有了GPUDirect for Video技术,I/O设备和GPU可达到很好的同步(两个设备driver间拷贝数据),同时能减少CPU的负载。GPUDirect for Video由第三方公司的SDK提供,开发者对视频流进/出GPU(通过OpenGL, DirectX or CUDA在子帧的传输过程 )有充分的控制能力
GPUDirect for RDMA
RDMA
随着大数据分析、科技计算、AI 计算等应用对算力需求巨大,单机形态已经不能满足用户需求,多机多卡的计算是一个常态,多机间的通信是影响分布式训练的一个重要指标。
RDMA(Remote Direct Memory Access)是一种绕过远程主机而访问其内存中数据的技术,解决网络传输中数据处理延迟而产生的一种远端内存直接访问技术。
使用RDMA的优势如下:
-
零拷贝(Zero-copy):应用程序能够直接执行数据传输,在不涉及到网络软件栈的情况下。数据能够被直接发送到缓冲区或者能够直接从缓冲区里接收,而不需要被复制到网络层。
-
内核旁路(Kernel bypass) :应用程序可以直接在用户态执行数据传输,不需要在内核态与用户态之间做上下文切换。
-
不需要CPU干预(No CPU involvement) : 应用程序可以访问远程主机内存而不消耗远程主机中的任何CPU。远程主机内存能够被读取而不需要远程主机上的进程(或CPU)参与。远程主机的CPU的缓存(cache)不会被访问的内存内容所填充。
简单来说,RDMA更像一个去掉中间商的技术,让数据能够快速获取。不再在操作系统、CPU等环节浪费时间。
RDMA 技术的软件栈 (来源)
目前 RDMA 有三种不同的技术实现方式:
-
InfiniBand(IB):专为 RDMA 设计的网络,从硬件层面保证可靠传输,同时由于这是一种新的网络技术,需要支持该技术的 NIC 和交换机。
-
RoCE(RDMA over Converged Ethernet):RoCE 是一种允许通过以太网进行 RDMA 的网络协议。RoCE 有 2 个版本:RoCE v1 和 RoCE v2。RoCE v1 是一种链路层协议,允许在同一个广播域下的任意两台主机直接访问;RoCE v2 基于 UDP 层协议,实现了路由功能,RoCE v2 针对 RoCE v1 进行了一些改进,如引入 IP 解决扩展性问题,可以跨二层组网等。
-
iWARP(internet Wide Area RDMA Protocol:允许在 TCP 上执行 RDMA 的网络协议。在大型组网的情况下,iWARP 的大量 TCP 连接会占用大量的额外内存资源,对系统规格要求较高。
GPUDirect RDMA
GPUDirect RDMA 结合了GPU加速计算和 RDMA(Remote Direct Memory Access)技术,实现了在GPU和RDMA网络设备之间直接进行数据传输和通信的能力。它允许GPU直接访问RDMA网络设备中的数据,无需通过主机内存或CPU的中介。
GPUDirect RDMA(来源)
GPUDirect RDMA通过绕过主机内存和CPU,直接在GPU和RDMA网络设备之间进行数据传输,显著降低传输延迟,加快数据交换速度,并可以减轻 CPU负载,释放CPU的计算能力。另外,GPUDirect RDMA 技术允许GPU 直接访问RDMA网络设备中的数据,避免了数据在主机内存中的复制,提高了数据传输的带宽利用率
GPUDirect Storage
对AI和HPC应用而言,随着数据规模的不断扩大,数据加载时间对系统性能影响越发显著。随着GPU计算速度的快速提升,系统I/O(数据从存储读取到GPU显存)已经成为系统瓶颈。
GPUDirect Storage提供本地存储(NVMe)/远程存储(NVMe over Fabric)与GPU显存的直接通路,它可以减少不必要的系统内存拷贝(通过bounce buffer)。它可应用网卡NIC和存储系统附近的DMA引擎,直接向GPU显存写入/读取数据。
- NVMe(Non-Volatile Memory Express):本地SSD的高速协议,Express 强调其基于 PCIe(PCI Express),通过PCIe总线直接通信,本地访问延迟极低。
- Fabrics:指网络架构(如TCP/IP、RDMA、光纤通道等),用于连接存储设备与主机。
- NVMe-oF(NVMe over Fabrics):通过网络实现远程NVMe存储访问。
2、NVLink & NVSwitch
NVLink
GPUDirect P2P 技术中,多个 GPU 通过 PCIe 直接与 CPU 相连,而 PCIe 3.0*16 的双向带宽不足 32GB/s,当训练数据不断增长时,PCIe 的带宽满足不了需求,会逐渐成为系统瓶颈。为提升多 GPU 之间的通信性能,充分发挥 GPU 的计算性能,NVIDIA 于 2016 年发布了全新架构的 NVLink。
NVLink 1.0 与 P100 GPU 一同发布,一块 P100 上,可集成 4 条 NVLink 连接线,每条 NVLink 具备双路共 40GB/s 的带宽,整个芯片的带宽达到了 160GB/s,相当于 PCIe 3.0*16 的 5 倍。
NVLink 2.0 版本与 Tesla V100 GPU 一同发布,NVLink 2.0 每个方向的信号发送速率从 20GB/s 增加到 25GB/s,每条 NVLink 双信道最大达到 50GB/s。单个 V100 GPU 支持 6 条 NVLink 连接线,总带宽最大可达 300GB/s,是 PCIe 3.0 带宽的将近 10 倍。
上图是使用 NVLink 连接 8 个 Tesla V100 的混合立体网络拓扑。图中也以看出每个 V100 GPU 有 6 个 NVLink 通道,8 块 GPU 间无法做到全连接,2 个 GPU 间最多只能有 2 个 NVLink 通道 100GB/s 的双向带宽。有趣的是 GPU 0 和 3,GPU 0 和 4 之间有 2 条 NVLink 相连,GPU0 和 GPU1 之间有一条 NVLink 连接线,GPU 0 和 6 之间没有 NVLink 连接线,也就是说 GPU0 与 GPU6 之间的通信仍然需要通过 PCIe。
NVSwitch
前面也看到,NVLink2.0 技术使得单服务器中 8 个 GPU 无法达到全连接,为解决该问题,NVIDIA 在 2018 年发布了 NVSwitch,实现了 NVLink 的全连接。NVIDIA NVSwitch 是首款节点交换架构,可支持单个服务器节点中 16 个全互联的 GPU,并可使全部 8 个 GPU 对分别达到 300GB/s 的速度同时进行通信。
下图为 16 个 GPU 通过 NVSwitch 全连接拓扑图。
3、应用场景总结
在大规模计算中,单机多卡场景下使用GPUDiect、NVLink技术,分布式场景下使用 GPUDirect RDMA技术,可以大大缩短通信时间,提升整体性能。
参考:
https://developer.nvidia.com/gpudirect
https://blog.csdn.net/danteLiujie/article/details/102901255
https://blog.csdn.net/danteLiujie/article/details/102901255