Fortran 为什么MPICH 3.0';s';mpi&x27;模块是否忽略某些过程的显式接口?

Fortran 为什么MPICH 3.0';s';mpi&x27;模块是否忽略某些过程的显式接口?,fortran,mpi,mpich,Fortran,Mpi,Mpich,我正在针对几个MPI实现(分别)构建一个基于MPI的分子动力学程序,但我在使用MPICH 3.0时遇到了一个障碍:它似乎没有为几个MPI程序提供显式接口。一些受影响的过程是mpi\u bcast(),mpi\u ssend(),mpi\u recv(),和mpi\u finalize()。然而,MPICH 3.0确实为某些过程提供了显式接口,例如mpi_init()。此示例代码演示了问题: program mpitest use mpi integer ierr ierr = 0 call d

我正在针对几个MPI实现(分别)构建一个基于MPI的分子动力学程序,但我在使用MPICH 3.0时遇到了一个障碍:它似乎没有为几个MPI程序提供显式接口。一些受影响的过程是
mpi\u bcast()
mpi\u ssend()
mpi\u recv()
,和
mpi\u finalize()
。然而,MPICH 3.0确实为某些过程提供了显式接口,例如
mpi_init()
。此示例代码演示了问题:

program mpitest
use mpi
integer ierr

ierr = 0
call dummy_implicit(ierr)

call mpi_init(ierr)
if (ierr /= 0) then
    write(*,*) 'MPI_Init() failed'
    stop
endif

call mpi_finalize(ierr)
if (ierr /= 0) then
    write(*,*) 'MPI_Finalize() failed'
endif

stop
end program
如果我在CentOS 7上针对MPICH 3.0.4构建此程序,我会得到以下结果:

$which mpif90
/usr/lib64/mpich/bin/mpif90
$ mpif90 -Wimplicit-interface -c -o mpitest.o mpitest.f90 mpitest.f90:6.31:

      call dummy_implicit(ierr)
                               1 Warning: Procedure 'dummy_implicit' called with an implicit interface at (1) mpitest.f90:15.29:

      call mpi_finalize(ierr)
                             1 Warning: Procedure 'mpi_finalize' called with an implicit interface at (1)
$
关于过程
dummy\u implicit()
的警告应该是正确的,但我希望MPICH为
mpi\u finalize()
提供一个显式接口,就像它显然为
mpi\u init()
提供的那样。此外,我发现,如果我针对MPICH 3.2或OpenMPI 1.10.3构建相同的程序,则只会对过程
dummy\u implicit()
发出隐式接口警告

该版本与MPICH有一些相似之处,但有一(1)个版本是针对MPICH 2而非MPICH 3报告的,并且(2)在大约5年前关闭

我确实希望确保所有过程调用的作用域中都有显式接口。如果需要的话,我可以手动提供缺少的部分,但这肯定不是预期的使用模型,其他MPI实现也不需要


我做错了什么?我真的需要手动提供显式接口吗?

不能保证
mpi
Fortran模块将包含特定过程的显式接口。有些更常见(具有固定数据类型的),有些很少(传递各种类型的缓冲区的,只要想想需要生成多少版本…)

模块中的过程数量因库而异,因版本而异,还可能受编译MPI库之前配置的影响

我只是不想在MPI中使用
-Wimplicit接口。我自己也尝试过提供一些接口,但是你会发现在其他一些计算机上提供了接口,你有冲突,它根本无法编译


您可以尝试使用
mpi\u f08
模块,如果您的库支持它,它通常包含带有显式接口的所有内容。但这也需要编译器提供一些高级功能,其中一些功能还没有得到广泛支持。

令人失望的是,
mpi
模块无法提供明确的接口。哦,好吧。谢谢你的澄清。还感谢您关于尝试手动提供显式接口的警告;
mpi\u f08
模块不是我的选择,所以我想我将只使用隐式接口。