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

Ответы к экзамену (2)

.pdf
Скачиваний:
39
Добавлен:
28.06.2014
Размер:
1.09 Mб
Скачать

21

8. Язык FPTL: синтаксис (операция композиции функций, задание данных), семантика. Модели параллельного вычисления значений функций.

Программы на традиционных языках программирования, таких как Си, Паскаль, Java и т.п. состоят их последовательности модификаций значений некоторого набора переменных, который называется состоянием. До начала выполнения программы состояние имеет некоторое начальное значение σ0, в

котором представлены входные значения программы. После завершения программы состояние имеет новое значение σ’,включающее в себя то, что можно рассматривать как «результат» работы программы. Во время исполнения каждая команда изменяет состояние; следовательно, состояние проходит через некоторую конечную последовательность значений: σ = σ0 → σ1 → σ2 → · ·· → σn = σ’

Состояние модифицируется с помощью команд присваивания. Эти команды следуют одна за другой; операторы, такие как if и while, позволяют изменить порядок выполнения этих команд в зависимости от текущего значения состояния. Такой стиль программирования называют

императивным или процедурным.

Функциональная программа представляет собой некоторое выражение (в математическом смысле); выполнение программы означает вычисление значения этого выражения. можно сказать, что финальное состояние (или любое промежуточное) представляет собой некоторую функцию (в математическом смысле) от начального состояния, т.е. σ’= f(σ). В функциональном программировании используется именно эта точка зрения: программа представляет собой выражение, соответствующее функции f.

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

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

·Функциональные программы не используют переменные в том смысле, в котором это слово употребляется в императивном программировании. В частности в функциональных программах не используется оператор присваивания.

·Как следствие из предыдущего пункта, в функциональных программах нет циклов.

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

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

·Вместо циклов функциональные программы широко используют рекурсивные функции.

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

Рассмотрим следующую программу на языке Haskell: factorial n = if n == 0 then 1 else n * factorial (n -1)

Язык FPTL (Functional Parallel Typified Language) – язык функционального композиционного параллельного программирования. Его отличительные особенности:

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

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

22

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

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

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

Теоретическую базу языка FPTL составляют исследования по функциональной схемотологии и функциональным системам, которые обобщены в теории направленных отношений, объединяющей функциональный и логический стили программирования.

Основными семантическими объектами, представляемыми в языке, являются данные, функции, функционалы и реляционалы – параметризованные функции и типы данных соответственно.

Функции в FPTL рассматриваются как типизированные соответствия между множествами (данными). В общем случае, в качестве аргументов и значений функций в языке FPTL выступают кортежи произвольной длины m0, элементами которых могут быть синтаксически определенные объекты различной структуры.

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

В языке FPTL для построения функций используются следующие четыре простые операции композиции (интерпретация операции композиции задается как график функции, определяемой через эту операцию):

Все операции композиции являются бинарными, и их определение дается в инфиксной форме.

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

Функции f1 и f2 совместны тогда и только тогда, когда

;

функции f1 и f2 ортогональны, если они совместны и не существует кортежей b1 и b2 таких, что (a, b1)Îf1 и (a, b2)Îf2 для всякого a.

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

Аппликация функции f, определенной посредством операции Å, теперь имеет следующую семантику: f(x) = f1(x) или f(x) = f2(x), т.е. одному из значений f1(x) или f2(x), которое определено; если значение f1(x) и f2(x) оба не определены, f(x) также не определено.

4)Условие (->)

23

, если значение f1(x) определено.

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

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

причем это неопределенное значение является вычислимым и в описываемом далее языке представляется явно в виде обозначения w. Значение «истина» для pi(x) совпадает со значением

.

В качестве примера приведем программу вычисления факториала. Functional Program Factorial

Scheme Factorial

{

Factorial = (id*<0>).eq -> <1> +

(id*<0>).ne -> (id * (id*<1>).minus.Factorial) . mult;

}

Application %factorial(6)

В этом примере функция вычисления факториала определена с помощью одного функционального уравнения, содержащего только встроенные в язык функции (id – тождественная функция, eq – функция равенства и т.д.). Программа также содержит задание на вычисление функции (от аргумента 6).

9.Структурный анализ FPTL программ

10.Анализ вычислительной сложности FPTL программ

24

Язык FPTL строится на множестве базисных функций, операций (композиции функций, ·, *, →, +), системы рекурсивных уравнений.

Операции языка FPTL:

1.суперпозиция (· ) – ассоциативна, некоммутативна, последовательна f(m, n) = f1(m, k) · f2(k, n)

Вызов всех функций производится по значению (именованию). f1 · (f2 · f3) = (f1 · f2) · f3

