Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

malyshkin_ve_korneev_vd_-_parallelnoe_programmirovanie_multikompyuterov

.pdf
Скачиваний:
63
Добавлен:
28.03.2016
Размер:
3.12 Mб
Скачать

реализует алгоритм, представленный множеством термов

z[1]

z[2]

z[i]

 

+

 

+

 

. . .

+

 

. . .

x[1]

y[1]

x[2]

y[2]

x[i]

y[i]

 

 

 

 

Рис. 1.5.

 

 

 

 

 

Рассмотрим другой пример.

 

 

 

 

 

n:=....

;

 

 

 

 

 

 

 

for i = 1 to n do

 

 

 

 

 

 

 

if P(x[i])>0

then z[i]:=x[i]+y[i] else

z[i]:=x[i]+y[i] ;

Реализованный программой алгоритм может быть

представлен множеством функциональных термов

 

 

 

z[1]

 

z[1]

 

z[i]

 

 

z[i]

 

ifP(x[1])

if¬P(x[1])

ifP(x[i])

if¬P(x[i])

 

 

+

 

-

...

+

 

 

-

. . .

x[1]

y[1]

x[1]

y[1]

x[i]

y[i]

x[i]

 

y[i]

 

 

 

Рис. 1.6.

 

 

 

 

 

38

Это множество функциональных термов строится фиксацией значения предиката P. Если фиксировать P=true, то программа реализует множество функциональных термов с использованием только операции “ +” . А если зафиксировать

P=false, то программа реализует множество функциональных термов с операцией “ -“ . Объединение этих множеств и даст множество, показанное на рис. 1.6.

Замечание. В разделе 1.2.5.

были введены понятия терма и

интерпретации I. Интерпретация I

 

определяет, каким

образом присваиваются значения всем предметным и

функциональным символам алгоритма. Если отвлечься от

несущественных в этом рассмотрении деталей, то компьютер

воспринимает

программу

именно

как

множество

функциональных термов, а заложенный в его оборудовании

алгоритм вычисляет интерпретацию I,

т.е. присваивает

значения всем предметным и функциональным символам

алгоритма. Именно вычисление

I

и есть функция

компьютера.

 

 

 

 

 

Определение. Функция f:DkD называется вычислимой функцией, если существует конечно порожденное множество T

функциональных термов и выполняется:

1. (x1,x2,...,xk,y) таких, что y=f(x1,x2,...,xk,) t(x1,x2,...,xk) T

такой, что dy=val(t)=val(t(x1,x2,...,xk));

39

Det11f

2. (x1,x2,...,xk,y) t(x1,x2,...,xk) T , если val(t(x1,x2,...,xk))=dy

то y=f(x1,x2,...,xk,y), т.е. T не

содержит

“ лишних”

термов, не

вычисляющих функцию f.

 

 

 

Множество термов T называется детерминантом Detf

функции f []. Детерминант

Detf

определяет

алгоритм

вычисления функции f. Если заданы два различных детерминанта и Det12f (существует счетное множество алгоритмов,

вычисляющих f), то Det11f Det12f тоже является детерминантом. Ясно, что детерминант может содержать два различных терма, вычисляющих значение одной и той же переменной, и, следовательно, многозначность функции f не исключается в общем случае.

Процедурные языки программирования типа С и Фортран содержат именно средства для реализации операторов суперпозиции, примитивной рекурсии и минимизации. Все прочие "излишества" языков (типа оператора go to в языке C,

блок COMMON в Фортране и т.п. ) служат для упрощения записи алгоритмов и улучшения качества их реализации и непринципиальны с точки зрения теории. В этом смысле все процедурные языки программирования похожи друг на друга как близнецы-братья.

Рассмотренный нами способ конечного порождения множества T - представление вычислимой функции конечным операторным термом. Существуют и другие способы

40

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

41

2.ЗАДАЧА КОНСТРУИРОВАНИЯ ПАРАЛЛЕЛЬНОЙ ПРОГРАММЫ

2.1.Представление алгоритма

Для точной формулировки задачи прежде всего определим понятие представления алгоритма A, вычисляющего функцию FA [5]. Рассматриваться будут лишь такие представления алгоритма, в которых в явном виде используются преобразователи значений входных величин (переменных) в

значения выходных. Такой преобразователь изображает элементарный шаг в интуитивном понятии алгоритма [10,13].

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

Каждый преобразователь a (будем впредь называть его

операцией) вычисляет функцию fα, значение которой есть результат выполнения преобразования (выполнение операции) a.

Представление алгоритма A есть набор S=(X,F,C,M), где

X={x,y,...,z} - конечное множество переменных, F={a,b,...,c} -

конечное множество операций.

С каждой операцией aÎF связаны входной in(a) и

выходной out(a) наборы переменных из X. Наборы in(a) и out(a)

будут при необходимости рассматриваться и как множества со всеми определенными для множеств операциями. Две операции a

и b называются информационно зависимыми, если out(a)Çin(b)

42

непусто. Две операции

a1 и

an

называются транзитивно

информационно

