Введение в архитектуру компьютеров

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


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

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

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

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

своих ветвей.

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

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


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

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

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

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

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



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

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

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



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

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

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

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

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

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

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

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

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

При расширении последовательных ЯП обычно используются операторы 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. Если, например, необходимо одновременно выполнить целый массив параллельных ветвей, то в параллельном ЯП следует организовать некоторый специальный цикл. Синтаксически он напоминает обычный цикл в ЯП.


Содержание раздела