我在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
运行期间的产量
MPI_Cart_create
发生错误关于传播者MPI_COMM_WORLD
MPI_ERR_OTHER:列表中未知的已知错误
MPI_ERRORS_ARE_FATAL:您的MPI作业现在将中止
这看起来很简单,但是有人认出这个问题吗?
编辑:我更新了代码(我之前有点急于减少代码,感谢您提出这些问题)以纠正下面提到的问题。我想我可能搞砸了MPI安装,因为代码将在使用
编译时运行(when using `use mpi`) mpif90 mpitest3.f90 mpirun -np 4 ./a.out
OR
(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)
错误:通用没有特定的子程序 ' MPI_CART_CREATE'在(1)
如果我混合编译器并运行调用(例如使用mpif90编译并使用orterun运行),我得到
PMPI_Cart_create中的致命错误:参数无效,错误堆栈: PMPI_Cart_create(315).....:MPI_Cart_create(MPI_COMM_WORLD,ndims = 1, dims = 0x7fff26671130,句点= 0x1c6e300,reorder = 1, comm_cart = 0x7fff26671124)MPIR_Cart_create_impl失败(191): MPIR_Cart_create(55)......:通信器(1)的大小较小 比笛卡尔拓扑的大小(4)
即使openmpi的文档声明命令(至少orterun和mpirun)应该是同义词。
答案 0 :(得分:3)
您的问题是您安装了Open MPI和MPICH(或其他基于MPICH的实现)。 mpifort
是Open MPI中的通用Fortran编译器包装器,它似乎从MPICH中选择模块文件,因此在使用use mpi
编译代码时出错。您的mpirun
肯定来自MPICH,无法正常启动Open MPI可执行文件。来自Open MPI的orterun
也是如此,它无法正确启动MPICH可执行文件。在这两种情况下,可执行文件都成为单例,每个进程都有自己的MPI_COMM_WORLD
,大小为1,因此无法创建具有4个等级的笛卡尔虚拟拓扑。
解决方案是首先从系统中清除所有MPI实现,然后从同一实现安装运行时和开发数据包,例如,打开MPI。