Compilation Fortran错误:两个不相关的子例程调用之间的类型不匹配
在我看来,这个Fortran MPI程序非常简单:Compilation Fortran错误:两个不相关的子例程调用之间的类型不匹配,compilation,fortran,mpi,gnu,Compilation,Fortran,Mpi,Gnu,在我看来,这个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
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_聚集,第二个就可以正常编译,如果我注释掉第二个MPI_聚集,第一个就可以正常编译。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不会永远持续下去),他会很乐意听到的!谢谢。无需详细说明是否接受示例程序或为什么接受示例程序,因为这取决于Fortran语言版本和所用MPI模块的详细信息。通过在编译命令行中添加-fallow argument mismatch
选项,您应该能够将这些特定错误转换为警告。这对其他项目有效,例如。您使用哪种编译器OPIN?编译命令是什么样子的?您使用哪个编译器版本和MPI库版本?您尝试过其他版本吗?如果mpi\u gather
不是泛型或使用假定类型/合适的多态伪参数,则不允许使用两种不同的参数类型调用它两次。您是否可以尝试使用mpi_f08来获得完整的Fortran 2008兼容模块?@francescalusmpi_gather
可以用于几乎任何数据类型(合理范围内),并且我多次看到它在一个代码中使用多种数据类型;我甚至自己做过。谢谢,不过。@VladimirF谢谢。请看编辑。啊,好的。这是可选的额外服务,因此可能不可用。如果存在,它将位于相同的位置(我希望如此,但这取决于您的MPI实现)。我猜你被旧的编译器/编译器标志卡住了,唉。谢谢你,我怀疑是这样的。它甚至可能影响我的代码库。测试这一点比较困难,因为需要首先使用GCC10重新编译MPI库和许多其他库,所以我通常只使用最新的编译器测试非MPI版本。但也许我很好,因为我已经使用了-Wargument-mismatch
和-Werror
。John,谢谢你的建议,但是有了这个标志,我得到了同样的错误。但是一般信息是非常相关的。谢谢。@VladimirF那我们该怎么办?在短期内,我将回到gcc 9,但这不是一个好的长期解决方案。John的建议标志不适用于我。@bob.sacamento,并补充说,该标志是GCC建议的让编译器接受因更改而被拒绝的代码的方法。我认为,由于它具有将错误转换为警告的效果,如果同时指定-Werror
,则可能无效。如果没有弗拉基米尔要求的细节,我想我们不能再多说了。约翰,试试你的国旗和弗拉基米尔的。带和不带-Werror
。结果没有任何变化。谢谢