[ на главную ]

Автоматизированная система декомпозиции последовательных программ для параллельных вычислителей с распределенной памятью.

Е.С.Борисов

четверг, 9 сентября 2004 г.

1 Введение

Существуют задачи, не решаемые на серийных персональных компьютерах за приемлемое время, к примеру прогнозирование погоды, моделирование процессов разрушения в механике (crash-тесты)[ 1 ]. Для решения таких задач используют многопроцессорные (параллельные) вычислители. Множество архитектур параллельных вычислителей весьма обширно. Основной характеристикой при классификации [ 2 ] параллельных вычислительных систем является способ организации памяти :

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

Основным параметром оценки работы параллельной системы является коэффициент ускорения [ 4 ] :

$\displaystyle s(p)=\frac{T(1)}{T(p)}$ (1)

где $ T(i)$ - время выполнения программы на $ i$ процессорах.

Эффективность выполнения программы на параллельном вычислителе, в первую очередь, зависит от меры распараллеливания самой задачи, описываемой программой. Параллельные программы, вообще говоря, являются архитектурно зависимыми.

Оценить максимально возможное ускорение для данной программы можно, используя закон Амдала [ 3 ] :

$\displaystyle s(p)\leq\frac{1}{f+\frac{1-f}{p}}$ (2)

где $ 0\leq f\leq 1$ - доля последовательных операций в параллельной программе, $ p$ - количество процессоров.

2 Средства параллельных вычислений

Приведем краткое описание технологий параллельных вычислений. Средства параллельных вычислений можно разделить на три уровня :

Рисунок 1: Средства параллельных вычислений

2.1 Аппаратные средства для параллельных вычислений

Выделяют следующие классы параллельных систем.

2.2 Коммуникационные библиотеки

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

Соответственно типу организации памяти, существует два основных типа коммуникационных библиотек [ 5 ] и интерфейсов параллельного программирования :

Надо отметить, что одно может быть сымитировано через другое :

Существует множество библиотек и интерфейсов параллельного программирования. Отметим наиболее популярные из них.

2.3 Средства автоматического распараллеливания

Параллельные программы можно писать ''вручную'', непосредственно вставляя в нужные места вызовы коммуникационной библиотеки. Этот путь требует от программиста специальной подготовки. Альтернативой является использование систем автоматического и полуавтоматического распараллеливания последовательных программ.

3 Математические модели

Рассмотрим три модели для описания параллельных вычислений. В этой работе применяется алгебродинамический подход к построению математических моделей параллельных вычислений[ 4 ]. Этот подход основывается на алгебре алгоритмов Глушкова[ 7 ]. Для описания функционирования моделей будем использовать понятия теории дискретных динамических систем[ 7 ].

Дискретная динамическая система (ДДС, transition systems) представляет собой тройку :

$\displaystyle (S,S_0,\delta)$

где


Алгебра алгоритмов Глушкова [ 7 ] определяется следующим образом. Введем три множества :

Алгеброй алгоритмов назовем пару :

$\displaystyle A(Y,U)$ (3)

где

В алгебре алгоритмов ( 3 ) определены следующие операции :

В алгебре операторов выделяется множество базовых операторов, а в алгебре условий $ U$ выделяется множество базовых условий. Таким образом, порождается алгебра алгоритмов $ A$ .

Регулярное выражение в $ A$ назовём регулярной программой .


Модели памяти

Для множества регулярных программ $ P=\{P_i\}$ модель распределённой памяти строится следующим образом :
Множество переменных $ I_i$ регулярной программы $ P_i$ назовём множеством внутренних переменных или внутренней памятью программы $ P_i$ если $ I_i\cap I_j = \oslash$ для $ i\neq j$
тогда множество $ I=\bigcup\limits_i I_i$ назовём распределённой памятью $ P$

Все множество переменных $ V$ регулярной программы $ P_i\in P$ назовём двухуровневой памятью $ P_i$
если $ V=I\cup E$ ; $ (\ I\cap E=\oslash\ )$ и определены операторы внешнего обмена - чтение $ x:\leftarrow e$ и запись $ x:\rightarrow e$ ( $ x\in I ; e\in E$ )
В этом случае, $ E$ назовём внешней памятью $ P_i\in P$
В общем случае будем считать, что $ \forall P_i \in P$ внутренняя память - распределена, внешняя память является общей.

4 Постановка задачи и ее решение

Сформулируем постановку задачи: построить полуавтоматическую систему распараллеливания последовательных программ для параллельных вычислителей с распределенной памятью.

