我想知道(用几句话) OpenMP 和 MPI 之间的主要区别是什么。
OpenMP 是在共享内存设备上编程的一种方法。这意味着并行性发生在每个并行线程都可以访问所有数据的地方。
您可以将其想象为: 并行性可以在执行特定的 for循环时通过将循环拆分到不同的线程中来实现。
for
MPI 是一种在分布式存储设备上编程的方法。这意味着并行性发生在每个并行进程都独立于其他进程在自己的内存空间中工作的地方。
您可以把它想象成: 您编写的每个代码位都由每个进程独立执行。之所以会出现并行性,是因为您完全根据每个进程的进程 ID 来确切地告诉每个进程它们应该处理全局问题的哪一部分。
当然,编写 OpenMP 和 MPI 程序的方式也是非常不同的。
MPI 表示消息传递接口。它是一组关于消息传递(如发送、接收、广播等)的 API 声明,以及应该从实现中预期什么行为。
“消息传递”的概念相当抽象。它可能意味着在本地进程或分布在网络主机上的进程之间传递消息,等等。现代实现非常努力地试图变得多才多艺,抽象出多种底层机制(共享内存访问、网络 IO 等)。
OpenMP 是一个 API,它可以使编写共享内存多处理程序变得更加容易。没有传递消息的概念。相反,使用一组标准函数和编译器指令,编写并行执行本地线程的程序,并控制这些线程的行为(它们应该访问什么资源,如何同步等)。OpenMP 需要编译器的支持,因此您也可以将其视为受支持语言的扩展。
应用程序可以同时使用 MPI 和 OpenMP,这种情况并不少见。