.
Начертательная геометрия Геометрическое черчение Инженерная графика Интегралы Математический анализ Матрицы Производные Векторная алгебра

 

  ЯЗЫКИ ПАРАЛЛЕЛЬНОГО ПРОГРАММИРОВАНИЯ

 

При эксплуатации первых многопроцессорных ВС для повышения эффективности их работы возникла необходимость в параллельных алгоритмах, а следовательно, и в языках параллельного программирования (ЯПП), имеющих специальные средства для описания параллельных процессов. ЯПП в первую очередь должны предоставлять программистам средства для описания явного и обнаружения скрытого параллелизма. На сегодняшний день разработаны параллельные алгоритмы во многих областях обработки информации. Поэтому нужен язык, который позволял бы описывать имеющиеся параллельные алгоритмы. На создание подобных языков существенное влияние оказывают принципы, заложенные в языках моделирования различных явлений, ибо они включают мощные средства отображения параллельных процессов. Кроме того, при разработке языков необходимо учитывать те средства описания параллелизма, которые присутствуют в современных языках программирования (АЛГОЛ-68, ПАСКАЛЬ, PL/1, МОДУЛА и др.), и структуру параллельных методов численного решения задач.

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

·  взаимодействия фрагментов (процессов) через доступ к общим пе-ременным;

·  взаимодействия посредством передачи межпроцессорных сообщений.

Еще один из возможных признаков классификации языков – число вовлекаемых во взаимодействие процессов. Можно выделить языки, обеспечивающие явное задание:

·  индивидуальных (парных) взаимодействий между фрагментами: механизм подчиненных процессов ОС/360, язык взаимодействующих процессов Хоара, ОССАМ, язык граф-схем;

·  групповых взаимодействий между фрагментами (процессами): ОВС-КОБОЛ (ФОРТРАН), параллельный КОБОЛ, языковые средства суперкомпьютера ИЛЛИАК-4.

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

·  кто и когда осуществляет разбиение исходной программы и распределение по процессорам;

·  какое время сохраняется разбиение;

·  каковы максимально неделимые участки;

·  какие критерии используются при разбиении и распределении.

 

6.1. Основные подходы к проектированию языков
параллельного программирования

 

Средства описания вычислительного процесса, заложенные в большинстве языков программирования, носят, как правило, последовательный характер. Все дело в том, что применяемое понятие алгоритма (уточнение с помощью нормального алгоритма Маркова или одноголовочной машины Тьюринга) использует пошаговый процесс его реализации. Даже такие высокоразвитые и широко применяемые языки, как ФОРТРАН и ПАСКАЛЬ, базируются на последовательном характере записи алгоритма. Однако в связи с созданием и эксплуатацией многопроцессорных систем и многомашинных комплексов назрела и постепенно начала воплощаться в жизнь идея описания алгоритмов в последовательно-параллельной форме, что позволило явно указывать в программе элементы, допускающие их параллельное выполнение.

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

Рассмотрим основные пути, по которым идут при создании ЯПП.

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

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

При проектировании ЯПП работа ведется как в направлении создания дополнительных средств в существующих последовательных языках, так и в плане создания ЯПП на совершенно новых принципах.

Популярность языков программирования может определяться различными причинами: изощренной реализацией на компьютере, имеющимися приложениями, традицией использования и т. д. Однако проектирование ЯП всегда должно сопровождаться определенными требованиями. Язык программирования – это формальный язык связи человека с компьютером, предназначенный для описания данных и алгоритмов их обработки. В отличие от языка общения между людьми он не должен допускать двусмысленностей и неопределенностей. Вот некоторые требования к ЯП:

·  ясность, простота и согласованность понятий языка с простыми и регулярными правилами их конструирования;

·  ясность структуры программы, написанной на ЯП, с возможностями их модификации;

·  естественность в приложениях: иметь для реализации задачи подходящие структуры данных, операции, управляющие структуры и естественный синтаксис;

·  легкость расширения за счет моделирования простыми средствами сложных структур, имеющихся в конкретных задачах;

