65.9K
CodeProject 正在变化。 阅读更多。
Home

使用高带宽内存优化 Intel® 处理器上的性能

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2023 年 12 月 18 日

CPOL

8分钟阅读

viewsIcon

6764

深入了解 Intel® Xeon® CPU Max 系列的性能调优

量子色动力学(QCD)是亚原子粒子之间强相互作用的理论/研究。格点 QCD 通过将粒子和力表示为在空间和时间域上离散化的格点来解决 QCD 问题。HotQCD 是一个广泛用于高能物理研究社区的 C++ 混合 MPI/OpenMP* 格点 QCD 模拟框架。

本文描述了为 HotQCD 应用的性能调优技术,以在英特尔® 至强® CPU Max 系列上实现最佳性能。与其它英特尔® 至强® 处理器相比,英特尔® 至强® CPU Max 系列的关键区别在于增加了高带宽内存(HBM)(图 1a)。简单来说,HBM 是一种 3D 堆叠的 DRAM 接口,可提供比 DDR 内存(单堆叠 DRAM)更高的内存带宽性能。英特尔® 至强® CPU Max 系列每个 CPU 插槽最多配备 56 个核心,并配备 HBM2e,形式为每个插槽四堆八个高容量 DRAM 芯片,每个芯片的容量为 2 GB(4 x 8 x 2 = 64 GB HBM/插槽)。

性能分析

具有 HBM 的英特尔® 处理器有多种配置模式:内存(Flat、Cache、HBM-only)和 NUMA(SNC1、SNC4)。每种模式的详细信息超出了本文的范围,但您可以在 英特尔® 至强® CPU Max 系列配置和调优指南中找到更多信息。本文使用的系统配置为 HBM-only 内存模式(无 DDR5)和 SNC4(Sub-NUMA Clustering-4)(图 1b)。

图 1. (a) 英特尔® 至强® CPU Max 系列;(b) 英特尔® 至强® CPU Max 系列采用 HBM-only + SNC4 模式

HotQCD 的性能快照([使用 324(x=y=z=t=32)的格点大小和单个 RHS(右侧)向量进行基准测试])显示,最耗时的函数(dslash,占总执行时间的 90%)受内存带宽限制(即,处理器有大约 50% 的时间因等待内存操作而停顿)(图 2)。

图 2. 使用微架构探索分析从英特尔® VTune™ Profiler 获得的基线性能快照

dslash 的 OpenMP 并行区域显示在图 3 中。在格点的每个点上,通过运算符重载执行一组四个稠密矩阵向量乘法。该函数完全使用英特尔® AVX-512 内建函数进行了向量化,线程之间没有同步。Link_std 进行两次矩阵向量乘法,每个矩阵和向量由九个和三个缓存行组成,总共读取 4 x 2 x (9 + 3) = 96 个缓存行。Link_naik 类似于 link_std,只是其矩阵是通过仅加载七个缓存行来填充的,总共读取 4 x 2 x (7 + 3) = 80 个缓存行。所有内存访问都与缓存行对齐,数据重用量可忽略不计,这清楚地表明该函数受内存带宽限制(FLOP:byte 比率约为 0.9),并且读流量很大[每读取 176(96 + 80)个缓存行,只有三个缓存行被写入内存]。换句话说,处理器需要不断从内存中读取数据才能执行浮点计算。

图 3. HotQCD dslash 代码

内存访问模式

图 4 显示了 link_std 块(第 1517 和 1518 行)在内部(4D 格点的每个点)和外部(格点点)循环中的操作顺序,相同的颜色表示连续的内存区域,不同的颜色表示内存中的大步长(相对于时间内存访问请求)。每个矩阵(九个缓存行,表示 CL)从连续内存加载,在外部循环中具有恒定的 1,172 个元素的步长。1,172 个 FP32 元素的步长(1,172 x 32 字节 = 4,688 字节)会导致每次外部循环迭代访问一个新的 4 KB 页面。加载的连续向量(在内部循环中)也由大步长分隔。然而,它们在外部循环迭代空间中构成一个连续的地址流。与矩阵相比,向量具有更好的访问模式,因为不会跨越 4 KB 页面。最后,每个矩阵向量乘法完全展开为 27 个 AVX-512/ZMM 寄存器。矩阵需要 3 x 3 x 2(用于复数的实部和虚部)= 18 个 ZMM 寄存器。向量需要 3 x 1 x 2 = 6 个 ZMM 寄存器加上三个 ZMM 用于在内部循环中累积结果。

图 4. Dslash 内存访问模式

软件预取

