【发布时间】:2021-01-01 15:11:28
【问题描述】:
在我看来,这个 Fortran MPI 程序非常简单:
program what
use mpi
integer(4), parameter :: ksp = 4
integer(4), parameter :: kdp = 8
integer(ksp) :: nreadslb
integer(ksp), ALLOCATABLE :: all_nreadslb(:)
real(kdp) :: compute_time
real(kdp), ALLOCATABLE :: all_compute_times(:)
integer(ksp) :: myrank
integer :: ierr
call mpi_init(ierr)
allocate(all_nreadslb(10), all_compute_times(10))
CALL MPI_GATHER(compute_time, 1, &
MPI_DOUBLE_PRECISION, all_compute_times, 1, &
MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, ierr)
CALL MPI_GATHER(nreadslb, 1, MPI_INTEGER4, &
all_nreadslb, 1, MPI_INTEGER4, 0, &
MPI_COMM_WORLD, ierr)
call mpi_finalize(ierr)
end program
但它无法在 GNU 下的 Cray 平台上编译。返回的错误是:
23 | CALL MPI_GATHER(compute_time, 1, &
| 2
......
26 | CALL MPI_GATHER(nreadslb, 1, MPI_INTEGER4, &
| 1
Error: Type mismatch between actual argument at (1) and actual argument at (2) (INTEGER(4)/REAL(8)).
真正的问题是,如果我注释掉第一个 MPI_GATHER,第二个编译得很好,如果我注释掉第二个 MPI_GATHER,第一个编译得很好。 GNU 编译器不喜欢在代码中同时包含这两者。只是为了笑,我在它们之间放了一个调试语句;得到同样的错误。代码在 Cray 或 Intel Fortran 下编译得很好。
任何想法可能是什么问题?
编辑:我正在使用 Cray 环境 PrgEnv-gnu/6.0.9,它使用 gcc 10.1.0 和 Cray MPICH 7.7.16 中的 gfortran。我正在使用 Cray "ftn" 命令编译,没有标志,只有ftn what.f90。还发现问题出在 gcc 10.1.0;代码在 9.3.0 下编译得很好。这样就解决了眼前的问题。但是,如果有人知道在 10.1.0 下做什么(因为 9.3.0 不会永远持续下去),他会很乐意听到的!谢谢。
【问题讨论】:
-
您使用哪些编译器意见?你的编译命令是什么样子的?您使用哪个编译器版本和 MPI 库版本?你试过其他版本吗?
-
如果
mpi_gather不是泛型或使用假定类型/合适的多态虚拟参数,那么是的,它不允许使用两种不同的参数类型调用它两次。你可以尝试use mpi_f08来获得完整的 Fortran 2008 兼容模块吗? -
@francescalus
mpi_gather可用于几乎任何数据类型(在合理范围内),我已经多次看到它在单个代码中处理多种数据类型;甚至我自己也做过。不过,谢谢。 -
@VladimirF 谢谢。请查看修改。
-
啊,好的。这是一个可选的附加功能,因此可能不可用。如果存在,它将在同一个地方(我希望,但取决于您的 MPI 实现)。我猜你被旧的编译器/编译器标志困住了,唉。
标签: compilation fortran mpi gnu