为什么 MPICH 3.0 的 'mpi' 模块省略了某些程序的显式接口?

Why does MPICH 3.0's 'mpi' module omit explicit interfaces for some procedures?

我正在针对多个 MPI 实现(分别)构建一个基于 MPI 的分子动力学程序,并且我 运行 遇到了 MPICH 3.0 的障碍:它似乎没有为几个 MPI 程序。一些受影响的过程是 mpi_bcast()mpi_ssend()mpi_recv()mpi_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_implicit() 的警告是预期的并且是正确的,但我希望 MPICH 为 mpi_finalize() 提供一个显式接口,就像它显然为 mpi_init() 所做的那样。此外,我发现如果我针对 MPICH 3.2 或 OpenMPI 1.10.3 构建相同的程序,则仅针对过程 dummy_implicit().

发出隐式接口警告

此问题与 one reported against MPICH2 有一些相似之处,但其中一 (1) 个是针对 MPICH 2 而不是 MPICH 3 的报告,并且 (2) 大约在 5 年前关闭。

我确实想确保我的所有过程调用在范围内都有明确的接口。如果需要,我可以手动提供缺失的部分,但这肯定不是预期的使用模型,其他 MPI 实现也不需要。

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

不保证 mpi Fortran 模块将包含特定过程的显式接口。有些包含的比较普遍(那些具有固定数据类型的),有些很少包含(那些传递各种类型的缓冲区的,想想要生成多少个版本...)。

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

我只是不会将 -Wimplicit-interface 与 MPI 一起使用。我试过自己提供一些接口,然后你会发现在别的电脑上提供了接口,你冲突了,根本编译不出来。

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