我在使用MPI-Fortran代码时遇到以下问题。 MPI通信器在Fortran中表示为INTEGER
。但是,如果考虑以下最小示例,则在使用通信器的副本时,我不会从MPI环境中获取任何信息。
PROGRAM TEST1
INCLUDE 'mpif.h'
INTEGER :: mpicomm, mpiinfo, mpi_size, mpi_rank, info
CALL MPI_INIT(info)
mpicomm = MPI_COMM_WORLD
WRITE(*,*) "MPI_COMM_WORLD = ", MPI_COMM_WORLD, " mpicomm = ", mpicomm
CALL MPI_COMM_SIZE(mpicomm , mpi_size)
CALL MPI_COMM_RANK(mpicomm , mpi_rank)
WRITE(*,*) mpi_rank, mpi_size
CALL MPI_FINALIZE()
END PROGRAM TEST1
我使用了OpenMPI 3.0 / 4.0和gfortran 7.3 / 9.1的服务器组合。在所有情况下,我都会得到:
$ mpirun -np 6 ./a.out
MPI_COMM_WORLD = 0 mpicomm = 0
MPI_COMM_WORLD = 0 mpicomm = 0
MPI_COMM_WORLD = 0 mpicomm = 0
MPI_COMM_WORLD = 0 mpicomm = 0
MPI_COMM_WORLD = 0 mpicomm = 0
MPI_COMM_WORLD = 0 mpicomm = 0
0 0
0 0
0 0
0 0
0 0
0 0
但是,当我将MPI_COMM_WORLD
硬编码到子例程调用中时,它可以工作。但是查看mpif.h
可以发现MPI_COMM_WORLD
也是标准的Fortran整数。
为什么会这样?