英特尔® 处理器具有各种硬件预取器(L1$、L2$),能够检测流式和步长访问模式(有关更多详细信息,请参阅 英特尔® 64 和 IA-32 架构优化参考手册),但它们都在 4 KB 页面边界内进行预取,并且不跨页面获取数据。由于 HotQCD 中的矩阵以跨越页面边界的步长访问,因此硬件预取的有效性会降低。循环体中存在多个步长访问流,这会进一步加剧硬件预取器的压力,使情况更加复杂。这促使我们研究使用显式软件预取来缓解大访问步长影响的性能影响。换句话说,我们的目标是通过发出预取指令(在 x86 ISA 中可用)来增强硬件预取的有效性,以便在相应计算操作中使用数据之前,预先从内存中获取数据(图 5)。

图 5. 采用软件预取的 Dslash

软件预取的有效性主要受两个因素驱动

  • 预取距离:理想的预取距离取决于诸如工作集大小、循环体中指令的延迟以及正在获取的数据的位置(内存/缓存)等因素。过远的预取可能导致预取的数据在中间迭代工作集中被从缓存中驱逐,而过近的预取则无法隐藏内存层次结构的延迟。无论哪种情况,都会降低软件预取的有用性,甚至可能由于预取指令生成的额外内存访问请求而降低性能,这会给已经饱和的内存流水线队列增加负担。
  • 缓存层次结构:这控制着请求的数据放置到的缓存级别。x86 ISA 具有预取指令,可以将数据放置到 L1、L2 和最后一级缓存中,并提供额外的控制,以最小化非时间访问在较低级别的缓存污染。在某些应用程序中,多级预取机制也会很有益,其中使用更大的预取距离将数据从内存预取到 L2 缓存,并使用较短的距离将数据从 L2 预取到 L1 缓存。

在应用程序中使用软件预取有两种主要机制:英特尔® 编译器标志或预取内建函数。我们选择了后者,因为它为我们提供了更精细的可控性。图 6 显示了与基线性能(仅使用硬件预取器)相比,在不同距离和缓存层次结构下,软件预取 + 硬件预取器的速度提升。通过将数据从 10 个迭代前的站点预取到 L2 缓存,我们获得了 1.13 倍的速度提升。

图 6. 软件预取的性能提升

内存布局

在 HotQCD 中,关键操作是使用间接的迭代共轭梯度(CG)方法计算大矩阵的逆,以求解线性系统。CG 大约需要 2,000 次迭代才能收敛。每次 CG 迭代都通过计算四个矩阵向量乘法(如前所述)然后跨 MPI 进程进行 Halo 交换来计算更新后的向量。在 CG 迭代过程中,矩阵保持不变,只有向量会更新。我们可以利用这一模式,即第一次 CG 迭代将矩阵复制到更高效的非步长/打包格式。在后续迭代中,我们从打包缓冲区加载矩阵(图 78)。

图 7. Dslash 打包矩阵布局

图 8. Matrix packed layout code

通过连续的矩阵内存布局,我们避免了内部和外部循环中的步长访问。这尤其有利,因为硬件预取器在原生矩阵布局(基线)中受到大于 4 KB 的步长的严重压力。CG 需要约 2,000 次迭代,因此第一次迭代中的复制成本已被摊销。由于我们需要将矩阵从原生布局复制到打包缓冲区,因此需要分配额外的内存(对于测试问题大小为 1 GB)。然而,这不是一个限制因素,因为 HotQCD 的总运行时内存占用远低于每个插槽 64 GB 的 HBM 容量。

图 9 显示了基线与打包内存布局的 VTune™ Profiler 快照比较。打包内存布局显示更低的每条指令周期数(CPI)(0.4 vs 1.4)以及更少的因内存请求而暂停的执行槽(28% vs 44%)。

图 9. 基线和打包布局之间的 VTune™ Profiler 比较

总体而言,通过采用打包内存布局,HotQCD 的性能比基线提高了 1.38 倍(图 10)。dslash 内核的性能提升了 1.54 倍,但并未完全转化为整体基准测试的提升,因为打包布局会导致缓存污染,并减慢 dslash 后续的向量操作。这些优化也适用于没有 HBM 的英特尔® 至强® 系统,观察到的性能提升为 1.21 倍(图 11)。

图 10. 英特尔® 至强® CPU Max 系列上 HotQCD 的相对性能加速

图 11. HotQCD 在英特尔® 至强® 处理器和英特尔® 至强® CPU Max 系列上的性能

结论

我们得出以下关键要点:

  • 配备 HBM 的英特尔® 至强® CPU Max 系列比 DDR5 同类产品提供了显著的性能提升:1.66 倍至 1.88 倍。
  • 预取可以进一步提升 HBM 性能:比 HBM 基线提升 1.13 倍。
  • 为了充分调整预取性能,必须理解应用程序的内存访问模式。虽然预取指令成本低廉,但请谨慎使用。
  • 跨越 4 KB 页面边界的大内存访问步长对 HBM 性能不利。如所示,倾向于读取连续内存块而不是步长访问。这可提供最佳 HBM 性能:比基线提高 1.38 倍至 1.54 倍。
© . All rights reserved.