OpenMP和MPI解释

5
几分钟前,我偶然发现了一些文字,这让我想起了一直在我脑海中徘徊的问题,但我没有地方可以询问。
因此,希望这可能是一个人们有着实际经验的地方,我想知道OpenMP和MPI之间的区别是什么?
我已经完整阅读了维基百科文章,并理解了其中的部分内容,但仍在思考; 对于希望有一天进入并行世界的Fortran程序员(现在只学习OpenMP的基础知识),哪种方法更具有未来性?
感谢您的所有评论。

Fortran 对我来说听起来不是“未来可靠”的... - Andrey
7
自80年代以来,人们一直在说这个。至今仍然存在,并且对于科学编程和数值方法仍然非常重要。 - duffymo
3个回答

10

OpenMP主要用于紧密耦合的多进程——即在同一台机器上的多个处理器。它大多用于像启动多个线程并行执行循环等任务。

MPI主要用于松散耦合的多进程——即通过网络相互通信的计算机集群。它可以被用于单台机器上,作为一种网络的退化形式,但它相对较少地利用其作为单台机器的优势(例如,“节点”之间具有极高的带宽通信)。

编辑(回应评论):对于一个由24台机器组成的集群,MPI成为明显的选择。如上所述(与@Mark的评论类似),OpenMP主要用于共享内存的多处理器。当你没有共享内存时,MPI成为明显的选择。

同时,假设您将使用多处理器的机器(还有其他什么了吗?),您可能希望使用OpenMP来将负载分布到每台机器的所有处理器上。

但是请记住,相比MPI,OpenMP通常更快/更容易投入使用。根据您需要多少加速,扩大规模而不是外部扩展(即每台机器具有更多处理器)可能使软件开发更快/更便宜,尽管这很少提供每个内核的最低价格。


Jerry,谢谢你的回答。为了避免重复,你能否看一下我在下面给Mark的评论并分享一些想法呢? - Friedrich

