另一种观点与@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 MPI和Using 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 可能陈旧且不适合桌面使用,它们只会成为您和您的同事的培训平台(如果您还有的话)。它们越接近相同越好。