如何在 OpenMP 等共享内存模式下运行 MPI-3.0

计算科学 并行计算 正则 数字 mpi 编译
2021-12-14 22:23:55

我正在并行化代码以数值求解 5 维人口平衡模型。目前我在 FORTRAN 中有一个非常好的 MPICH2 并行化代码,但是随着我们增加参数值,数组变得太大而无法在分布式内存模式下运行。

我可以访问具有 15 个节点的集群,其中每个节点有两个 8 核 CPU 和 128GB 的​​ RAM。我想编写一个在共享内存模式下使用 MPI-3.0 运行的程序,这样每个进程就不会生成自己的每个数组的副本。

在我可以在集群上运行任何东西之前,我必须在运行 Ubuntu 的桌面上对其进行测试。它本质上是集群的一个刀片,因为它有两个 8 核 CPU 和 128 GB 的 RAM。我将在上面编写和测试我的代码,所以请将您的回复调整为在 Ubuntu 计算机上运行程序。

我已经读到有一种方法可以在 OpenMP 等共享内存模式下运行 MPI-3.0,而不是其默认的分布式内存模式。

问题:

  1. 我将如何更改我的代码?我是否需要添加对其他 MPI 函数的调用,例如MPI_WIN_ALLOCATE

  2. 如何编译我的代码以在共享内存模式下运行 MPI-3.0?如果它跨越多个节点,这会有所不同吗?

如果可以,请提供示例编译脚本。我也只有 GNU 编译器。我使用的集群不支持 Intel 编译器。

1个回答

我还在 Stack Overflow 上找到了这个链接。我发誓我一直在寻找像我这样的问题,但似乎搜索堆栈溢出问题的最佳方法是开始提出问题,它会建议类似的帖子。

无论如何,这里的链接实际上确实说您可以在像 openmp 这样的共享内存模式下运行 MPI3.0+。我还发现了其他一些资料来源,其中一些资料表明你可以但没有解释如何或提供资源来解决这个问题。

https://stackoverflow.com/questions/24797298/mpi-fortran-code-how-to-share-data-on-node-via-openmp

在遵循此链接中给出的建议后,我遇到了将 USE 'mpi_f08' 放在我的代码顶部的问题。我正在使用 gfortran-4.8,它目前显然没有足够的 FORTRAN2008 支持来使用 mpi_f08。此链接中的某个人可能正在使用 intel fortran 2008 编译器。您可以使用 USE mpi,它可以很好地覆盖 Fortran2003。但是我不认为 Fortran 2003 具有使用远程内存访问函数所需的 Type() 函数,例如 MPI_WIN_ALLOCATE_SHARED,因此没有 FORTRAN2008 就不能使用它们。但是我真的没有足够的资源来肯定地说这是一个事实,但我的发现确实表明了这一点。