[mephi-hpc] Fortran MPI

anikeev anikeev at ut.mephi.ru
Mon Sep 27 17:53:34 MSK 2021


On Mon, 2021-09-27 at 16:39 +0300, Artyom Makarevich wrote:
> В том и дело, что типы переменных не перепутаны. Тип передаваемых
> переменных в MPI_Bcast задается внутри вызова:

Fortran90 не поддерживает function overloading. Используя старый
интерфейс mpif.h Вы не можете вызывать MPI_Bcast из одного файла
несколько раз с разными типами переменных. Так можно только начиная с
mpi_f08.mod. Это не ограничение библиотеки, это ограничение языка. То,
что в GCC-9 и ранее не было такой проверки не означает, что это не было
ошибкой:

https://gcc.gnu.org/gcc-10/porting_to.html


Ошибки действительно можно подавить при помощи -fallow-argument-
mismatch и попробовать поискать проблемы в другом месте, но будет
обидно потратить пару недель на отладку, и выяснить что "на авось" не
получилось - GCC-10 не гарантирует корректную кодогенерацию в этом
случае.

> MPI_Bcast
> Broadcasts a message from the process with rank "root" to all other
> processes of the communicatorSynopsis
> int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int
> root, 
>                MPI_Comm comm )
> Input/Output Parameters
> buffer
> starting address of buffer (choice)
> 
> Input Parameters
> count
> number of entries in buffer (integer)
> datatype
> data type of buffer (handle)
> root
> rank of broadcast root (integer)
> comm
> communicator (handle)
> 
> 
> Notes for Fortran
> All MPI routines in Fortran (except for MPI_WTIME and MPI_WTICK) have
> an additional argument ierr at the end of the argument list. ierr is
> an integer and has the same meaning as the return value of the
> routine in C. In Fortran, MPI routines are subroutines, and are
> invoked with the call statement.
> All MPI objects (e.g., MPI_Datatype, MPI_Comm) are of type INTEGER in
> Fortran.
> 
> Код на который выдается сообщение об ошибке:
> 
>       implicit none
>       include 'mpif.h'
>       real(8) :: StartTimeDStat, EndTimeDStat
>       integer :: KeyDstatRestart, DiscrDStat
>       
>       integer :: ierr
> 
>       call MPI_BCAST( KeyDstatRestart,1,MPI_INTEGER,0,
> MPI_COMM_WORLD,ierr)
>       call MPI_BCAST( DiscrDStat,     1,MPI_INTEGER,0,
> MPI_COMM_WORLD,ierr)
>       call MPI_BCAST( StartTimeDStat, 1,MPI_REAL8,  0,
> MPI_COMM_WORLD,ierr)
>       call MPI_BCAST( EndTimeDStat,   1,MPI_REAL8,  0,
> MPI_COMM_WORLD,ierr)
> 
> параметры MPI_INTEGER и MPI_REAL8 как раз и определяют тип
> передаваемых буферов и в данном случае все согласовано. Я первый раз
> вижу, что при компиляции выдается сообщение об ошибке такого рода.
> 
> пн, 27 сент. 2021 г. в 16:07, anikeev <anikeev at ut.mephi.ru>:
> > On Mon, 2021-09-27 at 12:27 +0000, Леонов Алексей Анатольевич
> > wrote:
> > > Добрый день.
> > 
> > Здравствуйте!
> > 
> > > После некоторого перерыва попытался скомпилировать новую версию
> > > своего кода, написанную на Fortran с использованием MPI и
> > столкнулся
> > > со следующей проблемой:
> > > 
> > > При использовании mpif90 начала вылезать следующая ошибка (одна
> > из
> > > многих аналогичных):
> > > 
> > > av_rms.f:94:22:
> > > 
> > >    92 |       call MPI_BCAST( KeyDstatRestart,1,MPI_INTEGER,0,
> > > MPI_COMM_WORLD,ierr)
> > >       |                      2
> > >    93 |       call MPI_BCAST( DiscrDStat,     1,MPI_INTEGER,0,
> > > MPI_COMM_WORLD,ierr)
> > >    94 |       call MPI_BCAST( StartTimeDStat, 1,MPI_REAL8,  0,
> > > MPI_COMM_WORLD,ierr)
> > >       |                      1
> > > Error: Type mismatch between actual argument at (1) and actual
> > > argument at (2) (REAL(8)/INTEGER(4)).
> > > 
> > > Путем добавления флага -fallow-argument-mismatch мне удалось
> > > перевести errors в warnings и получить исполняемый файл.
> > 
> > Здесь недвусмысленно перепутаны типы переменных, нужно исправлять.
> > 
> > 
> > > Однако при запуске кода появились проблемы с выводом в файлы. В
> > > процессе расчетов я с некоторой периодичностью вывожу в файл
> > значения
> > > основных переменных в трехмерной расчетной области. Вывод
> > > производится при помощи MPIIO. И в процессе работы при очередном
> > > выводе в файл (в произвольный момент) программа зависает:
> > создается
> > > файл с именем типа restart.lnv-2126839809-4361.lock, где
> > restart.lnv
> > > имя выходного файла программы, и ничего больше не происходит.
> > > Программа не выходит и продолжает отражаться в запущенных
> > процессах.
> > > Ранее таких проблем при запуске не было. Вывод в новой версии не
> > > отличается от предыдущих версий программы. Запуск задачи
> > производился
> > > на unicluster.
> > 
> > Сначала нужно исправить warning и error на этапе компиляции. Если
> > проблема останется, нужно собрать приложение с отладочной
> > информацией
> > (-ggdb3 -O0) и отладить с использованием GDB. Руководство по GDB
> > есть
> > здесь:
> > 
> > https://sourceware.org/gdb/current/onlinedocs/gdb/
> > 
> > и попробовать понять, что именно происходит. Возможно, выявилась
> > какая-
> > то ошибка и происходит зависание. Возможно, на новой версии упала
> > производительность реализации MPIIO и файл просто не успевает
> > записаться за время выполнения задачи. Например, OMPIO (реализация
> > MPIIO из состава OpenMPI) не оптимизируется под использование с
> > файловой системой NFS и для неё могут потребоваться настройки
> > параметров запуска задачи.
> > 
> > Документацию по OpenMPI можно найти здесь:
> > 
> > https://www.open-mpi.org/doc/current/
> > https://www.open-mpi.org/faq/?category=ompio
> > 
> > 
> > Есть много других вариантов.
> > 
> > Обращайтесь при появлении сложностей.
> > 
> > > С уважением,
> > > 
> > > снс каф. 7,
> > > Алексей Леонов.
> > > _______________________________________________
> > > hpc mailing list
> > > hpc at lists.mephi.ru
> > > https://lists.mephi.ru/listinfo/hpc
> > 
> > -- 
> > С уважением,
> > инженер отдела Unix-технологий МИФИ,
> > Аникеев Артём.
> > Тел.: 8 (495) 788-56-99, доб. 8998
> > 
> 
> 

-- 
С уважением,
инженер отдела Unix-технологий МИФИ,
Аникеев Артём.
Тел.: 8 (495) 788-56-99, доб. 8998



More information about the hpc mailing list