5

A few minutes ago I stumbled upon some text, which reminded me of something that has been wondering my mind for a while, but I had nowhere to ask.

So, in hope this may be the place, where people have hands on experience with both, I was wondering if someone could explain what is the difference between OpenMP and MPI ?

I've read the Wikipedia articles in whole, understood them in segments, but am still pondering; for a Fortran programmer who wishes one day to enter the world of paralellism (just learning the basics of OpenMP now), what is the more future-proof way to go ?

I would be grateful on all your comments

4

3 回答 3

10

OpenMP 主要用于紧密耦合的多处理——即同一台机器上的多个处理器。它主要用于诸如启动多个线程以并行执行循环之类的事情。

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

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

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

但是请记住,OpenMP 通常比 MPI 更快/更容易投入使用。根据您需要多少加速,向上扩展而不是向外扩展(即更少的机器,每台处理器更多)可以使软件开发更快/更便宜,即使它很少提供每个内核的最低价格也是值得的。

于 2010-07-02T15:46:50.177 回答
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 年前离开大学以来,直到大约 2 年前,当多核真正开始无处不在时,我并没有做过太多的 OpenMP。现在我可能会做大约等量的两者。

就您的进一步(自我)教育而言,我认为Chapman等人的《使用 OpenMP 》一书比 Chandra 的书要好,只是因为它更新了很多。我认为 Chandra 的书早于 OpenMP 2,而 Chapman 的书早于 OpenMP 3,值得学习。

在 MPI 方面,Gropp等人的书籍,Using MPIUsing MPI-2是必不可少的;这可能是因为它们(据我所知)是唯一的 MPI 教程介绍,而不是因为它们的卓越性。我不认为他们很糟糕,请注意,但他们没有太多的竞争。我也喜欢Karniadakis 和 Kirby的 C++ 和 MPI 中的并行科学计算;取决于您的科学计算知识水平,尽管您可能会发现许多材料过于基础。

但我认为该领域完全缺乏的是(希望有人能在这里证明我错了吗?)是一本关于并行执行程序设计的好教科书(或少数教科书),可以帮助有经验的 Fortran(在我们的例子中)程序员制作从串行到并行程序设计的跳跃。很多关于如何并行化循环或循环嵌套的信息,而不是关于在结构化正半定矩阵(或其他)上并行化计算的选项。对于这种水平的信息,我们必须非常努力地挖掘研究论文(ACM 和 IEEE 数字图书馆非常值得适度的年度费用——如果您在学术机构,您的图书馆可能订阅了这些以及更多,我“很幸运,我的雇主为我的专业协会会员资格和附加服务付费,但如果他们没有”

至于您计划建立一个拥有 24 个处理器(CPU?或核心?,并不重要,只是问)的新实验室,那么您采取的路线应该取决于您口袋的深度。如果你负担得起,我建议:

-- 考虑一台共享内存计算机,当然一年前 Sun、SGI 和 IBM 都可以提供具有这种内核数量的共享内存系统,我不确定市场的当前状况,但既然你有直到 2 月才决定是否值得研究。共享内存系统为您提供了集群没有的共享内存并行选项,并且共享内存平台上的消息传递应该以光速运行。(顺便说一句,如果你走这条路,对系统的这一方面进行基准测试,共享内存计算机上的 MPI 实现会出现一些糟糕的情况。)共享内存计算机上的良好 MPI 实现(我上次的经验是512 处理器 SGI Altix)不发送任何消息,它只是移动几个指针,因此速度非常快。Altix 的问题在于,超过 128 个处理器时,内存总线往往会被所有流量压得喘不过气来。那是在集群或 MPP 盒上切换到 MPI 的时候了。

-- 同样,如果您负担得起,我建议让系统集成商为您提供一个工作系统,并避免自己构建集群(或其他任何东西)。如果像我一样,您首先是程序员,其次是不情愿的系统集成商,那么这是一种更简单的方法,并且会为您提供一个工作系统,您可以在该系统上更快地开始编程。

如果您买不起昂贵的选择,那么我会选择每盒 4 或 8 个内核的机架式服务器(选择取决于价格,今天甚至每​​盒 16 个内核都值得考虑),今天,我计划每个核心至少有 4GB RAM。那么你需要你能负担得起的最快的互连;GB 以太网很好,但 Infiniband(或我忘记名字的另一个)更好,尽管价格上涨很明显。您需要一台 PC 作为新集群的头节点,运行作业管理系统和其他东西。Internet 上有大量关于构建和运行集群的优秀材料,通常在 Beowulf 的标题下,这被认为是第一个“自制”集群的名称。

现在,由于您的实验室要等到 2 月才能启动并运行,所以解雇您的 2 位同事并将他们的 PC 变成迷你贝奥武夫。下载并安装一个看起来可能的 MPI 安装(OpenMPI 很好,但还有其他需要考虑,您的 o/s 可能会决定另一种选择)。现在您可以开始为实验室准备就绪做准备了。

PS 如果你能以其他方式清理 2 台电脑,你就不必解雇 2 个人。PC 可能陈旧且不适合桌面使用,它们只会成为您和您的同事的培训平台(如果您还有的话)。它们越接近相同越好。

于 2010-07-02T16:22:04.030 回答
2

如上所述,由于增量并行化,与 MPI 相比,OpenMP 无疑是更简单的编程方式。OpenMP 主要用于细粒度并行(循环级别),而 MPI 更多地用于粗粒度并行(域分解)。两者都是获得并行性能的好方法。

我们的软件 (Fortran) 有 OpenMP 和 MPI 版本,客户可以根据需要使用这两种版本。

随着多核架构的当前趋势,混合 OpenMP-MPI 是另一种可行的方法。

于 2010-09-14T22:04:12.053 回答