Современные информационные технологи /
2. Вычислительная техника и программирование
к.ф.-м.н. Онищенко Б.О., к.т.н. Супруненко О.А.
Черкасский национальный университет имени Богдана
Хмельницкого, Украина
РАСШИРЕНИЕ ТЕХНОЛОГИИ
OPEN MP
НА ЯЗЫК
ПРОГРАММИРОВАНИЯ ADA
Современные технологи разработки параллельных
программ предлагают различные подходы к распараллеливанию последовательных программ.
Эти подходы отличаются идеей разбиения элементов программы на параллельно выполняемые
и продуктивностью параллельного выполнения. Особого внимания заслуживают
средства, которые позволяют быстро «распараллелить» уже разработанную последовательную
программу, путём добавления к её выходному коду специальных инструкций, с
помощью которых среда компиляции формирует параллельный вариант кода и соответствующий
исполняемый файл. К средствам такого типа принадлежат технология OpenMP [1, 2], которая
была разработана для языков программирования C, C++ и Fortran и оказалась настолько
удачной, что было сделано несколько попыток адаптировать её для других языков
программирования. Например, в рамках проекта PascalABC.NET реализована поддержка
наиболее употребительных директив OpenMP [3]
в среде программирования PascalABC.NET. В работе [4] показана возможность
адаптации технологии OpenMP для языка программирования Ада.
В языке Ада реализованы собственные
средства для разработки параллельных программ, к которым принадлежат задачи
(Tasks) и защищённые модули (Protected Units) [5, 5], с помощью
которых можно разработать параллельную программу любой сложности. Однако использование
встроенных средств распараллеливания языка Ада может в некоторых случаях чрезмерно
усложнить процесс разработки программного обеспечения и сделать текст программы
недоступным для понимания и анализа. К таким случаям можно отнести программирование
численных алгоритмов и алгоритмов, в которых проводится обработка больших массивов
данных, и т.п. Альтернативными при распараллеливании подобных алгоритмов являются
средства, которые реализованы в технологии OpenMP.
Як показано в [4], каждой директиве OpenMP можно поставить в соответствие определённую комбинацию языковых конструкций языка Ада так, что полученная после преобразования программа будет иметь параллельную структуру, и, соответственно, будет более эффективно работать на многопроцессорных компьютерах. В данной работе показана возможность введения директив, которые аналогичны директивам OpenMP, в язык программирования Ада, проведён анализ возможных способов замены директив параллельными языковыми конструкциями и представлена общая последовательность действий при переходе от последовательной Ада-программы с директивами OpenMP к параллельной Ада-программе.
Директивы OpenMP организованы таким образом,
что не влияют на работу последовательной программы. В частности, в языках C/C++
директивы OpenMP обозначаются в виде указаний препроцессору:
#pragma omp <директива> [<опция> [[,]
<опция>]…]
<последовательность
операторов>;
а в языке Fortran – это специального вида комментарии:
!$omp <директива> [<опция> [[,] <опция>]…]
<последовательность
операторов>
!$omp end <директива> [<опция> [[,]
<опция>]…].
Все сложные инструкции языка Ада имеют начало
и конец, например, if <логическое
выражение> then <последовательность операторов> end if; [5, 5]. Потому
более целесообразно было бы организовать директивы OpenMP в языке программирования
Ада подобно тому, как это сделано в языке Fortran, то есть с помощью комментариев
специального вида:
–-omp <директива> [<опция> [[,] <опция>]…]
<последовательность
операторов>
–-omp end <директива> [<опция> [[,]
<опция>]…].
В данной работе рассмотрены варианты замены
конкретных директив OpenMP на параллельные конструкции языка Ада, в частности
представлен вариант замены директивы parallel.
Перед началом распараллеливания линейной
программы, прежде всего, определяют количество доступных процессорных элементов,
используя соответствующие функции пакетов system.multiprocessors или Ada.Environment_Variables.
Параллельная работа выделенного директивой
parallel фрагмента программы обеспечивается с помощью задач.
Весь фрагмент размещается в программном блоке (declare).
В середине блока объявляется задачный тип с одним входом. Тело задачного типа содержит
параллельный фрагмент программы. На следующем шаге необходимо организовать одновременную
работу нескольких экземпляров объявленного задачного типа. Это можно сделать,
например, с помощью массива, элементами которого являются задачи. С помощью
входа и механизма рандеву, каждой задаче передаётся её идентификационный
номер.
Другим способом передачи идентификационного
номера в задачу является использование дискриминанта в объявлении задачного типа.
В таком случае вход для передачи номера не нужен, но механизм создания и
активации задачи несколько изменится.
Возможно также использовать модуль защищённого
типа, который содержит текущее значение идентификационного номера, передаёт его
задаче по её запросу и наращивает. Этот модуль можно разместить в отдельном
пакете, что позволит улучшить понятность текста основной программы, и даст возможность
использовать одно и то же описание для разных параллельных фрагментов, по мере их
размещения в программе.
Последний описанный способ, по нашему
мнению, является наиболее удачным, потому что он не требует организации дополнительных
циклических структур. Защищённый же модуль занимает только ресурсы в памяти
компьютера и не использует процессорные ресурсы.
Таким образом, представленная возможность
реализации директив OpenMP в программах на языке Ада является перспективной. По
образцу директивы parallel можно разработать представления всех других директив
технологии OpenMP, а также программу автоматической модификации последовательного
программного кода с директивами в программный код, который содержит параллельные
конструкции языка Ада.
Литература:
1.
OpenMP Application Program Interface Version 3.0 May
2008. [Электронный документ]. Режим доступа: http://www.openmp.org/mp-documents/spec30.pdf. Проверено: 18.07.2014.
2. Антонов А.С. Параллельное
программирование с использованием тезнологии OpenMP. – М.: Изд-во МГУ,
2009. – 76 с.
3. Малеванный М.С. Реализация директив OpenMP для языка
Pascal ABC.NET. Магистерская диссертация. – Ростов-на-Дону, 2011. – 52 с.
4. Stpiczyński P. Ada as
a language for programming clusters of SMPs. – Annales UMCS Informatica AI
1, 2003. – P.P. 73-79.
5.
Ada Reference Manual ISO/IEC 8652:2007(E) Ed. 3. [Электронный документ].
Режим доступа: http://ocw.unican.es/ensenanzas-tecnicas/programacion-en-lenguaje-ada/otros-recursos-2/RM-Final.pdf.
Проверено: 11.01.2015.
6. Гавва А. «Адское»
программирование. Ada-95. Компилятор GNAT. [Электронный документ]. Режим
доступа: http://www.ada-ru.org/V-0.4w/index.html Проверено: 11.01.2015.