我只是想知道 OpenMP(共享内存)和 MPI(分布式内存)怎么可能在像 i7 这样的普通桌面 CPU 上运行。是否有某种虚拟机可以在这些 CPU 上模拟共享和分布式内存?我问它是因为在学习 OpenMP 和 MPI 时,显示了超级计算机的结构,具有共享内存或分布式内存的不同节点,每个节点都有自己的处理器和内存。
2 回答
MPI 不假设 MPI 进程如何以及在何处运行。就 MPI 而言,进程只是具有称为其等级的唯一地址的实体,而 MPI 使它们能够以消息的形式发送和接收数据。消息传输的确切方式留给实现。该模型非常通用,以至于 MPI 几乎可以在任何可以想象的平台上运行。
OpenMP 使用线程处理共享内存编程。线程只是可以访问共享内存空间的并发指令流。它们可以在单个 CPU 内核上以分时方式执行,也可以在单个 CPU 芯片内的多个内核上执行,或者它们可以分布在通过某些复杂网络连接在一起的多个 CPU 之间,从而允许它们访问彼此的内存。
鉴于这一切,MPI 并不要求每个进程都在专用 CPU 内核上执行,或者数百万个内核必须放在与某些高速网络连接的单独板上 - 性能和技术限制一样。您可以愉快地在单个 CPU 内核上运行 100 个进程的 MPI 作业,尽管性能会非常非常糟糕,但它仍然可以工作(假设有足够的可用内存)。这同样适用于 OpenMP - 它不需要将每个线程都安排在专用的 CPU 内核上,但这样做可以提供最佳性能。
这就是为什么 MPI 和 OpenMP 被称为抽象的原因——它们足够通用,以至于在源代码保持不变的情况下,执行硬件可以有很大的不同。
现代的基于多核 CPU 的 PC是共享内存计算机。将每个内核视为一个处理器是一个合理的近似,并且它们都可以平等地访问相同的 RAM。这种近似隐藏了处理器和芯片架构的许多细节。
在共享内存计算机上使用消息传递(其中 MPI 是一种标准)一直是可能的(嗯,也许并非总是如此,但几乎只要 MPI 存在),您就可以运行相同的 MPI启用程序,就像在真正的分布式内存机器上一样。
在应用程序级别,程序员只关心对 MPI 例程的调用。在系统级别,MPI 运行时将这些调用(在集群或超级计算机上)转换为通过互连发送内容的指令。在共享内存计算机上,它可以将这些调用转换为通过内部总线发送内容的指令。
这绝不是对您提出的主题的全面介绍,但这就是 Google 和所有已发布资源的目的。