·  богатое внешнее обеспечение: средства тестирования, отладки, редактирования, хранения;

·  эффективность создания, трансляции, тестирования, выполнения и использования программ.

Однако следует отметить, что проблема удобства и простоты некоторого ЯП для создания программ "с нуля" сегодня менее актуальна. Уже написаны программы для решения такого количества задач (некоторые из них по много раз на различных ЯП и в разных программных средах), что следует только в соответствии с поставленной задачей отобрать необходимые компоненты (программы), настроить их и проинтегрировать, т. е. объединить в одну систему. Такие действия адекватны технологии крупноблочного проектирования, в основе которой лежит понятие компонентной объектной среды (КОС). КОС – это современный фундамент для накопления и использования знаний. Она базируется на компонентной объектной модели и включает готовые компоненты и инструментальное окружение, позволяющее выбирать необходимые компоненты, настраивать их и связывать между собой, создавая необходимое приложение.

КОС обладает всеми свойствами, присущими объектно-ориентированному подходу:

·  инкапсуляция объектных компонент скрывает от пользователя сложности их реализации, делая видимым лишь предоставляемый интерфейс;

·  наследование позволяет совершенствовать компоненты, не нарушая целостности объектной оболочки;

·  полиморфизм, по сути, позволяет группировать объекты, характеристики которых в некотором плане можно считать сходными.

Что касается языков параллельного программирования, то к ним могут быть предъявлены дополнительные требования. В частности, ЯПП должен:

·  иметь средства максимального выражения в программе присущего данной задаче естественного параллелизма;

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

·  обладать простотой диспетчеризации параллельных программ, записанных на нем;

·  обеспечить простоту записи (преобразования) программ на ЯПП по заданным последовательным алгоритмам.

При расширении последовательных ЯП обычно используются операторы for-join, parbegin-parend, cobegin-coend – аналог операторных скобок в обычных ЯП, окаймляющих фрагменты параллельного выполнения.

Типичным примером расширения возможностей последовательных ЯП служит дополнение языков АЛГОЛ-60 и ФОРТРАН операторами типа fork < список меток > и join < список меток >. Оператор fork открывает участок параллельности в заданной программе, а оператор join закрывает его. После выполнения каждой ветви с заданной в операторе fork меткой управление передается оператору join. Последний не передает управление на продолжение программы до тех пор, пока управление от всех сегментов, метки которых указаны в операторе join, ему не переданы.

Чтобы ЯП АЛГОЛ-60 обладал необходимыми свойствами языка параллельного программирования, его можно дополнить (кроме fork и join) операторами типа:

terminate < список меток > – оператор блокировки фрагментов программы (если он предшествует оператору join, то блокируется выполнение фрагментов программы с общими у обоих операторов метками);

obtain < список переменных >, который блокирует использование переменных, участвующих в вычислительном процессе;

release < список переменных >, снимающего блокировку с указанных в нем переменных.

Если, например, нам в программе встретилась запись

k) join S1, S2, S7

k + 1) for i = 1 step 1 until N do,

то управление от оператора k будет передано оператору k + 1 только в том случае, если выполнятся фрагменты с метками S1, S2, S7. Если, например, необходимо одновременно выполнить целый массив параллельных ветвей, то в параллельном ЯП следует организовать некоторый специальный цикл. Синтаксически он напоминает обычный цикл в ЯП.

Если, например, в последовательном ЯП определен цикл

for i = L step 1 until N do R(i),

который задает последовательное выполнение вычислений

R(L), R(L + 1), ... , R(N),

то их одновременная обработка требует конфигурации

for i = L step 1 until N do par R(i),

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

for i = < индексное множество > do < тип параллельности >,

где < индексное множество > задает цикл типа арифметической прогрессии, перечисления, логического выражения и т. д., а < тип параллельности > определяет семантику оператора, например ориентацию на асинхронные ВС с общей памятью, с разделенной памятью, ВС с единым потоком команд ОКМД, возможность синхронизации ветвей с обменом или без обмена информации т. д.

На главную