分布式内存计算入门:定义、目的及原理

2014年 2月 20日

在“混合建模”系列的上一篇文章中,我们讨论了有关共享内存计算的基础知识:什么是共享内存、为什么使用共享内存,以及 COMSOL 软件如何在计算中利用共享内存。今天,我们将讨论混合并行计算的另一个组成分支:分布式内存计算。

进程与集群

阅读完上一篇博客后,我们明白了共享内存计算是指将一个程序的任务分割成多个较小的、可在一个节点内并行运行的工作单元,即线程。这些线程共享了对某一部分内存的访问,故称之为共享内存计算。与之相比,分布式内存计算 的并行过程是通过多个进程(执行多线程)来完成的;每个进程都拥有各自的内存空间,其他进程无法访问。在分布式内存 方法中,这些进程分布在多台计算机、多个处理器和/或多个内核中,共同组成了一个并行程序。

简而言之,内存不再是共享的,而是被分配给各个进程(参见本系列第一篇博客中的图表)。

要理解分布式计算的设计意图,我们先来了解集群计算 这一基本概念。一台计算机的内存和计算能力是有限的。为了提升性能及增加可用的内存量,科学家开始将几台计算机连接在一起,组成了所谓的计算机集群

拆分问题

通过计算机集群来分配物理进程,这种方法将并行问题的复杂度提升到了一个新水平。每个问题都要分割成更小的单元——不仅数据需要拆分,对应的任务也要分配给各台机器。以矩阵类的问题为例,在执行庞大的阵列运算时,阵列可以拆分成区块(可能是不连续的,也可能是重叠的),每个私有区块由一个进程专门负责。当然,每个区块上的运算和数据可以和其他区块上的运算和数据相互耦合,所以在进程之间引入通信机制成为了必要。

为了实现通信,其他进程需要的数据或信息会被收集成数据块,然后通过发送消息与其他进程交换数据。这种方法被称为消息传递,模式可以是全局交换(多对多、多对一、一对多)或点对点交换(一个点发送进程,一个点接收进程)。根据整个问题的耦合程度,消息交换可能需要大量的通信。

人们希望尽可能在本地处理数据和执行运算,目的是尽量减少通信量。

图片展示了消息在计算机之间的传递。
完全图描述了需要进行多对多发送的消息数量。消息数量和使用的计算节点数量呈二次函数关系。

提高计算效率,求解大型问题

使用计算机集群时,科学家可以从两个方面受益于额外的资源:

第一,由于内存增多、计算能力增强,科学家可以求解更大型的问题。具体来说,一方面增加额外的进程,另一方面保持每个进程的工作负载(即子问题的规模和运算数量)水平不变,由此在相同的时间内解决规模更大的问题。这叫做弱扩展

第二,科学家可以在保持整体问题规模不变的前提下,将原问题分割成更多更小的子问题,并分配给更多进程。这样一来,每个进程的工作量减小,就可以更快地完成任务。在最优情况下,假如一个规模固定的问题被分配给 P 个进程,那么计算速度就会提高 P倍。相比于单位时间(一个小时、一天等)内运行一次仿真,第二种方法允许在单位时间内运行 P 次仿真。这种方法称为强扩展

简而言之,分布式内存计算可以帮助您在相同的时间内解决规模更大的问题,或者缩短相同问题的求解时间。

通信需求

接下来,我们将讨论消息传递的细节。进程如何知道程序的其他部分正在执行哪些任务?正如上文所述,进程必须发送和接收其他处理器或自己需要的信息和变量。这一过程反过来给系统带来了一些缺陷,突出问题是通过网络发送消息必须耗费大量额外的时间。

打个比方,我们可以回忆一下介绍共享内存的博客举出的会议室例子:与会者们围绕着一张圆桌进行协作,所有信息都免费提供给桌子前的每一位与会者,他们可以自由地获取并编辑文件,甚至可以并行工作。在本文中,会议室和桌子被换成了单人办公室,雇员坐在各自的办公间内处理面前的文件。

在新情景中,一位名叫爱丽丝的雇员修改了报告 A。她想提醒同事鲍勃,并且将修改内容传达给他。现在她需要停止工作,离开自己的办公室,走到鲍勃的办公室,将新信息递交给他,然后回到自己的办公桌继续工作。这比在同一间会议室中直接把一张纸递给给对方要麻烦得多。最糟糕的部分是,爱丽丝不得不花比修改本身更长的时间去提醒同事她做出了修改

