MPI_Cart_create 错误

MPI_Cart_create error

我一直无法使用 Fortran 中的基本 mpi_cart_create() 函数。

如下代码

  program main
  USE mpi
  implicit none
  integer :: old_comm, new_comm, ndims, ierr
  integer, DIMENSION(1) :: dim_size
  logical ::  reorder
  logical, DIMENSION(1) :: periods

  call MPI_INIT(ierr)
  old_comm = MPI_COMM_WORLD
  ndims = 1            
  dim_size(1) = 4   
  periods(1) = .true.  
  reorder = .true.
  call MPI_CART_CREATE(old_comm, ndims, dim_size, periods, reorder, new_comm, ierr)
  call MPI_Finalize(ierr)

  end program

编译为

mpif90 mpitest.f90

产量,在运行时间内,

An error occurred in MPI_Cart_create

on communicator MPI_COMM_WORLD

MPI_ERR_OTHER: known error not in list

MPI_ERRORS_ARE_FATAL: your MPI job will now abort

这看起来很简单,但有没有人认识到这个问题?

编辑:我更新了代码(我之前有点草率地删减了代码,感谢您提出这些问题)以更正下面提到的问题。我想我可能搞砸了 MPI 安装,因为当使用

编译时代码将 运行
 (when using `use mpi`)
 mpif90 mpitest3.f90
 mpirun  -np 4  ./a.out

 (when using `include "mpif.h"`)
 mpifort mpitest.f90 
 orterun  -np 4  ./a.out

如果我尝试使用带有 use mpi 语句的 mpifort 进行编译,我会得到

PI_CART_CREATE(old_comm, ndims, dim_size, periods, reorder, new_comm, ierr)

Error: There is no specific subroutine for the generic 'mpi_cart_create' at (1)

如果我混合编译器和 运行 调用(例如,使用 mpif90 编译,运行 与 orte运行 编译),我得到

Fatal error in PMPI_Cart_create: Invalid argument, error stack: PMPI_Cart_create(315).....: MPI_Cart_create(MPI_COMM_WORLD, ndims=1, dims=0x7fff26671130, periods=0x1c6e300, reorder=1, comm_cart=0x7fff26671124) failed MPIR_Cart_create_impl(191): MPIR_Cart_create(55)......: Size of the communicator (1) is smaller than the size of the Cartesian topology (4)

尽管 openmpi 的文档说明命令(至少 orte运行 和 mpi运行)应该是同义的。

您的问题是您同时安装了 Open MPI 和 MPICH(或其他基于 MPICH 的实现)。 mpifort 是 Open MPI 中的通用 Fortran 编译器包装器,它似乎从 MPICH 中选择模块文件,因此在使用 use mpi 编译代码时出现错误。您的 mpirun 肯定来自 MPICH,它无法正确启动 Open MPI 可执行文件。来自 Open MPI 的 orterun 也是如此,它无法正确启动 MPICH 可执行文件。在这两种情况下,可执行文件都变成单例,并且每个进程都有自己的大小为 1 的 MPI_COMM_WORLD,因此无法创建具有 4 个等级的笛卡尔虚拟拓扑。

解决方案是首先从系统中清除所有 MPI 实现,然后从同一实现安装运行时和开发包,例如打开 MPI。