Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_Trsipv_Ch_2.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
12.41 Mб
Скачать

8.8 Приведение стандартной схемы программы к ярусно-параллельной форме

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

A: ввод (x,y);

B: l:=x;

C: h:=y;

D: v:=c+y;

E: z:=c+x;

P: если X>Y то на F иначе на G;

F: h:=x;l;=y;

G: распечатка (min (z , v),max(z , v));

H: печать (l,h);

Так как стандартная схема не имеет циклов для распараллеливания программ м.б. применена несложная техника. Суть ее заключается в максимальном “подтягивании” совмещенных операций (операторов) к “началу” программы и формировании на их основе параллельных операторов. Результирующий параллельный алгоритм является ярусно-параллельной формой программы (ЯПФ).

Алгоритм преобразования линейной циклической программы к ЯПФ включает 2 этапа:

1.Строится граф зависимостей между операторами схемы. Различают информационную, логическую и конкуренционную зависимости.

2.Распределение операторов программы по ярусам ЯПФ.

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

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

Конкуренционная зависимость появляется тогда, когда перемещение операторов при сборке в ярусы ЯПФ может вызвать конкуренцию над памятью, то есть запирание каких-либо переменных до их использования. Если вычисление ведется над общей памятью (всем ветвям параллельный программы доступны все переменные) и для операторов А и В выполняется необходимое и достаточное условие в следующем виде:

(In(A)^Out(B))U(In(B)^Out(A))U(Out(A)^Out(B))0 (24)

то операторы А и В являются конкуренционно зависимыми. В (1) In(А) – набор используемых , Out(A) – набор изменяемых оператором А переменных.

Информационная, логическая и конкуренционная зависимости изображаются в виде стрелок, соединяющих операторы, и в объединении дают граф полной зависимости операций. Построенный для стандартной схемы, изображенный на 11, граф зависимости (информационной, логической и конкуренционной) представлен на рисунке 11. Этот же граф является А – схемой программы.

Рисунок 11- Представление стандартной схемы программы

Рисунок 12- Граф зависимости (А – схема) программы

На этом графе только одна логическая зависимость от P к F , две конкуренционные – от В и С к F (F зависит от В и С конкуренционно, потому что выполнение одного из операторов В или С после F “забило” бы информацию в ячейке h или l) , остальные зависимости графа - информационные.

На графе зависимости д.б. отображены как непосредственные зависимости , так и транзитивные (т.е. операторы зависят один от другого опосредованно или транзитивно). Для построения транзитивных зависимостей необходимо

вLine 108 спомнить свойства отношения *. При добавлении транзитивных зависимостей в А – схеме программы добавятся дуги из А в G и H и из P в H. После построения непосредственных и транзитивных зависимостей между операторами, при этом применяется обозначение dep. Таким образом , dep(A,B) обозначает, что В зависит от А непосредственно или опосредованно (транзитивно).

Второй этап построения ЯПФ состоит в распределении операторов по ярусам. Идея распределения такова. В первый ярус заносятся все те операторы, в которые не ведут стрелки графа зависимости. Если построено k ярусов, то b (k+1)-ый ярус заносятся все те операторы, которые имеют входящие стрелки только от операторов k-ярусов. Более основательная и подробная формулировка алгоритма построения ЯПФ будет дана ниже. Так для стандартной схемы (Рис.11) программы ее ЯПФ, построенная с использованием графа зависимостей (Рис.13) , будет иметь вид , представленный на Рис.13.

Рисунок 13- Ярусно-параллельная форма программы

На построение ЯПФ процесс программирования структуры заканчивается. Схема, полученная таким образом, предполагает максимальное распараллеливание программы без учета ограничений на число процессоров, т.е. она не учитывает особенностей конкретного многопроцессорного вычислительного комплекса (действительное число процессоров МВК).

В том случае если необходимо адаптировать структуру программы под особенности конкретного МВК (с заданным числом процессоров) строят параллельно-последовательный вид программы и осуществляют выделение параллельных ветвей (число ветвей равно числу процессоров МВК) и распределяют операторы по ветвям.

