Next:5. ВЫСОКОПРОИЗВОДИТЕЛЬНЫЙ ВЫЧИСЛИТЕЛЬНЫЙ КЛАСТЕР
Up:4. МНОГОПРОЦЕССОРНАЯ ВЫЧИСЛИТЕЛЬНАЯ СИСТЕМА nCUBE2
Prev:4.6. Библиотека подпрограмм хост-компьютера для взаимодействия с параллельными программами nCUBE2

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

include 'ncube/npara_prt.hf' ! include-файл libnpara.a
integer i, n
double precision w,
gsum, sum
double precision v
integer np, myid, ierr, proc, j, dim, msgtype, mask
real*8 time, mflops, time1, dsecnd

с Вызов функции идентификации процессора myid и опроса
c размерности заказанного подкуба dim
call whoami(myid, proc , j, dim)
c Операцию чтения с клавиатуры выполняет только 0-й процессор
if ( myid .eq. 0 ) then
print *, 'Input number of stripes : '
read *, n
time1 = dsecnd()
endif
c Установка переменных для функции nbroadcast
msgtype = 1
mask = -1
c Рассылка параметра n по всем процессорам
ierr = nbroadcast(n, 4, 0, msgtype, mask)
c Подсчет заказанного числа процессоров
np = 2**dim

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
msgtype = 2
mask = -1
node = 0
с Суммирование частичных сумм с сохранением результата на 0-м
c процессоре
gsum = dsum(sum, node, msgtype, mask)
с Вывод информации производит только 0-ой процессор
if (myid .eq. 0) then
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'
endif
end

Средства разработки параллельных программ, входящие в состав 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 является также основным средством параллельного программирования на высокопроизводительном вычислительном кластере.




Next:5. ВЫСОКОПРОИЗВОДИТЕЛЬНЫЙ ВЫЧИСЛИТЕЛЬНЫЙ КЛАСТЕР
Up:4. МНОГОПРОЦЕССОРНАЯ ВЫЧИСЛИТЕЛЬНАЯ СИСТЕМА nCUBE2
Prev:4.6. Библиотека подпрограмм хост-компьютера для взаимодействия с параллельными программами nCUBE2