Теория и практика параллельных вычислений

       

Разработка параллельных программ с использованием MPI на алгоритмическом языке Fortran


При разработке параллельных программ с использованием MPI на алгоритмическом языке Fortran существует не так много особенностей по сравнению с применением алгоритмического языка C:

  • все константы, переменные и функции объявляются в подключаемом файле mpif.h;
  • подпрограммы библиотеки MPI являются процедурами и, тем самым, вызываются при помощи оператора вызова процедур CALL;
  • коды завершения передаются через дополнительный параметр целого типа, располагаемый на последнем месте в списке параметров процедур (кроме MPI_Wtime и MPI_Wtick);
  • все структуры (такие, например, как переменная status) являются массивами целого типа, размеры и номера ячеек которых описаны символическими константами (такими, как MPI_STATUS_SIZE для статуса операций);
  • типы MPI_Comm и MPI_Datatype представлены целых типом INTEGER.

В качестве принятых соглашений при разработке программ на языке Fortran рекомендуется записывать имена подпрограмм с применением прописных символов.

В качестве примера приведем варианты программы из п. 5.2.1.5 на алгоритмических языках Fortran 77 и Fortran 90.

Программа 5.3. Параллельная программа на языке Fortran 77

! Пример программы, использующей MPI на Fortran 77 program main include 'mpif.h' integer ProcNum, ProcRank, RecvRank, ierr integer i integer st(MPI_STATUS_SIZE) call MPI_INIT(ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, ProcNum, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, ProcRank, ierr)

if (ProcRank .gt. 0) goto 20 c Действия, выполняемые только процессом с рангом 0 print *, "Hello from process ", ProcRank do 10 i = 1, ProcNum - 1 call MPI_RECV(RecvRank, 1, MPI_INTEGER, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, st, ierr) print *, "Hello from process ", RecvRank 10 continue goto 30 c Сообщение, отправляемое всеми процессами, кроме процесса с рангом 0 20 call MPI_SEND(ProcRank, 1, MPI_INTEGER, 0, 0, MPI_COMM_WORLD, ierr) 30 call MPI_FINALIZE(ierr) stop end

Программа 5.4. Параллельная программа на языке Fortran 90

! Пример программы, использующей MPI на Fortran 90 program main use mpi

integer ProcNum, ProcRank, RecvRank, ierr integer status(MPI_STATUS_SIZE) integer i call MPI_INIT(ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, ProcNum, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, ProcRank, ierr) if (ProcRank .EQ. 0) then ! Действия, выполняемые только процессом с рангом 0 print *, "Hello from process ", ProcRank do i = 1, procnum - 1 call MPI_RECV(RecvRank, 1, MPI_INTEGER, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, status, ierr) print *, "Hello from process ", RecvRank enddo else c Сообщение, отправляемое всеми процессами, кроме процесса c с рангом 0 call MPI_SEND(ProcRank, 1, MPI_INTEGER, 0, 0, MPI_COMM_WORLD, ierr) endif call MPI_FINALIZE(ierr) stop end



Содержание раздела