通过带有 gfortran 的 mpi_f08 模块支持 MPI Fortran
MPI Fortran support through the mpi_f08 module with gfortran
我有一些要与 MPI 并行化的 Fortran 代码。显然,将 MPI(在我的例子中是 MPICH)与 Fortran 一起使用的推荐方法是通过 mpi_f08
模块(mpi-forum entry on the matter), but I have trouble making it work, since corresponding mod file is simply not created (unlike mpi.mod
, which works fine, but it's not up to date with Fortran standart). This discussion 给我留下的印象是因为 gfortran 无法构建 F08 绑定。下面你可以看到我的配置,gfortran 和 mpich 都已通过 apt install on 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.
MPICH 要求 Fortran 编译器支持 Technical Specification 29113 的数组描述符,而这仅在 gfortran
的最新版本中支持(GNU 10 可以)。
Intel 编译器已经运行一段时间了。
请注意,Open MPI 并不那么挑剔 w.r.t。 TS 29113 不需要支持数组描述符。 GNU 7.5 可用于生成 mpi_f08
模块。
最重要的是,您有两个选择 w.r.t。 mpi_f08
Fortran 模块:
- 使用满足 MPICH 期望的 Fortran 支持 w.r.t。 TS 29113(例如 GNU 10,或英特尔编译器)
- 移动到开放 MPI
上面的回答提到了 TS 29113,它被纳入 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_f08
和 gfortran-9
及更高版本,尽管我相信 gfortran
支持ISO_Fortran_binding.h
可能需要在后续版本中修复一些重要的错误,因此我建议尽可能使用最新版本。
我有一些要与 MPI 并行化的 Fortran 代码。显然,将 MPI(在我的例子中是 MPICH)与 Fortran 一起使用的推荐方法是通过 mpi_f08
模块(mpi-forum entry on the matter), but I have trouble making it work, since corresponding mod file is simply not created (unlike mpi.mod
, which works fine, but it's not up to date with Fortran standart). This discussion 给我留下的印象是因为 gfortran 无法构建 F08 绑定。下面你可以看到我的配置,gfortran 和 mpich 都已通过 apt install on 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.
MPICH 要求 Fortran 编译器支持 Technical Specification 29113 的数组描述符,而这仅在 gfortran
的最新版本中支持(GNU 10 可以)。
Intel 编译器已经运行一段时间了。
请注意,Open MPI 并不那么挑剔 w.r.t。 TS 29113 不需要支持数组描述符。 GNU 7.5 可用于生成 mpi_f08
模块。
最重要的是,您有两个选择 w.r.t。 mpi_f08
Fortran 模块:
- 使用满足 MPICH 期望的 Fortran 支持 w.r.t。 TS 29113(例如 GNU 10,或英特尔编译器)
- 移动到开放 MPI
上面的回答提到了 TS 29113,它被纳入 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_f08
和 gfortran-9
及更高版本,尽管我相信 gfortran
支持ISO_Fortran_binding.h
可能需要在后续版本中修复一些重要的错误,因此我建议尽可能使用最新版本。