在新版类比中,通信过程很可能成为系统的瓶颈,拖慢整体的工作进度。假如我们计划减少必要的通信量(或者加快通信速度,比如在办公室安装电话或更高效的通信网络),就可以缩短等待消息传递的时间,留出更多时间来计算数值仿真。对于分布式内存计算而言,瓶颈通常是在进程间传递电子数据的技术,您也可以直接理解为节点之间的电线。目前,可实现高吞吐量、低延迟的行业标准是 Infiniband,使用 Infiniband 技术传递消息的效率远远高于以太网。

为什么使用分布式内存?

分布式内存计算拥有众多优点,其中一个优点与共享内存相同,那就是为了增强系统的计算能力,不管我们在集群中增加内核、插槽还是节点,都可以启动更多进程,充分利用新添加的资源。运用更强大的计算能力,我们可以更快地获得仿真结果。

使用分布式内存的另一个好处是,每向集群中添加一个计算节点,我们就会得到更多可用内存。这意味着我们不再受限于主板分配的内存空间,因此理论上可以计算任意大的模型。在多数情况下,分布式内存计算的扩展性强于共享内存计算,也就是说,在加速比达到饱和之前,可以使用的进程数(与可以使用的线程数相比)会多得多。

柱状图显示了每日可进行的仿真次数与使用的进程之间的关系。
纵轴:针对下方图像中的穿孔板消声器模型,每日可进行的仿真次数。横轴:使用的进程数量。通信网络使用了千兆以太网。前四个进程在一个计算节点上执行,第四个进程之后才会用到以太网。在仿真中,第四个和五个进程之间的差异很小,说明了即使对于参数化问题,缓慢的通信网络依旧会产生明显的影响。所使用的计算节点装有 Intel® Xeon® E5-2609和 64 GB DDR3 @1600 MHz。

然而,我们也必须认识到分布式内存的局限性。与共享内存的情况一样,有些问题十分适合使用分布式内存进行计算,有些问题则不适合。此外,除了问题是否容易并行化,我们还要考虑问题求解过程需要的通信量。

我们以一个瞬态问题为例,在这个问题中,大量粒子相互作用,每当系统完成一个运算步骤,所有的粒子都需要获取每个其他粒子的信息。假定每个粒子都由各自的专属进程进行计算,那么此示例产生的通信量可以用完全图来描述(见第一张图),并且每一次迭代的消息数量会随着粒子数和进程数的增加而迅速增长。相比之下,参数化扫描中的参数值可以分别进行独立计算,几乎不需要任何通信,因此通信瓶颈对它的限制作用相对较小。

用于测试加速比的小型消声器参数模型
用于测试加速比的模型。这是一个小型参数化模型(75 万个自由度),使用 PARDISO 直接求解器完成求解。此模型可以在“案例下载”中获取。

COMSOL 如何发挥分布式内存计算的优势

有权访问网络浮动许可证(FNL)的用户可以在一台多处理器单机、集群上,甚至是云端使用 COMSOL 软件的分布式处理功能。COMSOL 软件的求解器默认在分布式模式下运行,无需进一步设置。由此,您可以在相同的时间内运行规模更大的仿真,或以更快的速度完成同等规模的仿真。不管是哪种方式,COMSOL Multiphysics 都可以帮您提高生产率。

当计算参数化扫描时,COMSOL 的分布式处理功能也可以发挥重要作用。您可以将应用不同参数值的求解过程自动分配给打开 COMSOL Multiphysics 时启动的各个进程。因为在此类参数化扫描中,这些求解过程可以互相独立计算,所以被称为“易并行问题(embarrassingly parallel)”。在良好的互联网络中时,加速比基本等于进程数量。

如果希望了解更多有关分布式内存计算的内容,推荐您阅读《COMSOL 参考手册》。手册列举了多个如何在分布式模式下启动 COMSOL 的示例。如果希望详细了解如何提交计算任务,您还可以参考高性能计算(HPC)集群的用户指南。

“混合建模”系列的下一篇博客中,我们将进一步探究混合建模的概念,请不要错过!


评论 (0)

正在加载...
浏览 COMSOL 博客