4.7. Пример параллельной программы с использованием средств PSE
В заключение рассмотрим классический пример программы вычисления числа на многопроцессорной
системе nCUBE2 с использованием стандартных средств разработки параллельных программ PSE. Для расчета используем формулу:
(4.1) |
Интегрирование будем выполнять методом трапеций. Для получения точности 10-8 необходимо интервал разбить на 106 частей. Для начала приведем текст обычной последовательной программы и посмотрим, каким образом ее нужно модифицировать, чтобы получить параллельную версию.
с numerical integration to calculate pi (sequential program) program calc_pi integer i, n double precision w, sum double precision v integer np real*8 time, mflops, time1, dsecnd c Вводим число точек разбиения интервала print *, 'Input number of stripes : ' read *, n np = 1 с Включаем таймер time1 = dsecnd() w = 1.0 / n sum = 0.0d0 с Основной цикл интегрирования do i = 1, n v = (i - 0.5d0) * w v = 4.0d0 / (1.0d0 + v * v) sum = sum + v end do с Фиксируем время, затраченное на вычисления time = dsecnd() - time1 с Подсчитываем производительность компьютера в Mflops mflops = 6 * n / (1000000.0 * time) print *, 'pi is approximated with ', sum * w print *, 'time = ', time, ' seconds' print *, 'mflops = ', mflops, ' on ', np, ' processors' print *, 'mflops = ', mflops/np, ' for one processor' end
Это классическая легко распараллеливающаяся задача. В самом деле, операторы внутри цикла образуют независимые подзадачи, поэтому мы можем распределить выполнение этих подзадач на некоторый набор процессоров. Аддитивность операции суммирования позволяет разбить ее выполнение на вычисление частичных сумм на каждом процессоре с последующим суммированием этих частичных сумм. Параллельная версия этой программы с использованием средств PSE выглядит следующим образом:
c numerical integration to calculate pi (parallel program)
program calc_pi
integer i, n
double precision w,
gsum, sum
double precision v
integer np, myid, ierr, proc, j, dim, msgtype, maskreal*8 time, mflops, time1, dsecnd
с Вызов функции идентификации процессора myid и опроса
c размерности заказанного подкуба dim
c Операцию чтения с клавиатуры выполняет только 0-й процессор
print *, 'Input number of stripes : '
read *, n
time1 = dsecnd()
endif
c Установка переменных для функции nbroadcast
c Рассылка параметра n по всем процессорам
c Подсчет заказанного числа процессоров
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
c Установка переменных для функции dsum
с Суммирование частичных сумм с сохранением результата на 0-м
c процессоре
с Вывод информации производит только 0-ой процессор
time = dsecnd() - 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'
endifend
Средства разработки параллельных программ, входящие в состав PSE, являются типичными для многопроцессорных систем. Те или иные аналоги рассмотренных выше функций можно найти в составе программного обеспечения любой многопроцессорной системы. Как правило, производители многопроцессорных систем включают в программное обеспечение различные варианты коммуникационных библиотек.
Общепризнанным стандартом такой коммуникационной библиотеки сегодня по праву считается MPI, поскольку о его поддержке объявили практически все фирмы-производители многопроцессорных систем и разработчики программного обеспечения для них. Подробное рассмотрение функциональности этой библиотеки приводится в части 2 настоящего руководства. Существует несколько бесплатно распространяемых реализаций этой коммуникационной библиотеки:
MPICH | - разработка Argonne National Laboratory; |
LAM | - разработка Ohio Supercomputer Center (входит в дистрибутив Linux); |
CHIMP/MPI | - разработка Edinburgh Parallel Computing Centre. |
На многопроцессорной системе nCUBE2 установлена свободно распространяемая реализация этой библиотеки MPICH, которую мы настоятельно рекомендуем в качестве основного средства разработки параллельных программ. Использование этой коммуникационной библиотеки позволяет:
Опыт работы с этой библиотекой на nCUBE2 показал, что, во-первых, практически не происходит потери производительности, и, во-вторых, не требуется никакой модификации программы при переносе на другую многопроцессорную систему (Linux кластер, 2-х процессорную Alpha DS20E). Технология работы с параллельной программой на nCUBE2 остается той же самой - единственное отличие состоит в том, что при компиляции программы необходимо подключить MPI библиотеку:
ncc -O -o myprog myprog.c -lmpi
Библиотека MPICH является также основным средством параллельного программирования на высокопроизводительном вычислительном кластере.