зависимыми,

если

существует

последовательность

a1,

a2,…,

a n

операций, попарно

информационно зависимых.

Графическое представление операции a показано на рис. 2.1. Мы будем говорить, что операция a вычисляет переменные out(a)=(y1,...,ym) из переменных in(a)=(x1,...,xn).

x 1

 

y 1

x 2

 

y 2

.

 

.

.

 

.

.

a

.

.

.

 

.

 

.

x n

 

y m

Рис. 2.1.

Отметим здесь, что функция fa имеет n аргументов и m

выходных переменных в отличие от обычно рассматриваемых в теории алгоритмов функций с одной выходной переменной.

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

43

необходимо изображать преобразователи со многими выходными переменными.

C - управление, т. е. множество ограничений на порядок выполнения операций. Управление может задаваться разными способами. Здесь полагаем, что каждое ограничение определяет порядок исполнения пары операций вида (a<b), что означает, что операция a должна стартовать и завершиться раньше b. Таким образом, управление C – это бинарное отношение частичного порядка на множестве F операций алгоритма A.

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

M задает распределение ресурсов мультикомпьютера.

Более детальные определения C и M не приводятся, а их свойства и формы представления лишь поясняются на примерах.

Для определенности считается, что для выполнения операции a в программе используется одноименная процедура a,

у которой есть входной in(a)=(x1,...,xn) и есть выходной out(a)=(y1,...,ym) наборы переменных, в программе обращение к a

имеет вид a(x1,...,xn,y1,...,ym).

Отображение M может сопоставить переменным x1 и y1

одну и ту же ячейку памяти, а переменным x2, ..., xn, y2, ..., ym

сопоставляются, например, отдельные ячейки памяти каждой.

Обращение тогда может иметь вид a(x1, ..., xn, y2, ..., ym), имея в

44

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

Одно из ограничений C может, к примеру, требовать,

чтобы операция b начала выполняться после завершения операции a. Часть ограничений управления C, определенных

информационной зависимостью между операциями (см. пример

П2), называется потоковым управлением остальные ограничения

C задают прямое управление, связанное обычно с распределением ресурсов и/или оптимизацией исполнения программы.

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

Реализацией алгоритма A, представленного в форме S,

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

Предполагается, что при любой реализации вычисляется функция

FA, т.е. C всегда содержит потоковое управление, которое и гарантирует вычисление FA.

Множество всех реализаций алгоритма A,

представленного в форме S, обозначим P(A,S). Если P(A,S) есть одноэлементное множество, то S - последовательное

45

представление. Будем говорить, что S - параллельное

представление алгоритма A, если множество P(A,S) содержит,

более одной реализации.

П1. Алгоритм задан на языке C, каждый вычисляющий (не управляющий) оператор программы есть операция, выполнение операции есть выполнение оператора языка, порядок выполнения операций полностью фиксирован и, следовательно,

представление последовательное.

П2. Пусть F=f(x1,x2), x1=g(y1,...,yk), x2=h(z1,...,zm) - операции, out(h)={x2}, out(g)=x1, out(f)={f0}. Тогда алгоритм А вычисления функции F=S(f,g,h)= f(g1(y1,..., yk), h=(z1,...,zm) представлен в параллельной форме S1, f, g и h – операции (рис.2.2а).

 

f0

 

 

 

 

 

f0

 

f

1)

g

h

f

 

f

 

 

 

 

 

 

S1

 

 

 

 

 

 

 

 

 

 

 

 

S2

x1

 

2)

h

g

f

 

 

 

x2

 

 

 

x1

x2

 

 

 

 

 

 

 

 

 

 

g

 

 

 

g

 

h

 

 

f

g

h

 

 

3)

 

 

 

 

 

 

h

 

 

 

y1, ... , yk

 

z1, ..., zm

 

 

 

y1, ... , yk

z1, ..., zm

 

 

 

 

 

 

 

а)

 

 

б)

 

 

 

Рис. 2.2. Рис. 2.3.

46

На рис. 2.2а стрелки показывают информационные зависимости между операциями. Следовательно, управление C в

представлении S1 - это множество {(g<f), (h<f)}.

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

Уменьшить потоковое управление (например, разрешить операции f выполняться раньше операции g) нельзя, так как при этом будет вычисляться, вообще говоря, не функция F, а какая-

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

F. Множество реализаций алгоритма А, представленного в форме

S1, состоит из трёх элементов, показанных на (рис.2.2б).

Определим теперь бинарное отношение непроцедурности на множестве представлений алгоритма A. Будем говорить, что представление S1 алгоритма A более непроцедурно, чем S2, если

P(A,S1)ÉP(A,S2). Например, пусть для хранения значений переменных используются ячейки памяти и заданы представления S1=(X,F,C1,R1) и S2=(X,F,C2,R2) алгоритма вычисления функции f=f(g(y1,...,yk),h(z1,...,zm)) (рис. 2.3). В S2

потребуем, чтобы значения переменных алгоритма x1 и z1

хранились в одной и той же ячейке памяти.

47

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