Параллельные языки программирования
Параллельные языки программирования отличаются от традиционных языков средствами задания обменных взаимодействий, реализующих фазы настройки, обмена и управления вычислениями. Многие параллельные языки разработаны на основе обычных алгоритмических языков путем введения в них системных операторов для описания взаимодействия параллельных ветвей вычислений. Примерами таких языков могут служить параллельные "Fortran", "Pascal", "С" и другие языки программирования.
К настоящему времени разработаны мощные средства параллельного программирования, специально ориентированные на использование в современных параллельных вычислительных системах типа SIMD и MIMD. Ниже описаны основные характеристики наиболее известных языков, используемых в этих системах.
Языки "Modula-2" и "Modula-P". Языки программирования"Modula-2" и "Modula-P" являются расширенными процедурными версиями языка "Pascal". Важнейшими концепциями параллельности в этих языках являются:
- введение в рассмотрение так называемой концепции процесса программирования, т.е. декларирование параллельных process-типов и принадлежащих им переменных;
- синхронизация параллельных процессов через мониторы (см. ниже) с использованием условных переменных;
- кластеризация (группирование) программных элементов в классы абстрактных типов данных.
Синхронизация процессов в языке "Modula-P" осуществляется с помощью трехуровневой структуры так называемых модулей уровня, к числу которых относятся:
- модуль-процессор, в котором начинается инициализация всех процессов и их синхронизация;
- модуль высокого уровня, в котором процессы декларируются и запускаются на выполнение;
- модуль нижнего уровня, который применяется при решении задач реального времени или при машинном управлении объектами (например, роботами).
Синхронизация процессов осуществляется с помощью семафоров Дейкстра, т.е. конструктивов, которые могут быть вставлены в модули нижнего уровня. Семафоры декларируются как переменные типа SEMAPHORE c числом инициализации, задаваемым в прямоугольных скобках и операциями P и V, например (каждый оператор записывается в отдельной строке):
VAR schutz: SEMAPHORE [1]; P (schutz)Инструкции V (schutz)
В модулях высокого уровня параллельные процессы могут декларироваться и запускаться на выполнение в явной форме как обычные процедуры. Синхронизация процессов в этих модулях выполняется с помощью мониторов с условными очередями ожидания.
Монитор представляет собой блок MONITOR трансформаций операций над данными и операций доступа к данным. Процедуры доступа имеют название ENTRY, которые вызываются из определенного процесса и содержат имя вызываемого монитора, например:
вызов операции sync: lesen(10,w); (*читать*)
MONITOR sync;
VAR a: ARRAY [1..10]OF INTEGER; (*данные монитора*) j: INTEGER
ENTRY lesen ( i: INTEGER: VAR: wert: INTEGER) (*читать*)
BEGIN wert := a[i] END lessen;
ENTRY schreiben ( i,:wert: INTEGER) (*записывать*)
BEGIN a[i] :=wert END schreiben;
BEGIN FOR j:=1 TO 10DO a[i]:=0 END (*инициализация монитора*)
END MONITOR sync;
Во время занятия одним из процессов определенного монитора другие процессы не могут вызвать этот монитор. Во избежание взаимного блокирования процедура MONITOR-ENTRY не может вызвать другую ENTRY.
Обмен информацией между двумя процессами, локализованными в разных вычислительных узлах и не имеющими общей памяти, осуществляется путем использования операции дистанционного вызова Remote-Procedure-Call. Языковым конструктивом для этого обмена является оператор COMMUNICATION. Связи между процессами организуются с помощью процедуры INITCOM в инициализирующей части процессор-модуля, которая вызывается с помощью конструктива CALL.
Язык "С*" ("C-star"). Язык "С*" ("C-star") разработан специально для вычислительных машин серии Connection Machine и представляет собой расширение традиционного языка "С" за счет использования специальных параллельных языковых конструктивов. В настоящее время существует несколько версий языка "С*", среди которых наиболее распространенной является версия 6 этого языка.
Параллельные конструктивы языка "С*" представляют собой векторные переменные, которые декларируются с помощью так называемых shape-описаний, определяющих структуру вектора аналогично декларированию массива. Для выполнения параллельных операций над векторами в инструктивной части программы вначале выбираются соответствующие операторы shapeс операцией with. Если число имеющихся процессорных элементов (ПЭ) больше, чем указано в shape, то другие ПЭ в пределах данного блока программы остаются неактивными.
В одном выражении или инструкции допустимы лишь те вектора, которые принадлежат одному и тому же оператору shape, т.е. имеют одну и ту же структуру и одинаковое число компонент. Поэтому присвоить некоторому скаляру векторное выражение можно только с помощью процедуры "type-casting".
Виртуальная структура связи между ПЭ не декларируется на этапе подготовки программы. Ее реализует автоматическая программа-рутина в процессе доступа к данным соседних ПЭ. Существует два типа коммуникаций между ПЭ: "общая коммуникация" и "коммуникация-решетка". Для реализации быстрой решетчатой коммуникации используется стандартная функция pcoord, которая выдает позицию векторной компоненты относительно ранее определенного оператора shape в виде координатных параметров.
"Целевые адреса" задаются так называемыми индексными переменными, причем вектор-передатчик и вектор-приемник могут принадлежать к разным структурам shape-описаний. Индексы могут быть размещены как в левой, так и в правой стороне операции присвоения. Если оператор shape является многомерным, то для каждой координаты необходимо задавать собственный индекс. С помощью индексов можно также выделять отдельные векторные компоненты и присваивать их значения скаляру.
Кроме операции присвоения над вектором могут выполняться параллельно все другие операции языка "С". При этом сложные операции присвоения применяются как операторы редукции (векторов в скаляры), к числу которых относятся следующие операторы:
+ = (сумма);* =(произведение);& =("и");| =("или");^ =(xor);(min);>?=(max)
Назначение операторов редукции пользователем не допускается. Для программирования параллельных операций в языке "С*" используются следующие операции, управляемые параметрами:
scan – выделение частных результатов операций над вектором;
spread – распределение результатов параллельной операции между компонентами другой векторной переменной;
enumerate – определение позиции каждой активной компоненты вектора;
rank – определение позиции каждой компоненты вектора в процессе сортировки компонент в соответствии с их числовыми номерами.
Ниже приведен пример использования языка "С*" при программировании оператора Лапласа (каждый оператор "С*" записывается в отдельной строке):
shape [100] [100]grid; int: grid pixel, dim1, dim2; …
with (grid) { dim1 = pcoord ( 0 );dim2 = pcoord ( 1 );
pixel =4* pixel – [ dim1 –1] [ dim2] pixel – [ dim1 +1] [ dim2] pixel
- [ dim1] [ dim2 –1] - [ dim1] [ dim2 +1] pixel }
Дата добавления: 2023-01-28; просмотров: 420;