Число ветвей и тип распределения зависят от конфигурации МВК и д.б. согласованы с графом зависимостей. Таким образом, распределение схемы ЯПФ по ветвям позволяет адаптировать структуру программы к особенностям конкретного МВК. При распределении операторов по параллельно выполняемым ветвям для синхронизации операторов, находящихся в разных ветвях параллельно – последовательной программы, вводится специальный оператор ожидания события, обозначенный через wait (в терминах языка Ада – установление рандеву). На примере Рис.14, на котором приведена схема параллельно – последовательной программы для 2-х ветвей (МВК c двумя процессорами), назначение и действие оператора wait м.б. прокомментировано следующим образом.

Рисунок 14 - Параллельно-последовательная схема программы

для двухпроцессорного МВК

Адаптация ЯПФ к особенностям МВК оcуществляется путем простановки операторов wait в соответствующих параллельных ветвях для каждого оператора программы.Wait соответствует спусковой функции, определяющей условия запуска операторов в А-схеме. Спусковой функцией в А-схеме называется предикат (логическое выражение), истинное значение которого позволяет инициализировать выполнение соответствующего оператора. Оператор wait определяет логические условия запуска операторов вычислителей или логических операторов.

В правой ветви оператора wait(C) и wait(D) задают ожидание выполнения операторов C и D , информация с которых нужна соответственно F и G. В левой ветви ожидается более сложное событие : когда выполнится F либо когда предикат Р в результате вычисления окажется равным нулю (в этом случае F выполняться не будет). В этом случае h и l берутся в той же ветви и можно начинать вычисление H.

Событие, которое должен ожидать некоторый оператор А для начала своего выполнения строится из следующих соображений:

1. = {1, ..... , n }- множество всех путей, ведущих из входной вершины схемы в оператор А. Так, схема не имеет циклов, то множество конечно. Условие включения оператора А имеет вид:

С (А) = wait(C1 V .....VCn)

Каждый элемент Сi соответствует пути i и имеет вид “конъюнкции” из операторов, лежащих на пути i , от которых зависит А (т.е. для включения А (ожидание включения) необходимо выполнение любого из путей на информационном графе, проходящих через оператор А и выполнение всех операторов любого из этих путей , от которых зависит А). Формализованное введение данного определения имеет вид :

i =А1,А2,.....,Аm,

где А1 – входной оператор пути , а Am = A. Пусть Аi1,Аij,.....,Аik - элементы пути i , такие что для всех j=1,k имеет место dep(Аi,A)

(т.е. А непосредственно или опосредованно зависит от Аi). Тогда

Сi=di1 ^ ...^dij....^dik , где

dij= Aij , если Aij – преобразователь;

Aij=0 , если Aij – распознаватель и путь i включает 0-стрелку , выходящую из Aij (т.е. должен выполниться распознаватель с результатом , равным 0);

Aij=1 , если Aij – распознаватель и путь i включает 1-стрелку , выходящую из Aij (т.е. должен выполниться распознаватель с результатом , равным 0);

Так как любой путь i определяет некоторый вычислительный процесс , тогда “следует дождаться выполнения всех вычислительных актов , от которых зависит оператор А”. Полное условие ожидания выполниться , когда выполниться один нз наборов Сi .

В то же время можно говорить об условии невыполнения оператора А. Если в пути Сi есть коньюнктивный компонент в виде распознавателя , например Р=1 , и распознаватель выполнился с результатом Р=0 , то А заведомо не выполнится.

В случае выполнения С(А) говорят , что оно (условие) равно 1 , в случае невыполнения равно 0.

После того , как определено действие и особенности применения оператора wait ожидания готовности (включения) оператор А естественным становится обоснование алгоритма распределения операторов ярусно-параллельной формы по ветвям параллельно-последовательной программы, адаптированной под особенности конкретного МВК. В этом смысле число ветвей параллельно-последовательной формы программы должно соответствовать числу процессоров МВК.

Алгоритм.

  1. Нахождение информационной зависимости схемы S. Для каждой пары операторов A и BS проверяется выполнение зависимости

In (B)  Out(A)=0

