Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compilation Fortran错误:两个不相关的子例程调用之间的类型不匹配_Compilation_Fortran_Mpi_Gnu - Fatal编程技术网

Compilation Fortran错误:两个不相关的子例程调用之间的类型不匹配

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

在我看来,这个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_聚集,第二个就可以正常编译,如果我注释掉第二个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兼容模块?@francescalus
mpi_gather
可以用于几乎任何数据类型(合理范围内),并且我多次看到它在一个代码中使用多种数据类型;我甚至自己做过。谢谢,不过。@VladimirF谢谢。请看编辑。啊,好的。这是可选的额外服务,因此可能不可用。如果存在,它将位于相同的位置(我希望如此,但这取决于您的MPI实现)。我猜你被旧的编译器/编译器标志卡住了,唉。谢谢你,我怀疑是这样的。它甚至可能影响我的代码库。测试这一点比较困难,因为需要首先使用GCC10重新编译MPI库和许多其他库,所以我通常只使用最新的编译器测试非MPI版本。但也许我很好,因为我已经使用了
-Wargument-mismatch
-Werror
。John,谢谢你的建议,但是有了这个标志,我得到了同样的错误。但是一般信息是非常相关的。谢谢。@VladimirF那我们该怎么办?在短期内,我将回到gcc 9,但这不是一个好的长期解决方案。John的建议标志不适用于我。@bob.sacamento,并补充说,该标志是GCC建议的让编译器接受因更改而被拒绝的代码的方法。我认为,由于它具有将错误转换为警告的效果,如果同时指定
-Werror
,则可能无效。如果没有弗拉基米尔要求的细节,我想我们不能再多说了。约翰,试试你的国旗和弗拉基米尔的。带和不带
-Werror
。结果没有任何变化。谢谢