通过 mpi_f08 模块和 gfortran 支持 MPI Fortran

Posted

技术标签:

【中文标题】通过 mpi_f08 模块和 gfortran 支持 MPI Fortran【英文标题】:MPI Fortran support through the mpi_f08 module with gfortran 【发布时间】:2021-04-21 08:30:04 【问题描述】:

我有一些 Fortran 代码想与 MPI 并行化。显然,在 Fortran 中使用 MPI(在我的情况下为 MPICH)的推荐方法是通过 mpi_f08 模块(mpi-forum entry on the matter),但我无法使其工作,因为根本没有创建相应的 mod 文件(与 mpi.mod 不同,这工作正常,但它不是最新的 Fortran 标准)。 This discussion 让我觉得这是因为 gfortran 无法构建 F08 绑定。您可以在下面看到我的配置,gfortran 和 mpich 都已通过 apt install 在 ubuntu 上安装,并且应该是最新的。我不确定一些事情:

有什么方法可以使 Fortran 2008 MPI 语法与 gfortran 一起工作?从我遇到的情况来看,答案似乎是否定的,但希望有人可能知道解决方法。我对此不太精通,因此将不胜感激任何相关链接或更多入门级解释。 能否使用不同的编译器帮助?英特尔编译器* 可能吗?如果合理,我宁愿坚持使用 gfortran。 也许与当前标准保持一致并不是什么大问题。根据您的经验,通过 mpi.mod 模块获得支持会更好吗?那时我会遇到什么问题?我的应用程序没有太大的长期抱负,所以如果它现在正常运行,一段时间后失去支持也不是什么大问题。

编辑

这似乎是使用过时版本的 gfortran 的问题。这将我的问题减少到如何使用 gfortran-10 构建 MPICH。


* 因此是 [intel-fortran] 标签,如果您认为它多余,请随意删除它

为了清楚起见,这是我的 gfortran 和 mpich 配置

pavel@pavel:~$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 
pavel@pavel:~$ mpiexec --version
HYDRA build details:
    Version:                                 3.3a2
    Release Date:                            Sun Nov 13 09:12:11 MST 2016
    CC:                              gcc   -Wl,-Bsymbolic-functions -Wl,-z,relro 
    CXX:                             g++   -Wl,-Bsymbolic-functions -Wl,-z,relro 
    F77:                             gfortran  -Wl,-Bsymbolic-functions -Wl,-z,relro 
    F90:                             gfortran  -Wl,-Bsymbolic-functions -Wl,-z,relro 
    Configure options:                       '--disable-option-checking' '--prefix=/usr' '--build=x86_64-linux-gnu' '--includedir=$prefix/include' '--mandir=$prefix/share/man' '--infodir=$prefix/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--disable-silent-rules' '--libdir=$prefix/lib/x86_64-linux-gnu' '--libexecdir=$prefix/lib/x86_64-linux-gnu' '--disable-maintainer-mode' '--disable-dependency-tracking' '--with-libfabric' '--enable-shared' '--enable-fortran=all' '--disable-rpath' '--disable-wrapper-rpath' '--sysconfdir=/etc/mpich' '--libdir=/usr/lib/x86_64-linux-gnu' '--includedir=/usr/include/mpich' '--docdir=/usr/share/doc/mpich' '--with-hwloc-prefix=system' '--enable-checkpointing' '--with-hydra-ckpointlib=blcr' 'CPPFLAGS= -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/mpich-O9at2o/mpich-3.3~a2/src/mpl/include -I/build/mpich-O9at2o/mpich-3.3~a2/src/mpl/include -I/build/mpich-O9at2o/mpich-3.3~a2/src/openpa/src -I/build/mpich-O9at2o/mpich-3.3~a2/src/openpa/src -D_REENTRANT -I/build/mpich-O9at2o/mpich-3.3~a2/src/mpi/romio/include' 'CFLAGS= -g -O2 -fdebug-prefix-map=/build/mpich-O9at2o/mpich-3.3~a2=. -fstack-protector-strong -Wformat -Werror=format-security -O2' 'CXXFLAGS= -g -O2 -fdebug-prefix-map=/build/mpich-O9at2o/mpich-3.3~a2=. -fstack-protector-strong -Wformat -Werror=format-security -O2' 'FFLAGS= -g -O2 -fdebug-prefix-map=/build/mpich-O9at2o/mpich-3.3~a2=. -fstack-protector-strong -O2' 'FCFLAGS= -g -O2 -fdebug-prefix-map=/build/mpich-O9at2o/mpich-3.3~a2=. -fstack-protector-strong -O2' 'build_alias=x86_64-linux-gnu' 'MPICHLIB_CFLAGS=-g -O2 -fdebug-prefix-map=/build/mpich-O9at2o/mpich-3.3~a2=. -fstack-protector-strong -Wformat -Werror=format-security' 'MPICHLIB_CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' 'MPICHLIB_CXXFLAGS=-g -O2 -fdebug-prefix-map=/build/mpich-O9at2o/mpich-3.3~a2=. -fstack-protector-strong -Wformat -Werror=format-security' 'MPICHLIB_FFLAGS=-g -O2 -fdebug-prefix-map=/build/mpich-O9at2o/mpich-3.3~a2=. -fstack-protector-strong' 'MPICHLIB_FCFLAGS=-g -O2 -fdebug-prefix-map=/build/mpich-O9at2o/mpich-3.3~a2=. -fstack-protector-strong' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro' 'FC=gfortran' 'F77=gfortran' 'MPILIBNAME=mpich' '--cache-file=/dev/null' '--srcdir=.' 'CC=gcc' 'LIBS=' 'MPLLIBNAME=mpl'
    Process Manager:                         pmi
    Launchers available:                     ssh rsh fork slurm ll lsf sge manual persist
    Topology libraries available:            hwloc
    Resource management kernels available:   user slurm ll lsf sge pbs cobalt
    Checkpointing libraries available:       blcr
    Demux engines available:                 poll select

