MPI 和 OpenMP 之间有什么区别?

What are the differences between MPI and OpenMP?

我想知道(简而言之)OpenMP 和 MPI 之间的主要区别是什么。

OpenMP 是一种在共享内存设备上编程的方法。这意味着并行性发生在每个并行线程都可以访问所有数据的地方。

您可以将其视为:通过在不同线程之间拆分循环,可以在执行特定 for 循环期间发生并行性。

MPI 是一种在分布式存储设备上编程的方法。这意味着并行性发生在每个并行进程都在自己的内存中工作 space,与其他进程隔离。

你可以这样想:你写的每一段代码都由每个进程独立执行。并行性的发生是因为您完全根据进程 ID 告诉每个进程他们应该处理全局问题的哪一部分。

编写 OpenMP 和 MPI 程序的方式当然也大不相同。

MPI 代表消息传递接口。它是一组关于消息传递(例如发送、接收、广播等)的 API 声明,以及实现中应该期望的行为。

"message passing"的思路比较抽象。这可能意味着在本地进程之间或跨网络主机分布的进程之间传递消息,等等。现代实现非常努力地实现通用并抽象出多种底层机制(共享内存访问、网络 IO 等)。

OpenMP 是一个 API,它的全部目的是使(大概)更容易编写共享内存多处理程序。没有传递消息的概念。相反,使用一组标准函数和编译器指令,您可以编写并行执行本地线程的程序,并控制这些线程的行为(它们应该访问什么资源,它们如何同步等)。 OpenMP需要编译器的支持,所以你也可以把它看成是支持语言的扩展。

一个应用程序可以同时使用 MPI 和 OpenMP 的情况并不少见。