您提到的称为混合并行性。
一个集群由几个节点组成。一个节点是一组共享相同物理内存的插槽,一个插槽是一组我们称为处理器的内核。由于通过交换机的高速连接,节点存储在机架中并相互通信。
为简化起见,当您影响的 OpenMP 线程数等于每个插槽的内核数,并且 MPI 进程数等于您要在集群上使用的节点数时,您可以执行混合并行。例如,如果我有一个由套接字/处理器组成的具有 4 个节点和 12 个内核的集群,我启动我的程序以运行 4 个 MPI 进程(1 个节点)和 12 个 OpenMP 线程(每个套接字上一个内核)。在您的示例中,您有 2 个节点(2 台计算机,2 个具有不同内存的不同实体)和 4 个处理器内核。所以运行 2 个 MPI 进程,每个进程在每台计算机上处理 4 个 OpenMP 线程。NameRakes 给出了一个好词:MPI 是OpenMP 之上的一层。
另一种方法是仅使用具有 8 个进程的 MPI,因为 MPI 既适用于共享内存架构,也适用于分布式内存架构,而使用仅限于共享内存计算机的 OpenMP 则无法做到这一点。但是,在这种情况下,需要 8 个 MPI 通信,而混合并行需要 2 个,效率较低。
您似乎对 OpenMP 有相当不错的加速。混合并行对于具有数十个套接字和具有数千个自由度的高度可扩展的数字代码的集群是有意义的。正如 NameRakes 所说,由于 MPI 和 OpenMP 在概念上非常不同,因此不确定时间投资是否会有所回报。
另请注意,您的代码将根据较慢的处理器运行,因此如果您的两台计算机具有不同的处理器,则可能会降低您的速度,因此您需要确保正确分配负载。您肯定可以赢得时间,但不能达到 2 倍,这取决于架构和代码的可扩展性。