AMD Radeon™ GPU Profiler
AMD RGP 让您能够前所未有地深入了解 GPU。轻松分析图形、异步计算使用情况、事件计时、管线停顿、屏障、瓶颈和其他性能低效之处。
本页内容
现代硬件架构日益复杂,包含多个套接字、每个中央处理单元 (CPU) 拥有众多核心、图形处理单元 (GPU)、内存控制器、网络接口卡 (NIC) 等。GPU 或内存控制器等外围设备通常位于 CPU 套接字附近。此类设计在优化内存访问时间、数据传输时间等方面带来了有趣的挑战。根据系统的构建方式、硬件组件的连接方式以及运行的工作负载,以特定的方式使用系统资源可能会更具优势。在本文中,我们将讨论亲和性、放置和顺序在提高高性能计算 (HPC) 工作负载性能方面的作用。我们还将提供一个简短的案例研究,以帮助您熟悉 Frontier 超级计算机节点上的性能考量。在 后续文章中,我们还将为您提供理解系统硬件拓扑并相应设置应用程序亲和性所需的工具。
在非统一内存访问 (NUMA) 系统中,资源被逻辑地划分为多个域或节点。尽管所有处理器核心都可以读写系统中的任何内存,但每个处理器核心都有本地内存与之关联,以及非本地或远程内存,这些内存与其他处理器核心关联,或者被其他处理器共享。从本地内存访问数据比从远程内存访问数据更快。这种延迟尤其在高跨套接字互连的数据访问中更高。对于本地访问,CPU 核心的内存争用会减少,从而提高带宽。因此,在这些系统中,将进程及其线程分散到多个 NUMA 域中以均匀利用系统所有资源非常重要。
NUMA 系统可以配置为每个套接字有多个域。每个套接字域 (NPS) 配置在启动时执行,通常由大型计算集群的管理员执行。例如,在双套接字节点中,通常会发现 NPS1 或 NPS4 配置,其中每个套接字设置为具有 1 或 4 个 NUMA 域。所有内存控制器、处理器核心、NIC、GPU 以及其他类似资源都根据它们之间的物理连接方式在各个 NUMA 域之间进行划分。
考虑一个双套接字节点,该节点总共有 16 个内存通道。在 NPS1 情况(每个套接字有一个 NUMA 域)下,每个套接字有 8 个内存通道。在这种情况下,内存访问将在所有 8 个内存通道之间交错,从而获得统一的带宽。相比之下,在 NPS4 配置下,套接字中的每个 NUMA 域的内存访问将在 2 个内存通道之间交错。如果所有进程都分布在各个 NUMA 域中,这种减少的争用可能会潜在地提高实现的内存带宽。
进程及其线程在处理器核心上的调度由操作系统 (OS) 控制。当资源稀缺且被多个进程共享时,操作系统会管理进程的抢占。当操作系统决定重新调度进程时,它可能会选择一个新的处理器核心。在这种情况下,任何缓存的数据都必须移动到更靠近新核心的缓存中。这会增加延迟并降低工作负载的性能。操作系统不了解并行进程或其线程。对于多进程作业,这种进程移动和相关数据移动可能会导致所有其他进程在同步屏障处等待更长时间。OS 调度程序需要软件开发人员的帮助来有效管理 CPU 和 GPU 的亲和性。
亲和性是一种允许进程指示硬件组件偏好设置的方式,以便给定进程始终被调度到同一组计算核心,并能够高效地访问本地内存中的数据。进程通常可以固定到属于同一 NUMA 域的资源上。设置亲和性可以提高缓存的重用率和 NUMA 内存局部性,减少资源争用,降低延迟,并减少每次运行之间的变化。亲和性对于在 CPU 核心上运行的进程及其在 CPU 内存中的数据放置至关重要。在具有 CPU 和 GPU 的系统上,亲和性不太关键,除非主机内存中的数据位置存在瓶颈。如果主机内存中的数据与 GPU 不在同一 NUMA 域中,那么主机和设备之间的内存副本、页面迁移和直接内存访问可能会受到影响。
对于并行进程,亲和性不仅仅是绑定;我们还必须关注放置和顺序。让我们更仔细地研究这两个概念。
放置指示一个作业的进程在哪里。我们的目标是最大化工作负载的可用资源。为了针对不同类型的工作负载实现这一目标,我们可以采取不同的措施。以一些场景为例来说明这一点:
我们可能希望使用所有资源,例如 CPU 核心、缓存、GPU、NIC、内存控制器等。
如果进程有多个线程 (OpenMP®),我们可能要求每个线程在单独的 CPU 核心上运行
在某些情况下,为了避免缓存的颠簸,我们可能只想使用每个物理核心上的一个硬件线程 (HWT)
在每个进程内存不足的情况下,我们可能希望跳过一些 CPU 核心
我们可能希望为系统操作(例如服务 GPU 中断等)保留一些核心,以减少计时抖动
消息传递接口 (MPI) 偏好“批量调度”,而操作系统不知道这些进程是相互关联的
在当今的硬件上,控制放置可能有助于避免计算资源的过度订阅,从而避免对常用资源的非必要争用。正确的放置可以帮助避免计算资源的非统一使用,即某些资源被使用而某些闲置。当进程放置得太分散时,这可能会导致通信性能不佳。最重要的是,通过进程放置,我们可以防止操作系统迁移进程。我们必须注意,OS 和 MPI 中的亲和性控制多年来已大大改进和改变。
顺序定义了并行作业的进程如何在节点的套接字之间分布。有许多方法可以排序进程,如果我们了解应用程序中的通信模式,我们就可以为我们的应用程序选择正确的方法。例如,如果相互通信的进程放置在一起,也许在同一个套接字上,我们可以降低通信延迟。如果我们有一个繁重的工作负载,将其分散到所有可用的计算资源上可能会更好地平衡。
在许多作业调度系统中,默认的排序机制是循环或周期性,进程以循环方式分布在套接字上,如下图所示。在此示例中,8 个 MPI 秩被调度到两个 4 核套接字上。周期性排序有助于最大化每个进程的可缓存空间,并均匀利用节点的资源。
另一种常用的排序机制称为打包或紧凑,即连续的 MPI 秩被分配到同一套接字上的处理器,直到该套接字填满,然后才开始在另一个套接字上调度秩。下图中,对于相同的 8 个 MPI 秩分配到两个套接字的情况,说明了紧凑排序。通过数据局部性,紧密打包进程可以提高性能,前提是通信最多的秩访问同一内存节点中的数据并共享缓存。
仔细选择秩顺序有助于优化通信。我们知道节点内通信比节点间通信更快。应用程序或领域专家可能知道适合当前应用程序的最佳放置。例如,相邻的模板运算最好放在一起。诸如 HPE 的 CrayPat 分析器或 grid_order 等工具可用于检测 MPI 秩之间的通信模式,并生成优化的秩顺序文件,该文件可进一步在运行工作负载时提供给 Cray MPICH。在大型计算站点,Slurm 绑定选项也可能可用。
橡树岭国家实验室 (ORNL) 的 Frontier 超级计算机是基于 HPE Cray 的 EX 架构的系统,配备了优化的第三代 AMD EPYC™ CPU 和 AMD Instinct™ MI250X GPU。在下图(描绘 Frontier 节点拓扑)中,我们看到 64 核 CPU 通过高速 Infinity Fabric™ 链接连接到 4 个 MI250X GPU。我们还注意到,每个 MI250X GPU 包含两个图形计算单元 (GCD),每个 GCD 拥有 64 GB 高带宽内存 (HBM)。CPU 连接到 512 GB DDR4 内存。每个 GPU 中的两个 GCD 之间有四个 Infinity Fabric™ 链接。不同 GPU 之间的 GCD 也通过 Infinity Fabric™ 链接连接,但数量较少。我们看到有 4 个 NIC 直接连接到奇数 GCD。最后,我们看到 CPU 配置为 NPS4 模式,因此每 16 个核心属于一个 NUMA 域。同时多线程 (SMT) 已启用,因此每个物理核心有两个 HWT。
在这个复杂的架构上,仔细选择秩顺序和放置对于优化通信至关重要。让我们看看这个架构的几个方面,并尝试为每个方面提出最佳实践。
在下面的简化图中,我们看到每个 GCD 连接到 8 个 CPU 核心,它们属于同一 NUMA 域。例如,我们看到 CPU 核心 0-7 最接近 GCD 4,而 CPU 核心 48-55 最接近 GCD 0。因此,将进程及其线程固定在最靠近其使用的 GCD 的核心上,将提高主机到设备 (H2D) 和设备到主机 (D2H) 传输的效率。
如图所示,MI250X GPU 的两个 GCD 之间有四个 Infinity Fabric™ 链接,每个方向的总峰值带宽为 200 GB/s。如果我们将通信最多的成对秩放置在同一 GPU 的 GCD 上,这将有助于降低通信延迟。请注意,尽管不同 GCD 对之间的带宽不同,但使用设备缓冲区进行的通信至少与使用主机缓冲区进行的通信一样快。
在下面的图中,我们看到 Frontier 节点上有四个 NIC,它们直接连接到奇数 GCD。因此,使用设备缓冲区(GPU 感知 MPI)的节点间 MPI 通信有望更快。例如,HPE Cray 的 MPI 实现提供了环境变量,用于在进程和默认 NIC 之间选择理想的映射。您可以在 Cray 系统上使用 man mpi 找到有关此内容的更多信息。
AMD GPU 原生支持在同一设备上运行多个 MPI 秩,这些进程共享可用资源,提高利用率。根据应用程序的通信模式,将通信最多的秩打包到同一设备上可以提高性能。如下所示的图中,4 个 MPI 秩在 GCD 4 上运行。这 4 个秩分别固定在 CPU 核心 0、2、4 和 6 上。
在本案例研究中,我们检查了 Frontier 节点的拓扑,这有助于我们理解在运行工作负载时如何最好地绑定、放置和排序进程。在您拥有的任何系统上都需要进行此类分析,以从您的作业中榨取更多性能。我们希望这些想法能帮助您在新系统上优化运行时提出正确的问题。
在并行应用程序中,亲和性涉及放置、顺序和绑定。对于当今复杂硬件架构上的混合应用程序,设置亲和性是优化过程的关键部分。选择正确的绑定、放置和顺序可以帮助提高实现的内存带宽,提高主机和设备之间数据传输的带宽,优化通信,并避免过度的线程或进程迁移。为了实现给定应用程序的适当亲和性,我们需要了解硬件拓扑。理解应用程序的性能限制因素有助于设计最佳策略来使用可用资源。了解进程之间的通信模式可以指导进程的放置。我们还需要了解如何控制应用程序进程和线程的放置。在亲和性博客系列的第二部分中,我们将讨论理解系统拓扑的工具和设置亲和性的技术。
并行和高性能计算,Robert Robey 和 Yuliana Zamora,Manning Publications,2021 年 5 月
在 CPU 和 GPU 上对从头分子动力学 CP2K 代码的性能分析,Dewi Yokelson、Nikolay V. Tkachenko、Robert Robey、Ying Wai Li 和 Pavel A. Dub,Journal of Chemical Information and Modeling 2022 62 (10),2378-2386,DOI: 10.1021/acs.jcim.1c01538
OpenMP 名称和 OpenMP 徽标是 OpenMP 架构审查委员会的注册商标。
HPE 是 Hewlett Packard Enterprise Company 和/或其关联公司的注册商标。
Linux 是 Linus Torvalds 在美国和其他国家/地区的注册商标。
感谢 Bill Brantley 和 Leopold Grinberg 的指导和反馈。