问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

高性能计算应用优化之并行与通信调优

创作时间:
作者:
@小白创作中心

高性能计算应用优化之并行与通信调优

引用
CSDN
1.
https://blog.csdn.net/u013206206/article/details/142420469

高性能计算(HPC)在科学计算、工程模拟等领域发挥着重要作用。为了充分发挥并行计算系统的性能,需要对应用程序进行优化,特别是在并行和通信方面。本文将从负载平衡、非阻塞通信、进程间同步、通信融合、基于拓扑感知的通信以及进程重排等多个维度,深入探讨高性能计算应用的优化策略。

负载平衡

负载均衡是指在并行程序中,确保每个处理器或计算节点上的任务量大致相等,以充分利用所有的计算资源,并避免出现部分处理器闲置而其他处理器繁忙的情况。实现负载均衡可以通过以下方法来实现:

  • 运行时任务分配:在程序启动时尽量均衡地调整任务的分配,根据任务特性对任务进行划分,以实现负载均衡。对于网格类的计算任务,可以使用Zoltan或MOAB等工具对网格进行划分,使各进程的任务量和进程间的通信量大致相等。

Zoltan提供了一系列用于负载平衡、图划分、分布式数据管理和均衡的算法、工具和接口,这些功能使得Zoltan成为了在并行计算环境中处理大规模离散问题的强大工具。Zoltan提供了各种负载平衡算法,用于动态地分配计算任务到并行计算集群中的处理器,以最大化计算资源使用效率。

对图计算相关的任务,可以使用Metis或ParMetis对图进行划分,使进程间通信量最小。Metis是一种用于图分割和有限元分析的程序库,它提供了一组用于解决大型离散问题的算法,如图划分和有限元网格划分,有助于优化计算资源的利用和提高程序性能。对海洋模式等具有海陆分布的程序,可以通过预处理对网格进行划分,使各进程分配到的有效网格点大致相等。

  • 数据分布均衡:对于数据并行的程序,通过合理地分布数据来实现负载均衡,使每个处理器上的任务量相近。

  • 动态负载均衡算法:使用动态负载均衡算法来动态地调整任务分配,使得处理器的负载保持均衡。此类方法一般用于worker-master结构的程序,即主进程分发作业,工作进程计算完成后返回结构。

非阻塞通信

MPI内部通信函数分为阻塞函数(如MPI_Send)和非阻塞函数(如MPI_Isend)。阻塞函数在执行通信时会一直阻塞到通信完成。非阻塞函数在执行通信时会在函数执行完后立即返回,不用等待数据发送完毕。使用非阻塞通信函数使得进程在与另一个进程通信的同时能够继续参与计算,实现了通信与计算的重叠。非阻塞通信可以与MPI_Wait或MPI_Test等函数配合使用,从而最大限度地减少等待时间。

不过,非阻塞通信也有一些隐含的问题。首先,发送数据使用的缓冲区必须要等到数据发送结束才能够使用。其次,在通信量较大、进程间计算量不均衡导致部分非阻塞通信请求等待较长时,非阻塞通信可能会使MPI内部缓冲区不断增大,导致通信性能下降。

进程间同步

一般而言,进程间的计算负载是基本相同的,但也存在部分进程计算负载远高于其他进程的情况。这种情况下进程开始通信的时间不同,可能会降低通信的效率。在某些时候使用MPI_Barrier进行进程间同步,可能会提高整体的运行效率。建议使用者在分析模式存在明显负载不均问题后,寻找关键点进行添加,不建议随意添加MPI_Barrier。

在使用单边通信(MPI_Get/MPI_Put)时,在通信前加入MPI_Barrier也可能会解决通信效率低下或死锁问题。

通信融合

MPI_Send/MPI_Recv点对点通信函数与MPI_Gather/MPI_Allgather等集合通信函数均可以对数组进行通信操作。在某些并行程序中存在对每个变量进行一次Send-Recv操作的现象,由于每次Send-Recv操作都需要建立一次连接并在通信完成后释放,单次通信的通信量较少的话会使通信开销急剧增长。

面对这种情况,可以将多次通信的数据合并到数组中,将多次通信合并为一次通信。在科学计算、AI中均有应用。

基于拓扑感知的通信

大量研究表明,利用拓扑结构信息设计拓扑相关的通信算法能够显著提高MPI_Alltoall等集合通信的效率。例如上文中I_MPI_ADJUST系列变量中即可调整使用不同的集合通信算法,例如基于拓扑结构的和基于NUMA的。一般的基于拓扑感知的通信分为两个部分,对于可以使用共享内存的拓扑,使用共享内存进行通信(例如节点内);对于不能使用共享内存的拓扑,使用点对点通信进行通信(例如节点间)。例如,对与Allreduce通信,可以对节点进行分组,通过节点内Reduce,节点间Allreduce,然后节点内Bcast的步骤,完成 Allreduce 操作,这种方法充分利用了节点内通信的高带宽,弱化节点间的低网络带宽带来的影响。

更进一步的,可以考虑机房内的3层拓扑结构(机器内->机器间交换机->上层交换机/路由器),以及节点间不同switch的带宽不同,对节点进行再次分组,形成更准确的拓扑图进行通信。

进程重排

不同应用程序其进程间的通信不尽相同。例如,气象海洋方向的应用由每个进程负责一个子区域的运算,进程之间的通信以相邻区域之间交换halo区为主,那么相邻进程之间的通信会更加频繁。在程序实际运行中用户可以通过抓取MPI进程间通信信息,得到程序通信热点,对程序进程进行合理排布,将通信更加频繁的进程放置于节点内同一NUMA中,这样可在一定程度上减少通信消耗,进而提升运行性能。

需要注意的是不同MPI实现(如hpcx和Intel MPI)其默认的进程排布方式是不同的,默认进程排布方式不一定能实现最优的程序运行效率。在实际运行中用户需要考虑程序的通信模式、numa分布、网卡位置等信息,实现最优的进程分布。下面两图为hpcx与Intel MPI的进程默认分布情况。不同MPI实现其默认进程排布方式不同

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号