Поддержка MPI Fortran через модуль mpi_f08 с gfortran

У меня есть код на Фортране, который я хотел бы распараллелить с помощью MPI. Очевидно, рекомендуемый способ использования MPI (в моем случае MPICH) с Fortran — через mpi_f08 модуль (запись на mpi-форуме по этому поводу), но у меня возникли проблемы с его работой, так как соответствующий файл мода просто не создается (в отличие от mpi.mod, который работает нормально, но не работает на сегодняшний день со стандартом Fortran). Это обсуждение оставило у меня впечатление, что это потому, что gfortran не может не строить крепления F08. Ниже вы можете увидеть мою конфигурацию, и gfortran, и mpich были установлены через apt install на Ubuntu и должны быть обновлены. Я не уверен в нескольких вещах:

  • Есть ли способ заставить синтаксис Fortran 2008 MPI работать с gfortran? Судя по тому, что я наткнулся, ответ отрицательный, но, надеюсь, кто-то знает решение. Я не слишком разбираюсь в этом, поэтому буду очень признателен за любые релевантные ссылки или более подробное объяснение начального уровня.
  • Может ли помочь использование другого компилятора? Компилятор Intel * может быть? Я бы предпочел придерживаться gfortran, если это разумно.
  • Возможно, согласованность с текущим стандартом не такая уж большая проблема. Исходя из вашего опыта, было бы лучше просто воспользоваться поддержкой через модуль mpi.mod? Какие проблемы я мог ожидать тогда? Мое приложение не имеет больших долгосрочных амбиций, поэтому отказ от поддержки через некоторое время не является большой проблемой, если оно работает правильно сейчас.

Редактировать

Похоже, проблема была в использовании устаревшей версии gfortran. Это сводит мой вопрос к тому, как построить MPICH с помощью gfortran-10.


* hence the [intel-fortran] tag, feel free to remove it if you think it redundant

Просто для ясности, вот моя конфигурация 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.


person P. Janecek    schedule 16.01.2021    source источник
comment
Можете ли вы обновить свою версию GCC и пересобрать с ее помощью MPICH? gfortran 10.2 поддерживает Fortran 2008 гораздо больше, чем 7.5.   -  person francescalus    schedule 16.01.2021
comment
Я могу попробовать. Я буду держать вас в курсе.   -  person P. Janecek    schedule 16.01.2021
comment
@francescalus К сожалению, это не помогает, если только я не сделал что-то не так. Как я могу проверить, с какой версией gfortran собран MPICH?   -  person P. Janecek    schedule 16.01.2021


Ответы (1)


MPICH требует, чтобы компилятор Fortran поддерживал дескриптор массива Технической спецификации 29113, и это поддерживается только в последних версиях gfortran (GNU 10 в порядке). Компиляторы Intel некоторое время были в порядке.

Обратите внимание, что Open MPI не так привередлив по сравнению с другими. TS 29113 и не нуждается в поддержке дескриптора массива. GNU 7.5 можно использовать для создания модуля mpi_f08.

В итоге у вас есть два варианта w.r.t. модуль mpi_f08 Фортран:

  • используйте поддержку Fortran, которая соответствует ожиданиям MPICH w.r.t. TS 29113 (например, GNU 10 или компиляторы Intel, например)
  • перейти на открытый MPI
person Gilles Gouaillardet    schedule 16.01.2021
comment
Кажется многообещающим, у меня есть только один (новичок) вопрос. Как построить MPICH с помощью gfortran-10? Теперь у меня установлены gfortran (-v 7) и gfortran-10 (-v 10). - person P. Janecek; 16.01.2021
comment
Я попытался пересобрать его, но mpiexec --verison все еще возвращает... F90 : gfortran... что означает, что он все еще использует -v 7 - person P. Janecek; 16.01.2021
comment
Попробуйте configure FC=gfortran-10 - person Gilles Gouaillardet; 16.01.2021
comment
@Guilles_Gouaillardet Не могли бы вы быть более конкретным? Я не совсем уверен, куда его положить. - person P. Janecek; 16.01.2021
comment
Вам нужно перестроить MPICH и в этом процессе добавить FC=gfortran-10 к вашей configure командной строке. - person Gilles Gouaillardet; 17.01.2021
comment
Я задал отдельный вопрос по этому поводу, и в итоге все заработало. . Спасибо, что указали правильное направление :) - person P. Janecek; 17.01.2021