我正在研究针对几个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实现所必需的。
我做错了什么?我真的需要手动提供显式接口吗?
答案 0 :(得分:2)
无法保证mpi
Fortran模块将包含特定过程的显式接口。有些是更常见的(那些具有固定数据类型的),有些非常罕见(那些传递各种类型缓冲区的那些,只需要考虑必须生成多少个版本......)。
模块中的程序数量因库而异,从版本到版本不同,在编译MPI库之前也可能受到配置的影响。
我不会将-Wimplicit-interface
与MPI一起使用。我自己尝试提供一些接口,但是你会发现在其他一些计算机上提供了接口并且你有一个冲突,它根本就不会编译。
如果您的库支持它,您可以尝试mpi_f08
模块,它通常包含具有显式接口的所有内容。但这也需要编译器的一些高级功能,其中一些功能尚未得到广泛支持。