GPU架构与通信互联技术介绍

GPU架构介绍

SM (Streaming MultiProcessor)

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。

从软件上看:

  • thread: 一个CUDA的并行程序会被以许多个thread来执行。
  • block: 数个thread会被群组成一个block,同一个block中的thread可以同步,也可以通过shared memory进行通信。
  • grid: 多个block则会再构成grid。
  • warp(线程束)是由32个thread线程组成的基本调度单元,这些thread只能执行相同的指令。

在这里插入图片描述

层次关系:

  • 一个线程块由若干个warp组成。例如,如果一个线程块包含256个线程,那么这个线程块将被划分为8个warp(256/32 = 8)。

通信与同步:

  • 线程块内的所有线程可以通过共享内存进行通信。
  • warp中的线程在硬件上同步,因为它们执行相同的指令。

调度与执行:

  • 线程块是程序员定义的逻辑分组,而warp是硬件定义的调度单元。
  • 一个线程块的多个warp可以在同一个SM上同时执行,也可以分时复用SM的资源。

Warp Scheduler

从上面SM的展开图可以看出,每个SM都有自己的寄存器文件(shared memory)、共享内存(Register File)和缓存等资源,并且拥有很多Core资源,可以同时执行多个线程,可以说SM是GPU中的可独立计算单元。

虽然说SM中配有register file和shared memory等存储资源,但他们属于稀缺资源。因为资源限制,SM要为每个线程块分配共享内存,也要为每个线程束中的线程分配独立的寄存器,这些有限的资源就使每个SM中active warps有非常严格的限制,也就限制了并行能力。在这种情况下,由哪些线程资源来占有这些稀缺资源执行任务,就离不开Warp Scheduler调度器。

那么什么是Warp Scheduler呢?

例如,假如一个SM最大只能存储1024个线程的信息,但一个SM可以拥有超过1024个线程。那么这时在SM内存的warp线程的调度单元就是Warp Scheduler。

一个SM的CUDA core会分成几个warp(即CUDA core在SM中分组),由warp scheduler负责调度。尽管warp中的线程从同一程序地址,但可能具有不同的行为,比如分支结构:

定义:一个warp中的线程执行不同的指令,叫做warp分支。如果warp发生分支,则需要顺序执行每个分支路径。

在这里插入图片描述

在一个warp中所有线程都必须具有两个分支if…else….一个warp中如果有线程的条件为true,则执行if子句,其它为false的线程将等待if执行完成。然后执行else语句,当条件为true的线程则等待else执行完成。

为了获得更高的性能,尽量避免warp分支,warp是32个连续的线程,在算法允许的情况下,可以将数据分割,使同一个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 技术发展阶段:

时间技术介绍
2010GPUDirect Shared Access通过共享的固定主机内存(不推荐使用)提供了与第三方PCI Express设备驱动程序加速通信的支持
2011GPUDirect Peer to Peer允许GPU使用高速DMA传输直接在两个GPU的内存之间加载和存储数据
2011GPUDirect for Video为基于帧的设备(例如,图像采集卡,视频切换器,HD-SDI捕获和CameraLink设备)提供了优化的管道,可有效地将视频帧传入和传出NVIDIA GPU内存
2013GPUDirect RDMA(远程直接内存访问)使网络设备可以完全绕过CPU主机内存直接访问GPU内存
2019GPUDirect 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.youkuaiyun.com/danteLiujie/article/details/102901255
https://blog.youkuaiyun.com/danteLiujie/article/details/102901255

### 单机多卡多机多卡GPU互联通信技术详解 #### 一、单机多卡GPU互联技术 在单台计算机内部,多个GPU可以通过PCIe总线或NVLink接口进行连接。对于现代高性能计算平台而言,NVLink提供了远超传统PCIe带宽的数据传输速率。 - **数据传输速度**:高效的卡间互联能够快速传输数据,减少通信延迟,提高系统的整体性能[^1]。 - **计算效率**:在分布式计算和深度学习训练中,卡间互联的效率决定了不同GPU之间的协同计算能力。例如,在同一主机内的GPU可以共享相同的内存空间,从而减少了跨节点通信的需求,提升了计算效率。 - **扩展性**:虽然单机环境下的扩展性有限,但是通过增加更多具备NVLink互连功能的GPU模块,仍然可以在一定程度上增强系统处理复杂任务的能力。 ```python import torch from torch.nn.parallel import DataParallel model = YourModel() device_ids = [0, 1, 2, 3] # 假设有四块显卡可用 dp_model = DataParallel(model, device_ids=device_ids).cuda() input_tensor = torch.randn(8, 3, 224, 224).to('cuda') output = dp_model(input_tensor) ``` 这段Python代码展示了如何利用PyTorch框架中的`DataParallel`类来实现简单的单机多卡并行化操作。这里假设存在四个CUDA设备可供分配给模型实例使用。 #### 二、多机多卡GPU互联技术 当涉及到跨越多台物理机器上的多个GPU时,则需要依赖于更复杂的网络协议和技术栈来进行有效的资源管理和任务调度。 - **中间件的作用**:为了使原本设计为运行在一个单独硬件单元上的应用程序能够在由众多独立计算节点组成的集群环境中高效运作,通常会引入专门开发出来的软件层——即所谓的“中间件”。这些工具可以帮助开发者轻松地将其现有的单机版本程序转换成适用于更大规模分布式的解决方案[^3]。 - **张量并行机制**:作为一种特别针对神经网络架构优化的技术手段,“张量并行”允许我们将大型模型拆解开来部署至不同的加速器之上,进而突破单一装置所固有的存储容量瓶颈。具体来说就是把权重矩阵以及其他相关联的数据结构按照一定规则分割开,并分别加载到各个参协作运算过程里的图形处理器里去[^2]。 ```bash mpirun -np 8 python train.py --backend nccl ``` 上述命令行脚本片段说明了怎样借助MPI库启动八个进程执行名为train.py的Python脚本文件,其中指定了采用NVIDIA Collective Communications Library (NCCL)作为后端通讯方式以确保最佳化的集体通信效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

造夢先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值