现代硬件架构变得越来越复杂,拥有多个插槽,每个处理单元(CPU)中有许多核心、图形处理单元(GPU)、内存控制器、网络接口卡(NIC)等外围设备。诸如GPU或内存控制器等外围设备通常会局限于一个CPU插槽。本身的结构会在优化内存访问时间、数据传输时间等方面带来有趣的挑战。根据系统的构建方式、硬件组件的连接方式以及运行的工作负载,按特定方式使用系统资源可能会带来优势。在本文中,我们将讨论亲和性、放置和排序在提高高性能计算(HPC)工作负载性能方面的作用。本文还展示了一个简短的案例研究,以帮助您了解超级计算机节点上的性能考虑因素。在中,我们还希望为您提供工具,以便您了解系统的硬件拓扑结构并相应地为您的应用程序设置亲和性。
在非均匀内存访问(NUMA)系统中,资源被逻辑地划分为多个_域_或_节点_。尽管所有处理器核心都可以从系统中的任何内存进行读写,但每个处理器核心都有连接到它的_本地_内存,以及连接到其他处理器核心或与其他处理器共享的_非本地_或_远程_内存。从_本地_内存访问数据比从_远程_内存访问数据更快。尤其是跨越插槽到插槽互连的数据访问,这种延迟会更高。通过本地访问,可以减少来自CPU核心的内存争用,从而提高带宽。因此,在这样的系统中,将进程及其线程分布在多个NUMA域中非常重要,以便系统的所有资源都能被均匀使用。
NUMA系统可以配置为每个插槽有多个_域_。每个插槽的NUMA域(NPS)配置是在引导时进行的,通常由大型计算集群的管理员完成。例如,在双插槽节点中,常见的配置为NPS1或NPS4,其中每个插槽被设置为具有1或4个NUMA域。所有内存控制器、处理器核心、网卡(NIC)、图形处理单元(GPU)和其他类似资源,均根据它们彼此的物理连接方式被划分到不同的NUMA域中。
以一个具有16个内存通道的双插槽节点为例。在NPS1的情况下,每个插槽有一个NUMA域,每个域包含8个内存通道。在这种情况下,内存访问将在所有8个内存通道中交错进行,从而实现均匀的带宽。相比之下,在NPS4配置中,每个插槽中的4个NUMA域内的内存访问将在2个内存通道中交错进行。这种减少的争用可能会在所有进程都分布在各个NUMA域中时显著提高实际的内存带宽。
调度处理器核心上的进程及其线程是由操作系统(OS)控制的。操作系统在资源稀缺且有许多进程共享资源时,管理进程的抢占。当操作系统决定重新调度一个进程时,它可能会选择一个新的处理器核心。在这种情况下,任何已缓存的数据都必须移动到更接近新核心的缓存中。这会增加延迟并降低工作负载的性能。操作系统并不了解并行进程或其线程。在多进程作业的情况下,这种进程移动和相关的数据移动成本可能会导致所有其他进程在同步屏障上等待更长时间。操作系统的调度程序需要软件开发人员的辅助,以有效管理CPU和GPU的亲和性。
亲和性是一种使进程能够表明对硬件组件的偏好方式,以便将给定的进程始终调度到同一组计算核心,从而能够高效地访问本地内存的数据。进程可以固定在通常属于同一NUMA(非一致性内存访问)域的资源上。设置亲和性可以提高缓存重用率和NUMA内存局部性,减少资源争用,降低延迟并减少每次运行之间的变异性。对于在CPU核心上运行的进程及其在CPU内存中的数据放置,亲和性极其重要。在具有CPU和GPU的系统上,除非主内存中数据的位置出现瓶颈,否则亲和性就不那么关键。如果主内存中的数据不在与GPU相同的NUMA域中,那么主机和设备间的内存复制、页面迁移以及直接内存访问可能会受到影响。
对于并行进程,亲和性不仅仅是绑定;我们还需要关注位置和顺序。让我们更仔细地看一下这两个概念。
放置指的是作业的进程被分配到的位置。我们的目标是最大化工作负载的可用资源。为了实现这一目标,对于不同类型的工作负载,我们可能需要采取不同的方法。请考虑以下场景来说明这一点:
我们可能希望使用所有资源,例如CPU内核、缓存、GPU、NIC、内存控制器等。
如果进程有多个线程(如OpenMP®),我们可能需要每个线程运行在单独的CPU内核上。
在某些情况下,为了避免缓存的抖动,我们可能只希望每个物理内核上使用一个硬件线程(HWT)。
在每个进程的内存不足的情况下,我们可能希望跳过一些CPU内核。
我们可能希望保留一些内核用于系统操作,例如处理GPU中断等,以减少时间抖动。
消息传递接口(MPI)偏好“团体调度”,而操作系统并不知道这些进程是相互连接的。
在当今的硬件上,控制放置可以帮助避免计算资源的超额使用,从而避免不必要的公共资源争用。适当的放置可以帮助避免计算资源的不均匀使用情况,即一些资源被使用而另一些处于空闲。当进程被分配得过于分散时,这可能导致次优的通信性能。最重要的是,通过使用进程放置,我们可以防止操作系统进行进程迁移。我们必须注意,操作系统和MPI的亲和性控制在这些年中有了很大的改进和变化。
顺序定义了并行作业的进程如何分布在节点的多路插槽(sockets)上。有很多种方式来排序进程,如果我们了解应用程序中的通信模式,我们可以选择适合我们应用程序的方式。例如,如果相互通信的进程被放置在彼此附近,可能在同一个插槽上,我们可以降低通信延迟。如果我们有一个负载较重的工作,将其分散到所有可用的计算资源上可能会更好地平衡负载。
在许多作业调度系统中,默认的排序机制是"循环(Round-Robin)"或"轮转(Cyclic)",即进程以循环的方式分布在多个插槽上,如下图所示。在这个例子中,有8个MPI(消息传递接口)进程被调度到两个4核插槽上。循环排序有助于最大化每个进程可用的缓存并均匀地利用节点的资源。
另一种常用的排序机制称为"紧凑(Packed)"或"紧靠(Close)",即连续的MPI进程被分配到同一个插槽上的处理器,直到插槽装满为止,然后再把进程调度到另一个插槽。下图展示了这种排序机制在相同情况下,即8个MPI进程被调度到两个插槽上的情形。如果相互通信的进程存取的数据在同一个内存节点上并共享缓存,紧密排列进程可以因为数据局部性而带来性能提升。
仔细选择进程的排列顺序可以帮助优化通信。我们知道节点内通信比节点间通信更快。应用程序或领域专家可能了解最佳的应用程序布局。例如,邻近的网格点最好被放置在彼此相邻的位置。HPE的CrayPat分析器或`grid_order`工具可用于检测MPI进程间的通信模式,并生成一个最优的进程排列顺序文件,可以在运行作业时提供给Cray MPICH。此外,大型计算中心也可能提供Slurm绑定选项。
橡树岭国家实验室(ORNL)的是基于HPE Cray EX架构的系统,采用优化的第三代AMD EPYC™ CPU和AMD Instinct™ MI250X GPU。在下图展示的Frontier节点拓扑结构中,我们看到核CPU通过高速Infinity Fabric™链路连接到4个MI250X GPU。我们还观察到,每个MI250X GPU由两个图形计算芯片(GCD)组成,每个GCD具有 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最接近GCD4,而CPU核心48-55最接近GCD0。因此,将进程及其线程固定在最接近它使用的GCD的核心上,将提高主机到设备(H2D)和设备到主机(D2H)传输的效率。
如下面的图所示,MI250X GPU的两个GCD之间有四个Infinity Fabric™链路,总共在每个方向上提供200 GB/s的峰值带宽。如果我们将通信最频繁的进程对放置在同一个GPU的GCD上,可以减少通信延迟。这一点对优化通信有利。请注意,虽然不同的GCD对之间的带宽不同,但使用设备缓冲区的通信至少同样快于使用主机缓冲区的通信。
如下面的图所示,一个Frontier节点上有四个NIC,它们直接连接到奇数编号的GCD。因此,使用设备缓冲区进行的节点间MPI通信(GPU Aware MPI)预期会更快。HPE Cray的MPI实现,例如,提供环境变量来选择进程和默认NIC之间的理想映射。可以在Cray系统上使用`man mpi`获取更多信息。
AMD的GPU原生支持在同一个设备上运行多个MPI进程,其中进程共享可用资源,提高了利用率。根据应用的通信模式,将通信最频繁的进程打包在同一个设备上可以提高性能。如下图所示,GCD 4上运行了4个MPI进程。这4个进程分别固定在CPU核心0、2、4和6上。
在这个案例研究中,我们检查了Frontier节点的拓扑结构,这帮助我们理解在运行工作负载时应该如何绑定、放置和排列进程。在任何系统上进行这种分析都是必要的,以便从作业中提取更多性能。我们希望这些想法能够帮助你在为新系统优化运行时提出正确的问题。
在并行应用中,亲和性涉及到位置、顺序和绑定。对混合应用在当今复杂硬件架构上的优化来说,设定亲和性是一个关键环节。选择合适的绑定、位置和顺序可以帮助提高实际实现的内存带宽、主机与设备间的数据传输带宽、优化通信,并避免过多的线程或进程迁移。为了实现一个给定应用的正确亲和性,我们需要了解硬件拓扑。理解应用的性能因素可以帮助设计最佳策略以利用可用资源。了解进程之间的通信模式可以指导进程的布置。我们还需要知道如何控制应用进程和线程的布置。
《并行与高性能计算》,Robert Robey和Yuliana Zamora,Manning出版社,2021年5月
《CP2K代码在CPU和GPU上的从头算分子动力学性能分析》,Dewi Yokelson, Nikolay V. Tkachenko, Robert Robey, Ying Wai Li, and Pavel A. Dub,《化学信息与建模杂志 2022 62 (10)》,2378-2386,DOI: 10.1021/acs.jcim.1c01538
OpenMP名称和OpenMP标志是OpenMP架构审查委员会的注册商标。
HPE是惠普企业公司及/或其子公司的注册商标。
Linux是Linus Torvalds在美国和其他国家的注册商标。
我们感谢Justin Chang, Bill Brantley, 和Leopold Grinberg的指导和反馈。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务