F(x, y) = if x=0 then 1 else F (x-1, F(x, y))

1.конкатенация (*) – ассоциативна, некоммутативна, параллельна f(m, n1+n2) = f1(m, n1) * f2(m, n2)

f(m, 0) = {(α, β) | Ǝ j ((α, j) Є f1 Λ (j, β) Є f2

f (g1(x), g2(x), …, gk(x)) = (g1 * g2 * … * gk) · f

1.условие (→)

f(m, n) = f1(m, k) → f2(m, n)

1.объединение ортогональных функций () – коммутативна, ассоциативна

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

f(m, n) = f1(m, n) f2(m, n)

f(x) = if P (g(x)) then r (v(x),t(x)) else S (x-1) f1 (x) = x-1

f(1, 1) = ((g · p) → (v * t) · r)) ((g · p) → (f1 · S))

1.системы функциональных уравнений

Xi = ti, i = 1, 2, … ,n; F = {fi | i = 1, 2, …, k} – множество всех входящих в термы ti, i = 1, 2, …,

n, базисных функций. Приоритет операций: ·, *, →, . Терм:

1.любая базисная функция и любая функциональная переменная – терм

2.если t’ и t” – термы, то t’ · t”, t’ * t”, t’ → t”, t’ t” – термы.

Термы ti в задании ФС могут быть представлены в эквивалентной форме ti = ti1 Å ti2 Å … Å tik, i = 1, 2, …, n, где каждый терм tij не содержит операции ортогонального объединения Å.

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

Для любой базисной функции fi предполагается, что C(fi) задано и представляет собой некое действительное число. Также предполагается, что на области определения DR интересующей функции R для каждого терма tij задана вероятность qij того, что именно его значение будет определено при вычислении любого значения ti(d) для dÎDR. Эта вероятность напрямую связана в общем случае с условием, определяющим выполнение этого события.

Таким образом, .

При этих условиях сложность параллельного вычисления значения функций Xi в задании ФС может быть определена следующим образом.

По заданию ФС последовательно вычисляются «приближения» фиксированной точки для Xi согласно следующей формуле:

Xi(0) = f (нигде не определено),

25

Xi(k+1) = [Xj(k)/Xj | j = 1, 2, …, n]ti, i = 1, 2, …, n.

Очевидно, термы в правых частях приближения Xj(k) не содержат функциональной переменной Xi, и после их приведения к указанной выше эквивалентной форме их вычислительная сложностью определяется индукцией по построению:

C(fi) = ti (время вычисления значения базисной функции fi) C(t¢®t²) = max{C(t¢) , C(t²)}

C(t¢*t²) = max{C(t¢) , C(t²)} C(t¢·t²) = C(t¢) + C(t²)

Зная в представлении Xi(k) = ti1(k)Åti2(k)Å . ..Åtivi(k) вероятности qij, i, j = 1, 2, …, vi, того, что при вычислении значения Xi(k)(d) будет определено tij(k)(d) = d¢ (остальные значения tit(k)(d), it ¹ ij, будут не определены в силу того, что функции tij(k), i = 1, 2, …, vi попарно ортогональны) можно считать, что среднее время вычисления Xi(k)(d) для любого d из области определения Ximin (минимальной фиксированной точки для Xi) равно

.

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

Среднее время параллельного вычисления значений функции Ximin определяется как Ci(Xi (kmin)) для минимального значения k = kmin такого, что

|Ci(Xi(k)) - Ci(Xi(k+1))| £ e,

где заданная e – точность вычисления среднего значения.

Описанная итеративная процедура вычисления среднего времени параллельного вычисления значений функций сходится. Вместо нее можно применять другой, точный метод вычисления среднего значения, который сводится к решению множества систем линейных уравнений, построенных по ФС, в которых в качестве неизвестных выступают средние времена сложности C(Xi) параллельных вычислений значений функций Xi в задании ФС.

Например, для ФС

X1 = (f1*f2)·X1 Å f3®f4·X2 Å f5

X2 = f6®f7*f8·X2 Å f9

имеем следующую систему уравнений:

С(X1) = q1×(max{C(f1), C(f2)} + C(X1)) + q2×max{C(f3), C(f4)+C(X2)} + q3×C(f5) C(X2) = q4×max{C(f6), max{C(f7), C(f8)+C(X2)}} + q5×C(f9).

Здесь q1, q2, q3, q4, q5 – вероятности для соответствующих термов в ФС; q1+q2+q3=1; q4+q5=1. Из нее, вводя соответствующие условия-ограничения для всевозможных предположений о сложности C(Xi) функциональных переменных, можно построить множество систем линейных уравнений, решая которые и проверяя выполнение введенных условий, можно получить однозначную оценку средней сложности параллельных вычислений любой определяемой в ФС функции Xi, i = 1, 2, …, n.

Для рассматриваемого примера имеем следующие системы линейных уравнений с условиями – ограничениями:

1. С(X1) = q1×(max{C(f1), C(f2)} + C(X1)) + q2×C(f3) + q3×C(f5) C(X2) = q4×C(f6) + q5×C(f9),

если C(f4)+C(X2) £ C(f3) и max{C(f7), C(f8)+C(X2)} £ C(f6).

2. С(X1) = q1×(max{C(f1), C(f2)} + C(X1)) + q2×(C(f4)+C(X2)) + q3×C(f5) C(X2) = q4×max{C(f6), C(f8)+C(X2)} + q5×C(f9)

если C(f3) < C(f4)+C(X2) и C(f6) < max{C(f7), C(f8)+C(X2)}.

Эта система уравнений сводится к двум системам линейных уравнений с рассмотрением ограничений для каждой из них:

C(f7) £ C(f8)+C(X2) и C(f8)+C(X2) < C(f7).

26

Продолжая этот процесс, мы построим все искомые линейные системы уравнений с ограничениями, разрешая которые мы получим однозначную оценку для среднего времени вычисления C(X1) и C(X2) функций X1 и X2.

11. Распараллеливание последовательных программ путем трансляции в FPTL программы

12. Средства параллельного программирования MULTITHREADING. Модель параллельного выполнения программ, реализация на многоядерных компьютерах.

Потоки

27

OpenMP

OpenMP реализует параллельные вычисления с помощью многопоточности, в которой «главный» (master) поток создает набор подчиненных (slave) потоков и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами (количество процессоров не обязательно должно быть больше или равно количеству потоков).

Задачи, выполняемые потоками параллельно, также как и данные, требуемые для выполнения этих задач, описываются с помощью специальных директив препроцессора соответствующего языка — прагм. Например, участок кода на языке Fortran, который должен исполняться несколькими потоками, каждый из которых имеет свою копию переменной N, предваряется следующей директивой: !$OMP PARALLEL PRIVATE(N)

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

Ключевыми элементами OpenMP являются

конструкции для создания потоков (директива parallel),

конструкции распределения работы между потоками (директивы DOfor и section),

конструкции для управления работой с данными (выражения shared и private для определения класса памяти переменных),

конструкции для синхронизации потоков (директивы critical, atomic и barrier),

процедуры библиотеки поддержки времени выполнения (например, omp_get_thread_num),

переменные окружения (например, OMP_NUM_THREADS).

Pthreads

стандарт POSIX реализации потоков (нитей) выполнения, определяющий API для создания и управления ими.

Библиотеки, реализующие этот стандарт (и функции этого стандарта), обычно называются Pthreads (функции имеют приставку «pthread_»). Хотя наиболее известны варианты для Unix-подобных операционных систем, таких как Linux или Solaris, но существует и реализация для Microsoft Windows (Pthreads-w32)

pthread_create(): создание потока

pthread_exit(): завершение потока (должна вызываться функцией потока при завершении)

pthread_cancel(): отмена потока

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

(PTHREAD_CREATE_JOINABLE)

28

pthread_detach(): отключиться от потока, сделав его при этом отдельным

(PTHREAD_CREATE_DETACHED)

pthread_attr_init(): инициализировать структуру атрибутов потока

pthread_attr_setdetachstate(): указывает параметр "отделимости" потока (detach state),

который говорит о возможности подключения к нему (при помощи pthread_join) других потоков (значение PTHREAD_CREATE_JOINABLE) для ожидания окончания или о запрете подключения (значение PTHREAD_CREATE_DETACHED); ресурсы отдельного потока (PTHREAD_CREATE_DETACHED) при завершении автоматически освобождаются и возвращаются системе

pthread_attr_destroy(): освободить память от структуры атрибутов потока (уничтожить дескриптор)

Функции синхронизации потоков:

pthread_mutex_init(), pthread_mutex_destroy(), pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock(): с помощью мьютексов

pthread_cond_init(), pthread_cond_signal(), pthread_cond_wait(): с помощью условных переменных

13.Технологии проектирования параллельных программ, сравнение с технологиями проектирования последовательных программ.

14.Сетевое представление FPTL программ. Приведение их к максимальной параллельной форме.

15.Управление параллельными процессами в компьютерах и компьютерных системах. Организация управления.

Соседние файлы в предмете Параллельные вычислительные системы