Современные информационные технологи /

2. Вычислительная техника и программирование

к.ф.-м.н. Онищенко Б.О., к.т.н. Супруненко О.А.

Черкасский национальный университет имени Богдана Хмельницкого, Украина

РАСШИРЕНИЕ ТЕХНОЛОГИИ OPEN MP

НА ЯЗЫК ПРОГРАММИРОВАНИЯ ADA

 

Современные технологи разработки параллельных программ предлагают различные подходы к распараллеливанию последовательных программ. Эти подходы отличаются идеей разбиения элементов программы на параллельно выполняемые и продуктивностью параллельного выполнения. Особого внимания заслуживают средства, которые позволяют быстро «распараллелить» уже разработанную последовательную программу, путём добавления к её выходному коду специальных инструкций, с помощью которых среда компиляции формирует параллельный вариант кода и соответствующий исполняемый файл. К средствам такого типа принадлежат технология OpenMP [1, 2], которая была разработана для языков программирования C, C++ и Fortran и оказалась настолько удачной, что было сделано несколько попыток адаптировать её для других языков программирования. Например, в рамках проекта PascalABC.NET реализована поддержка наиболее употребительных директив OpenMP [3] в среде программирования PascalABC.NET. В работе [4] показана возможность адаптации технологии OpenMP для языка программирования Ада.

В языке Ада реализованы собственные средства для разработки параллельных программ, к которым принадлежат задачи (Tasks) и защищённые модули (Protected Units) [55], с помощью которых можно разработать параллельную программу любой сложности. Однако использование встроенных средств распараллеливания языка Ада может в некоторых случаях чрезмерно усложнить процесс разработки программного обеспечения и сделать текст программы недоступным для понимания и анализа. К таким случаям можно отнести программирование численных алгоритмов и алгоритмов, в которых проводится обработка больших массивов данных, и т.п. Альтернативными при распараллеливании подобных алгоритмов являются средства, которые реализованы в технологии OpenMP.

Як показано в [4], каждой директиве OpenMP можно поставить в соответствие определённую комбинацию языковых конструкций языка Ада так, что полученная после преобразования программа будет иметь параллельную структуру, и, соответственно, будет более эффективно работать на многопроцессорных компьютерах. В данной работе показана возможность введения директив, которые аналогичны директивам OpenMP, в язык программирования Ада, проведён анализ возможных способов замены директив параллельными языковыми конструкциями и представлена общая последовательность действий при переходе от последовательной Ада-программы с директивами OpenMP к параллельной Ада-программе.

Директивы OpenMP организованы таким образом, что не влияют на работу последовательной программы. В частности, в языках C/C++ директивы OpenMP обозначаются в виде указаний препроцессору:

 

#pragma omp <директива> [<опция> [[,] <опция>]…]

  <последовательность операторов>;

 

а в языке Fortran – это специального вида комментарии:

!$omp <директива> [<опция> [[,] <опция>]…]

  <последовательность операторов>

!$omp end <директива> [<опция> [[,] <опция>]…].

 

Все сложные инструкции языка Ада имеют начало и конец, например, if <логическое выражение> then <последовательность операторов> end if; [55]. Потому более целесообразно было бы организовать директивы 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.