8
另一个与@Jerry已经写过的内容不矛盾的观点是,OpenMP用于共享内存并行化,MPI用于分布式内存并行化。在分布式系统上模拟共享内存很少令人信服或成功,但在共享内存系统上使用MPI是一种完全合理的方法。
当然,所有(?)多核PC和服务器现在都是共享内存系统,因此OpenMP的执行模型广泛适用。MPI倾向于在处理器通过网络相互通信的集群上发挥作用(有时称为互连,并且通常具有比办公室以太网更高的规格)。
就应用程序而言,我估计大部分并行程序可以成功地使用OpenMP或MPI实现,并且你在两者之间的选择可能最好由硬件的可用性驱动。我们中的大多数人(并行主义者)认为OpenMP比MPI更容易掌握,并且使用OpenMP比使用MPI更容易逐步并行化现有程序。
但是,如果您需要使用超过一个盒子中的处理器(这个数字正在稳步增加),那么MPI是更好的选择。您还可能遇到混合编程的想法-例如,如果您有一组多核PC,则可以在PC之间使用MPI,在PC内部使用OpenMP。我没有看到任何证据表明编程的额外复杂性会带来改进的性能,我也看到了一些证据表明这并不值得努力。
正如其中一条评论已经指出的那样,我认为Fortran在并行,高性能,科学和工程应用领域是具有未来保障的。标准的最新(2008)版本将共数组(即分布在具有非本地和本地访问的存储器系统上的数组)直接纳入语言中。甚至有一两个此功能的早期实现。我还没有任何经验,预计未来几年将存在一些问题。
编辑以回应OP评论中的几个要点……
不,我不认为通过OpenMP进行并行计算是一个坏主意。我认为OpenMP和MPI(或更准确地说,它们实现的并行计算模型)是互补的。我肯定同时使用两者,并且我认为大多数专业并行程序员也是如此。自离开大学约6年后,我没有做过太多OpenMP,直到大约2年前,当时多核处理器真的开始无处不在。现在,我可能两者都做相等的量。
就你的进一步(自我)教育而言,我认为Chapman et al所著的书籍《使用OpenMP》比Chandra的书籍更好,仅因为它更加时新。我认为Chandra的书籍先于OpenMP 2,而Chapman的书籍则先于值得学习的OpenMP 3。
在MPI方面,Gropp等人所著的书籍 Using MPIUsing MPI-2 是必不可少的;这可能是因为它们是 (就我所知) 唯一的教程介绍MPI,而不是因为它们的卓越性。但我不认为它们很差,要知道它们并没有太多竞争。我也喜欢Karniadakis和Kirby所写的Parallel Scientific Computing in C++ and MPI,但根据您在科学计算方面的了解程度,您可能会发现其中大部分内容过于基础。
但是,我认为该领域完全缺乏(希望有人能证明我错了吗?)关于并行执行程序设计的好教材(或一些教材),这些教材可以帮助有经验的Fortran程序员从串行程序设计向并行程序设计跨越。有很多关于如何并行化循环或循环嵌套的信息,但是关于在结构化正半定矩阵(或其他)上并行化计算的选项却不多。为了获取这种水平的信息,我们必须深入研究研究论文(如果您在学术机构工作,ACM和IEEE数字图书馆绝对值得适度年费 —— 您的图书馆可能已经订阅了这些以及更多内容,我很幸运,因为我的雇主支付我的专业学会会员资格和附加部分,但如果他们没有,我就必须自己支付)。
至于您计划使用24个处理器(CPU?还是核心?其实并不重要,只是问一下)的新实验室,那么您应该根据您的钱包深度来决定。如果您有负担得起的能力,我建议:
— 考虑一台共享内存计算机,一年前Sun、SGI和IBM都可以提供具有这种数量处理器核心的共享内存系统,我不确定当前市场状况如何,但既然您有时间到二月份作出决定,那么值得去了解一下。共享内存系统为您提供了共享内存并行处理的选项,而集群则没有,并且在共享内存平台上进行消息传递应该会非常快速。(顺便说一句,如果您走这条路,请对系统的这方面进行基准测试,共享内存计算机上有一些糟糕的MPI实现。)在共享内存计算机上良好的MPI实现(我最后一次使用的是512处理器的SGI Altix)不发送任何消息,只是移动一些指针,并且因此快得惊人。Altix的问题是,超过128个处理器时,内存总线往往会被所有流量淹没;那时需要切换到集群或MPP盒子上的MPI。
— 再次,如果您有负担得起,我建议找一个系统集成商为您交付一个运行良好的系统,避免自己构建集群(或其他什么)。如果您和我一样,首先是程序员,其次才是不情愿的系统集成商,这种方法更容易,并且可以为您提供一个可以上手编程的工作系统。
如果你负担不起昂贵的选项,那么我建议选择尽可能多的4核或8核每个机箱的机架式服务器(选择取决于价格,甚至今天考虑每个机箱16核也是值得的),而且现在,我会计划每个核心至少4GB RAM。然后你需要最快的互连技术,你能负担得起千兆以太网就可以了,但Infiniband(或者其他一个我忘记名字的)更好,尽管价格上涨明显。你还需要一台PC作为新集群的主节点,运行作业管理系统和其他东西。在互联网上有大量关于构建和运行集群的优秀材料,通常在Beowulf的标题下,它被认为是第一个“自制”集群的名称。
现在,既然你有到2月的时间来启动实验室,就解雇两个同事并将他们的PC变成一个小型Beowulf。下载并安装一个看起来合适的MPI安装程序(OpenMPI很好,但还有其他选择,你的操作系统可能会指定另一种选择)。现在你可以开始准备实验室了。
PS如果你能以其他方式找到2台PC,就不必解雇2个人。这些PC可以是旧的、不足以用于桌面的,它们只是你和你的同事(如果还有)的培训平台。它们越相似,就越好。

Mark,感谢您的回答,写得非常好,清晰明了。那么,您认为我决定从OpenMP入手“进入并行起步阶段”不一定是坏事,也不会排斥MPI,如果有一天我希望或被迫出于必要性扩展我的技能?(附言:我从未怀疑过Fortran的未来可持续性;就像有人已经说过“它在80年代已经死了”,然后在90年代,然后在... ;) - Friedrich
让我解释一下我为什么要问。在我的工作场所,有一个建立实验室的想法。大约有24台机器,希望解决一些目前需要太长时间计算的问题(一个相对强劲的机器需要大约26个小时,这是不切实际的)。因此,我的一位同事和我开始研究并行计算(我们都没有任何并行化经验,但我们拥有强大的Fortran背景,他来自F66,我从F90开始,两者都成功地使用了2003功能)。 - Friedrich
现如今,我们尽可能在购买硬件之前学习更简单的模型。在这方面我们有相对较大的自由,可以根据预算进行选择(在合理的范围内)。我开始使用OpenMP不仅是因为它似乎比较简单,而且我还找到了一本相当不错的书("Parallel programming in OpenMP" by Chandra)。鉴于这些情况,您认为您能提供更多建议吗?从您的个人资料上看,您在这个计算领域相当有经验。我们的时间窗口大约是到明年二月份。 - Friedrich

2
如上所述,由于增量并行化,OpenMP肯定比MPI更容易编程。 OpenMP主要用于细粒度并行性(循环级别),而MPI更多地是粗粒度并行性(域分解)。 两者都是获得并行性能的好方法。
我们有一个OpenMP版本和一个MPI版本的软件(Fortran),客户根据需求使用两种版本。
随着多核架构的当前趋势,混合OpenMP-MPI是另一种可行的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接