尝试使用mpif90 编译我的代码会导致

something.f90:2:5:

  use mpi_f08
     1
Fatal Error: Can't open module file ‘mpi_f08.mod’ for reading at (1): File does not exist
compilation terminated.

【问题讨论】:

你能更新你的 GCC 版本并用它重建 MPICH 吗? gfortran 10.2 支持的 Fortran 2008 比 7.5 多得多。 我可以试试。我会及时通知你。 @francescalus 遗憾的是,这似乎没有帮助,除非我做错了什么。如何检查 MPICH 构建的 gfortran 版本是什么? 【参考方案1】:

上面的答案提到了 TS 29113,它被合并到 Fortran 2018 标准中并被 Fortran 2018 标准取代。在将 TS 并入后续标准的过程中,TS 中描述的某些特性可能会发生变化。我不知道在这种情况下具体会发生什么变化,但参考 Fortran 2018 标准而不是 TS 更安全。

为了提供mpi_f08,MPICH 要求编译器安装在 Fortran 2018 标准中描述并在 TS 29113 中描述的 ISO_Fortran_binding.h 头文件。gfortran 从版本 9 开始提供 ISO_Fortran_binding.h(见https://gcc.gnu.org/gcc-9/changes.html)所以我相信MPICH应该安装mph_f08gfortran-9及更高版本,尽管我相信gfortranISO_Fortran_binding.h的支持可能需要在后续版本中修复一些重要的错误,所以我建议使用尽可能使用最新版本。

【讨论】:

【参考方案2】:

MPICH 要求 Fortran 编译器支持技术规范 29113 的数组描述符,这仅在 gfortran 的最新版本中支持(GNU 10 可以)。 英特尔编译器已经好一阵子了。

请注意,Open MPI 并不那么挑剔。 TS 29113 并且不需要对数组描述符的支持。 GNU 7.5 可用于生成mpi_f08 模块。

底线,你有两个选择 w.r.t. mpi_f08 Fortran 模块:

使用符合 MPICH 预期 w.r.t 的 Fortran 支持。 TS 29113(例如 GNU 10 或 Intel 编译器) 移至 Open MPI

【讨论】:

看起来很有希望,我只有一个(新手)问题。如何使用 gfortran-10 构建 MPICH?现在,我安装了 gfortran (-v 7) 和 gfortran-10 (-v 10)。 我试图重建它,但 mpiexec --verison 仍然返回 ... F90 : gfortran ... 这意味着它仍然使用 -v 7 试试configure FC=gfortran-10 @Guilles_Gouaillardet 你能说得更具体点吗?我不太确定该放在哪里。 您需要重建 MPICH,并在此过程中,将 FC=gfortran-10 附加到您的 configure 命令行。

以上是关于通过 mpi_f08 模块和 gfortran 支持 MPI Fortran的主要内容,如果未能解决你的问题,请参考以下文章

gfortran 中的 ieee_arithmetic 内在模块

编译使用带有gfortran的英特尔MKL模块的代码

Mac OS X 10.8.3 上的 gfortran/gcc4.8

如何使用MinGW gfortran通过CMake构建/编译Fortran

长度参数化的传递对象到类型绑定过程有 gfortran 抱怨

在 gfortran 中预处理 !DEC$ 指令