При разработке параллельных программ с использованием MPI на алгоритмическом языке Fortran существует не так много особенностей по сравнению с применением алгоритмического языка C:
В качестве принятых соглашений при разработке программ на языке 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