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。
我一直无法使用 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。