(In (B) - используемые переменные оператора В, Out(A) - изменяемые переменные оператора А).

  1. Нахождение логических зависимостей. Для каждой пары операторов Р и А (P, AS; Р расположен на пути ранее А), где Р – распознаватель, проверяется существование пары путей с указанным определением логической зависимости.

  2. Нахождение конкуренционных зависимостей. Для каждой пары операторов проверяется выполнение соотношения (24) (должно получаться, что для операторов А и В это соотношение выполняется). Далее проверяется, есть ли путь в схеме S, содержащий как А так и В. Если такой путь существует и А - первый, а В – второй операторы (операции) этого пути, то на графе зависимостей из А в В проводится стрелка конкуренционной зависимости.

  3. Построение графа зависимостей (непосредственных). На

*

основании свойств отношения  получение транзитивного замыкания всех трех построенных зависимостей: Dep(,). Отображение на графе непооредственный и апосредственной зависимостей.

  1. Формирование первого яруса ЯПФ. К первому ярусу ЯПФ относятся операторы и распознаватели А (обозначаемые через А), для которых

B Dep(B,A)

(Для любого В «не» Dep(А,В)), т.е. для любого оператора В нет зависимости оператора А от них (нет таких операторов В, от которых зависел бы А).

  1. Проверка окончания формирования ЯПФ. Пусть сформировано k ярусов ЯПФ.

A11, A12,A13,…,A1m1;

A21, A22,A23,…,A2m1;

…………………….

Ak1, Ak2,Ak3,…,Akm1;

Если не осталось нераспределенных операторов, перейти к шагу 8, иначе к шагу 7.

  1. (k+1)–ый ярус ЯПФ содержит операторы А, для которых выполняется соотношение

B (Dep(B,A)  i  k j (B=Aij)).

Имеются номера ярусов i, меньше или равные k, имеются номера j операторов на этих i-ых ярусах ЯПФ, такие, что В=Аij и при этом Dep(В,А), т.е. операторы на (k+1)-ом ярусе зависят от операторов предыдущих ярусов. Переход на шаг 6.

  1. Начало формирования параллельной программы.

  2. Распределение первого яруса по ветвям параллельно-последовательной программы (количество ветвей параллельной программы равно количетсву процессоров МВК).

В i–ую ветвь включаются оперторы A1i, A1n+i,…,1rn+i, где i=1,n (n – число проессоров), r - кратность повторения числа процессоров. Формирование первой ветви из операторов первого яруса закончится тогда, когда список операторов этого яруса будет исчерпан, т.е. когда rn+im1 .

  1. Проверка окончания формирования ветвей. Если распределены по ветвям k ярусов и если ЯПФ исчерпана (распределяемые операторы (операции) закончились, то перейти на шаг 12, иначе, если есть (k+1)-ый ярус ЯПФ перейти на шаг 11.

  2. Расппределение (k+1)–го яруса по ветвям. К i-ой ветви приписывается совокупность, состоящая из двух операторов – оператора условия включения А и самого оператора А, т.е. (по аналогии с первым ярусом ЯПФ): C(Ak+1,i), Ak+1,i,…,C(Ak+1,n+i),Ak+1,n+i,…,C(Ak+1,rn+i),Ak+1,rn+i, где i=1,n, пока список операторов (k+1)-го яруса, т.е. пока rn+im1+1. Переход на шаг 10.

Выражение C(Ak+1,rn+i) в этой записи – условие включения оператора Ak+1,rn+i. До начала вычислений оно не определено. В процессе вычисления если оно становится равным 1, то следующим выполняется оператор Ak+1,rn+i. Если же условие равно 0, то выполнение Ak+1,rn+i пропускается и управление передается на следующий оператор ветви.

В процессе формирования условия могут быть реализованы некотрые упрощения: в качестве конъюктивных составляющих dij оператора WAIT могут не включаться:

а) преобразователи, которые или сами находятся в той же ветви, ил в этой ветви находятся операторы их ожидания.

б) или в ветви находятся операторы ожидания события, следующего за dij в другой ветви.

12.Окончание формирования схемы параллельно-последовательной программы.

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

Рисунок 15 - Параллельно-последовательная схема программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]