Next:8.2. Перемножение матриц
Up:8. ПРИМЕРЫ ПРОГРАММ
Prev:8. ПРИМЕРЫ ПРОГРАММ

8.1. Вычисление числа

В качестве первого примера использования среды параллельного программирования MPI рассмотрим программу вычисления числа (последовательная и параллельная версии программы, написанные с использованием средств программирования PSE nCUBE2, приведены в части I [1]).

Данный пример хорошо иллюстрирует общность подходов к разработке параллельных программ с использованием различных сред параллельного программирования. Во многих случаях имена одних функций просто меняются на имена других идентичных им функций. В частности, если сопоставить параллельную версию программы вычисления числа с использованием средств PSE и предлагаемую ниже программу, то мы увидим практически один и тот же набор средств, отличающихся только своей реализацией.

Однако, при разработке сложных программ среда параллельного программирования MPI предоставляет более удобные средства для разработки параллельных приложений, поскольку содержит в себе высокоэффективные реализации достаточно сложных алгоритмов обмена данными. Как и в примере с использованием среды параллельного программирования PSE, жирным шрифтом будем выделять изменения в программе по сравнению с однопроцессорной версией.

program calc_pi
include 'mpif.h'
integer i, n
double precision w,
gsum, sum
double precision v
integer np, myid, ierr
real*8 time, mflops, time1, time2, dsecnd
с инициализация MPI и определение процессорной конфигурации
call MPI_INIT( ierr )
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, np, ierr )
с информацию с клавиатуры считывает 0-й процессор
if ( myid .eq. 0 ) then
print *, 'Введите число точек разбиения интервала : '
read *, n
time1 = MPI_Wtime()
endif
с рассылка числа точек разбиения всем процессорам
call MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
с вычисление частичной суммы на процессоре
w = 1.0 / n
sum = 0.0d0

do i = myid+1, n, np
v = (i - 0.5d0 ) * w
v = 4.0d0 / (1.0d0 + v * v)
sum = sum + v
end do
с суммирование частичных сумм с сохранением результата в 0-м
с процессоре
call MPI_REDUCE(sum, gsum, 1, MPI_DOUBLE_PRECISION,
$    MPI_SUM, 0, MPI_COMM_WORLD, ierr)
с печать выходной информации с 0-го процессора
if (myid .eq. 0) then
time2 = MPI_Wtime()
time   = time2 - time1
mflops = 9 * n / (1000000.0 * time)
print *, 'pi is approximated with ',
gsum *w
print *, 'time = ', time, ' seconds'
print *, 'mflops = ', mflops, ' on ', np, ' processors'
print *, 'mflops = ', mflops/np, ' for one processor'
endif
с закрытие MPI
call MPI_FINALIZE(ierr)
end



Next:8.2. Перемножение матриц
Up:8. ПРИМЕРЫ ПРОГРАММ
Prev:8. ПРИМЕРЫ ПРОГРАММ