4.1 Модель полуавтоматической системы распараллеливания

Система полуавтоматического распараллеливания описывается тремя алгебродинамическими моделями :

Рисунок 2: Схема асинхронного вызова подпрограммы

В основе, представленной ниже, системы полуавтоматического распараллеливания лежат асинхронный вызов подпрограммы и принцип неготового значения[ 8 ]. При асинхронном вызове подпрограммы $ y=f'(x)$ из процесса $ p$ , выполняющего подпрограмму $ f$ происходят такие события (рис. 2 ) :

  1. порождается параллельный процесс $ p'$ , с подпрограммой $ f'(x)$
  2. выходные переменные , подпрограммы $ f'$ , помещаются в очередь неготовых значений процесса $ p$ .
  3. вызвавшая подпрограмму $ f'$ , подпрограмма $ f$ продолжает свою работу до тех пор, пока ей не понадобятся значения в переменных , в этом месте $ f$ происходит ожидание возврата $ f'$ (т. е. синхронизация процессов $ p$ и $ p'$ )

4.2 Модель последовательной программы

Определим последовательную многокомпонентную программу как упорядоченное множество пар $ S$ . Каждая такая пара определяет подпрограмму в $ S$ :

$\displaystyle S=\{(s_0,S_0),\ldots,(s_n,S_n)\}$ (4)

где $ (s_i,S_i)$ - i-тая подпрограмма

Введем операторы вызова подпрограммы и возврата из подпрограммы .

Процесс выполнения последовательной многокомпонентной программы $ S$ описывается дискретной динамической системой $ \Omega$ :

$\displaystyle \Omega=(S,\Sigma,\sigma_0,\Sigma_E,\delta)$

Здесь

4.3 Модель параллельной программы

Введем понятие параллельной программы и определим его как упорядоченое множество пар $ P$ . Каждая такая пара определяет параллельный процесс :

$\displaystyle P=\{(p_0,P_0),\ldots,(p_n,P_n)\}$ (5)

где

Определим два типа операторов обмена данными между компонентами параллельной программы :

Назовем элементарными операторами все операторы, не являющиеся операторами обмена данными между компонентами параллельной программы.


Процесс выполнения последовательной многокомпонентной программы $ P$ описывается дискретной динамической системой $ \Pi$ :

$\displaystyle \Pi=(P,\Sigma,\sigma_0,\Sigma_E,\delta)$
Здесь

4.4 Транслятор-распараллеливатель $ \Delta $

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

$\displaystyle \Delta=(S,\Sigma,\sigma_0,\sigma_E,\delta)$

Здесь

5 Реализация

Опишем реализацию транслятора-распараллеливателя для языка C.

5.1 Построение кластера

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

Можно использовать уже существующую сеть рабочих станций (системы такого типа иногда называют COW - Cluster Of Workstations). При этом узлы могут иметь различную архитектуру, производительность, работать под управлением разных OC (MS Windows, Linux, FreeBSD).

Если узлы планируется использовать только в составе кластера, то их можно существенно облегчить (отказаться от жёстких дисков, видеокарт, мониторов и т.п.). В облегчённом варианте узлы будут загружаться и управляться через сеть. Количество узлов и требуемая пропускная способность сети определяется задачами, которые планируется запускать на кластере.

5.2 Стандарт MPI

Message Passing Interface (MPI) - популярный стандарт для построения параллельных программ по модели обмена сообщениями. Этот стандарт обычно используют в параллельных системах с распределённой памятью (кластера и т.п.).

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

Разными коллективами разработчиков написано несколько программных пакетов, удовлетворяющих спецификации MPI (MPICH, LAM, HPVM etc.). Существуют стандартные ''привязки'' MPI к языкам С, С++, Fortran 77/90, а также реализации почти для всех суперкомпьютерных платформ и сетей рабочих станций.

5.3 Работа с MPI на кластере

В данной работе для прогона контрольных примеров был использован кластер на основе сети персональных компьютеров и библиотека MPICH (http://www-unix.mcs.anl.gov/mpi/mpich), созданная авторами спецификации MPI. Этот пакет можно получить и использовать бесплатно. В состав MPICH входит библиотека программирования, загрузчик приложений, утилиты. Существуют реализации этой коммуникационной библиотеки для многих UNIX-платформ, MS Windows.

Для запуска MPI-программ на гомогенном (состоящего из одинаковых узлов, работающих под одной OS) кластере необходимо выполнить следующие шаги.

  1. Инсталлировать MPICH на головной узел (машина, с которой будем запускать MPI-программы) кластера. Инсталлировать MPICH на все узлы кластера обычно не требуется .

  2. MPICH использует rsh (remote shell) для запуска процессов на узлах кластера. Поэтому необходимо запустить на каждом узле rshd (remote shell server) и согласовать права доступа.

    Для обеспечения более высокого уровня сетевой безопасности можно использовать ssh - OpenSSH remote login client.

  3. Компиляция MPI-программы на языке С выполняется утилитой mpicc , представляющей собой надстройку над C-компилятором, установленным в данной OS.
    mpicc myprog.c -o myprog

  4. Перед запуском ''бинарника'' myprog необходимо разослать его на все узлы кластера, причем локальный путь до myprog должен быть одинаковый на всех машинах, например - /usr/mpibin/myprog .

    Вместо процедуры копирования программы на узлы можно использовать NFS (Network File System) :

    • на головной машине запускаем NFS-сервер и открываем каталог с myprog
    • на каждом рабочем узле кластера, монтируем NFS головной машины, используя единый для всех узлов локальный путь.

  5. Запуск MPI-программы производится командой :
    mpirun -machinefile machines -np n myprog
    • machines - файл, содержащий список узлов кластера
    • n - количество параллельных процессов

После команды mpirun , MPICH, используя rsh , запускает n -раз программу myprog на машинах из machines . При запуске каждому процессу присваивается уникальный номер, и далее программа работает исходя из этого номера.

5.4 Реализация системы полуавтоматического распараллеливания

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

Реализация $ \Delta $ транслирует программу на расширенном языке C в параллельную MPI-программу на C.

Рисунок 3: схема работы транслятора $ \Delta $
\begin{figure}\centering
{\tt С$\Delta$-программа $\stackrel{\Delta}{\longrighta...
...ограмма $\stackrel{mpicc}{\longrightarrow}$
исполняемая программа}\end{figure}

Для того что бы воспользоваться системой полуавтоматического распараллеливания $ \Delta $ , необходимо выполнить следующие шаги.

Важной особенностью данной системы является ''гладкий синтаксис''. Введение ключевого слова asyncron является единственным отличием языка C $ \Delta $ от стандартного C. Программа для распараллеливателя может, без каких либо изменений, собираться обычным (последовательным) транслятором языка C, достаточно добавить в заголовок программы #define asyncron , в этом случае получается обычная (последовательная) программа.


Распараллеливатель можно получить [ здесь ]


5.5 Пример

Рассмотрим классический пример параллельного программирования - вычисление $ \pi $ . Число $ \pi $ будем вычислять как определенный интеграл :

$\displaystyle \int\limits_{0}^{1}{\frac{4}{1+x^2}}dx = \left. 4\cdot \arctg(x)\right\vert _0^1 = \pi$

Согласно правилу прямоугольников интеграл можно заменить суммой:

$\displaystyle \pi \approx h \cdot \sum\limits_{i=1}^{n}\left(\frac{4}{1+x_i^2}\right)\ ;\
h = \frac{1}{n}\ ;\
x_i = \left( i - \frac{1}{2}\right)\cdot h$

5.5.1 Результаты счета



Программа вычисления $ \pi $ для распараллеливателя -- [ pi.c ]

Параллельная MPI-программа вычисления $ \pi $ , результат работы распараллеливателя -- [ pi_mpi.c ]


Литература

1
Задачи для суперкомпьютеров - http://parallel.ru/research/apps.html

2
Основные классы современных параллельных компьютеров - http://parallel.ru/computers/classes.html

3
В.В.Воеводин, Вл.В.Воеводин Параллельные вычисления - Санкт-Петербург : БХВ-Петербург, 2002 - 608 стр.

4
А.Е.Дорошенко Математические модели и методы организации высокопроизводительных параллельных вычислений - Киев : Наукова думка, 2000 - 176 стр.

5
Коммуникационные библиотеки - http://www.parallel.ru/tech/tech_dev/ifaces.html

6
Средства распознавания параллелизма в алгоритмах - http://www.parallel.ru/tech/tech_dev/auto_par.html

7
Ю.В. Капитонова, А.А. Летичевский Математическая теория проектирования вычислительных систем - Москва : Наука, 1988 - 295 стр.

8
Т-система - http://t-system2.polnet.botik.ru


Evgeny S. Borisov
2004-09-16
При использовании материалов этого сайта, пожалуйста вставляйте в свой текст ссылку на мою статью.