第 8 章:GPU 设计中的互连和片上网络
随着现代 GPU 中核心和内存分区数量的不断增加,片上互连网络的设计对于实现高性能和可扩展性变得至关重要。互连负责将 GPU 核心连接到内存分区,并实现它们之间的高效通信。在本章中,我们将探讨 GPU 互连和片上网络设计的各个方面,包括网络芯片 (NoC) 拓扑、路由算法、流量控制机制、工作负载特征、流量模式以及设计可扩展和高效互连的技术。
网络芯片 (NoC) 拓扑
网络芯片 (NoC) 已经成为一种有前景的解决方案,用于连接现代 GPU 中不断增加的核心和内存分区。NoC 提供了一种可扩展和模块化的通信基础设施,能够有效地处理 GPU 工作负载的高带宽和低延迟要求。针对 GPU 体系结构提出并研究了各种 NoC 拓扑,每种拓扑都有其自身的优点和权衡。
交叉开关拓扑
交叉开关拓扑是一种简单直接的互连设计,每个核心通过专用链路直接连接到每个内存分区。图 8.1 展示了一个拥有四个核心和四个内存分区的 GPU 的交叉开关拓扑。
Core 0 Core 1 Core 2 Core 3
| | | |
| | | |
--|--------|--------|--------|--
| | | |
| | | |
Mem 0 Mem 1 Mem 2 Mem 3
图 8.1: 一个拥有四个核心和四个内存分区的 GPU 的交叉开关拓扑。
交叉开关拓扑提供了核心和内存分区之间的完全连接性,实现了高带宽通信。但是,链路数量和交叉开关的复杂度随着核心和内存分区数量的增加而呈二次增长。以下是该 Markdown 文件的中文翻译。对于代码部分,我只翻译了注释,未翻译代码本身。
网格拓扑
网格拓扑是一种流行的用于基于 NoC 的 GPU 架构的选择,因为它具有可扩展性和简单性。在网格拓扑中,核心和内存分区被安排在一个二维网格中,每个节点连接到其邻近的节点。图 8.2 显示了一个具有 16 个核心的 GPU 的 4x4 网格拓扑。
核心 0 --- 核心 1 --- 核心 2 --- 核心 3
| | | |
| | | |
核心 4 --- 核心 5 --- 核心 6 --- 核心 7
| | | |
| | | |
核心 8 --- 核心 9 --- 核心 10-- 核心 11
| | | |
| | | |
核心 12-- 核心 13-- 核心 14-- 核心 15
图 8.2: 具有 16 个核心的 GPU 的 4x4 网格拓扑。
网格拓扑具有良好的可扩展性,因为随着节点数量的增加,链路数量和路由器复杂度线性增长。然而,平均跳数和延迟随着网络规模的增加而增加,这可能会影响较大 GPU 的性能。
环形拓扑
环形拓扑以环状方式连接核心和内存分区,形成一个环形结构。每个节点都连接到它的两个邻近节点,一个是顺时针方向,另一个是逆时针方向。图 8.3 展示了一个具有 8 个核心的 GPU 的环形拓扑。
核心 0 --- 核心 1
| |
| |
核心 7 核心 2
| |
| |
核心 6 --- 核心 5
| |
| |
核心 4 --- 核心 3
图 8.3: 具有 8 个核心的 GPU 的环形拓扑。
环形拓扑实现简单,并提供了均衡的流量分布。然而,平均跳数和延迟随着节点数量的增加而线性增加,使其不太适合较大的 GPU 设计。
###分级和混合拓扑
为了解决单个拓扑的可扩展性限制,已提出了用于GPU互连的分级和混合拓扑。这些拓扑通过组合多个较小的网络或不同的拓扑来创建一个更大、更可扩展的互连。
例如,可以通过将大型网格划分为较小的子网格,并通过更高级别的网络将它们连接起来,来创建分级网格拓扑。这种方法可以降低平均跳数和延迟,与平面网格拓扑相比。
混合拓扑,如网格和环形的组合,也可用于平衡可扩展性和性能之间的权衡。网格拓扑可用于集群内部的局部通信,而环形拓扑可用于集群之间的全局通信。
路由算法和流量控制
路由算法和流量控制机制在管理互连中的数据流并确保网络资源的有效利用中起着至关重要的作用。他们决定数据包如何从源路由到目的地,以及如何处理网络拥塞。
路由算法
路由算法可以分为两大类:确定性路由和自适应路由。
-
确定性路由:
- 确定性路由算法总是为给定的源和目的地选择相同的路径,而不考虑网络状况。
- 确定性路由算法的例子包括维度顺序路由(DOR)和XY路由。
- DOR首先沿X维路由数据包,然后沿Y维路由。
- 确定性路由简单易实现,可提供可预测的延迟,但可能导致流量分布不均和拥塞。
-
自适应路由:
- 自适应路由算法根据当前的网络状况(如链路利用率或拥塞)动态选择路径。
- 例如以下是该 Markdown 文件的中文翻译。对于代码部分,仅翻译注释,代码本身不做翻译。
自适应路由算法的一些例子包括最小自适应路由和完全自适应路由。
- 最小自适应路由允许数据包采取任何最小路径(最短路径)在源头和目的地之间。
- 完全自适应路由允许数据包采取任何可用路径,包括非最小路径,以避免拥塞区域。
- 自适应路由可以更好地平衡流量负载,缓解拥塞,但需要更复杂的硬件,可能会引入额外的延迟。
图 8.4 说明了确定性 XY 路由和最小自适应路由在网格拓扑中的差异。
(0,0) --- (1,0) --- (2,0) --- (3,0)
| | | |
| | | |
(0,1) --- (1,1) --- (2,1) --- (3,1)
| | | |
| | | |
(0,2) --- (1,2) --- (2,2) --- (3,2)
| | | |
| | | |
(0,3) --- (1,3) --- (2,3) --- (3,3)
XY 路由:
(0,0) -> (1,0) -> (1,1) -> (1,2) -> (1,3)
最小自适应路由:
(0,0) -> (1,0) -> (2,0) -> (3,0) -> (3,1) -> (3,2) -> (3,3)
或
(0,0) -> (0,1) -> (0,2) -> (0,3) -> (1,3) -> (2,3) -> (3,3)
图 8.4: 确定性 XY 路由和最小自适应路由在网格拓扑中的比较。
流量控制
流量控制机制管理网络资源(如缓冲区和链路)的分配,以防止拥塞并确保公平利用。GPU 互连中常用的两种流量控制技术是基于信用的流量控制和虚拟信道流量控制。
- 基于信用的流量控制:
- 在基于信用的流量控制中,每个路由器都维护着下游路由器可用缓冲区空间(信用)的计数。
- 当路由器发送一个数据包时,它会减少自己的信用计数。当下游路由器释放一个缓冲区空间时,它会向上游路由器发送一个信用。
- 上游以下是上述 Markdown 文件的中文翻译:
路由器只有在有足够信用时才能发送数据包,防止缓冲区溢出和拥塞。
- 虚拟通道流量控制:
- 虚拟通道流量控制允许多个逻辑通道共享同一个物理链路,提高网络资源的利用率。
- 每个虚拟通道都有自己的缓冲区和流量控制机制,允许不同的流量被隔离和优先处理。
- 虚拟通道可以防止队头阻塞,即缓冲区前端的被阻塞的数据包阻碍了其他数据包的传输。
图 8.5 说明了路由器中虚拟通道的概念。
输入端口 0 输入端口 1 输入端口 2 输入端口 3
| | | |
| | | |
VC0 VC1 VC2 VC0 VC1 VC2 VC0 VC1 VC2 VC0 VC1 VC2
| | | |
| | | |
--------- 交叉开关 ---------
|
|
输出端口 0
图 8.5: 路由器中的虚拟通道。
工作负载特征和流量模式
了解 GPU 工作负载的特征及其流量模式对于设计高效的互连至关重要。不同的应用程序表现出不同的通信模式,在带宽、延迟和局部性方面有不同的需求。
工作负载特征
GPU 工作负载可以根据以下几个因素进行特征描述:
-
计算密集度:
- 计算密集型工作负载具有较高的计算与内存访问比。
- 这些工作负载通常需要高带宽的核心和内存分区通信,以保持计算单元持续供给数据。
-
内存访问模式:
- 一些工作负载表现出规则的内存访问模式,如顺序或间隔访问,这个 Markdown 文件的中文翻译如下:
而其他人则有不规则或随机的访问模式。
- 规则的访问模式可以从内存合并和预取等技术中获益,而不规则的模式可能需要更复杂的内存管理技术。
-
数据共享和同步:
- 具有高数据共享和同步需求的工作负载,如图算法或物理模拟,可能会产生大量的核间通信流量。
- 对于这些工作负载,有效支持同步原语(如屏障和原子操作)非常关键。
-
局部性:
- 具有高空间局部性和时间局部性的工作负载可以从缓存和数据重用中获益。
- 利用局部性可以减少互连上的流量,提高整体性能。
流量模式
不同的 GPU 工作负载根据其通信需求表现出各种不同的流量模式。一些常见的流量模式包括:
-
均匀随机流量:
- 在均匀随机流量中,每个节点以相等的概率发送数据包到随机选择的目的地。
- 这种流量模式代表了最坏的情况,通常用于对互连进行压力测试。
-
邻近节点流量:
- 在邻近节点流量中,节点主要与网络中的直接邻居进行通信。
- 这种流量模式在具有强空间局部性的应用中很常见,如网格计算或图像处理。
-
热点流量:
- 在热点流量中,少数节点(热点)接收到大量的流量,而其他节点则相对较少。
- 热点流量可能出现在具有共享数据结构或集中式控制机制的应用中。
-
全对全流量:
- 在全对全流量中,每个节点都向网络中的所有其他节点发送数据包。
- 这种流量模式在集体通信操作(如矩阵转置或 FFT)中很常见。
图 8.6 说明了网格拓扑中不同交通模式的示例。
均匀随机流量:
(0,0) -> (2,3)
(1,1) -> (3,2)
(2,2) -> (0,1)
...
最近邻流量:
(0,0) -> (0,1), (1,0)
(1,1) -> (0,1), (1,0), (1,2), (2,1)
(2,2) -> (1,2), (2,1), (2,3), (3,2)
...
热点流量: (0,0) -> (1,1) (1,0) -> (1,1) (2,0) -> (1,1) ...
全对全流量: (0,0) -> (1,0), (2,0), (3,0), (0,1), (1,1), (2,1), (3,1), ... (1,0) -> (0,0), (2,0), (3,0), (0,1), (1,1), (2,1), (3,1), ... (2,0) -> (0,0), (1,0), (3,0), (0,1), (1,1), (2,1), (3,1), ... ...
图8.6:网格拓扑中不同交通模式的示例。
了解GPU工作负载的交通模式对设计高效的互连非常重要。可以利用分析工具和仿真框架来特征化代表性工作负载的通信模式,从而指导互连拓扑、路由算法和流量控制机制的设计。
## 设计可扩展和高效的互连
为GPU设计可扩展和高效的互连需要仔细考虑各种因素,如核心数和内存分区的数量、预期的交通模式以及功耗和面积约束。建立高性能GPU互连的一些关键设计原则和技术包括:
1. **拓扑选择**:根据可扩展性要求、预期的交通模式和设计约束选择合适的互连拓扑。网格和交叉开关拓扑在GPU中广泛使用,但对于较大规模的设计可能会采用分层和混合拓扑。
2. **路由算法设计**:开发能够有效处理预期交通模式并最小化拥塞和延迟的路由算法。GPU中常使用自适应路由算法,能够根据网络状况动态调整以提高整体性能。3. **流量控制优化**: 优化流量控制机制,以最大化网络利用率并最小化缓冲区需求。虚拟通道流量控制和基于信用的流量控制等技术可帮助提高网络效率并防止死锁。
4. **带宽资源调配**: 确保核心和内存分区之间的带宽足以满足目标工作负载的性能要求。这可能包括增加内存通道数量、使用高带宽内存技术或采用先进的信号传输技术。
5. **功耗和面积优化**: 通过采用功率门控、时钟门控和低摆幅信号传输等技术,最小化互连的功耗和面积开销。细致的物理设计和布局优化也可以帮助减少互连的面积和功耗影响。
6. **可靠性和容错性**: 在互连设计中纳入可靠性和容错性特性,以确保在存在故障或失效的情况下仍能正常运行。这可能包括错误检测和纠正、冗余以及自适应路由等技术。
示例: 为大规模 GPU 设计层次化网格互连
考虑一个拥有 128 个核心和 16 个内存分区的 GPU。平面网格互连需要 12x12 网格(144 个节点),这可能过于庞大和耗电。相反,可以设计一个层次化网格互连,具体如下:
- 将 128 个核心分为 16 个集群,每个集群包含 8 个核心。
- 在每个集群内部,使用 8x8 网格连接核心和局部内存分区。
- 使用 4x4 全局网格连接 16 个集群。
这种层次化设计减少了互连的总体复杂度和功耗,同时仍能提供高带宽和可扩展性。局部网格可以高效地处理集群内部通信,而全局网格则实现集群间通信。远程内存分区访问
图8.7说明了分层网格互连设计。
全局网格 (4x4)
集群 0 集群 1 集群 2 集群 3 +-----------+-----------+-----------+-----------+ | | | | | | 本地 | 本地 | 本地 | 本地 | | 网格 | 网格 | 网格 | 网格 | | (8x8) | (8x8) | (8x8) | (8x8) | | | | | | +-----------+-----------+-----------+-----------+ | | | | | | 本地 | 本地 | 本地 | 本地 | | 网格 | 网格 | 网格 | 网格 | | (8x8) | (8x8) | (8x8) | (8x8) | | | | | | +-----------+-----------+-----------+-----------+ | | | | | | 本地 | 本地 | 本地 | 本地 | | 网格 | 网格 | 网格 | 网格 | | (8x8) | (8x8) | (8x8) | (8x8) | | | | | | +-----------+-----------+-----------+-----------+ | | | | | | 本地 | 本地 | 本地 | 本地 | | 网格 | 网格 | 网格 | 网格 | | (8x8) | (8x8) | (8x8) | (8x8) | | | | | | +-----------+-----------+-----------+-----------+
图8.7: 大型GPU的分层网格互连设计。
## 结论
互连和芯片内网络设计在现代GPU的性能、可扩展性和效率中发挥着至关重要的作用。随着内核和内存分区数量的不断增加,互连必须提供高带宽、低延迟和高效的通信。
GPU互连设计的关键方面包括:以下是提供的中文翻译:
GPU 体系结构中的互联网络
GPU 体系结构中的互联网络涉及拓扑结构、路由算法、流量控制机制和工作负载特征。网格和交叉开关拓扑在 GPU 中广泛使用,但对于更大规模的设计,分层和混合拓扑可能会被采用。自适应路由算法和先进的流量控制技术可以帮助提高网络性能和效率。
设计可扩展和高效的互连需要仔细考虑带宽供给、功耗和面积优化以及可靠性等因素。分层设计、功耗门控和容错技术等方法可以帮助解决这些挑战。
随着 GPU 架构的不断发展和并行工作负载需求的增加,互连和片上网络设计将继续成为研究和创新的活跃领域。新型拓扑结构、路由算法和节能设计将对实现下一代高性能、高能效 GPU 至关重要。