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

УДК 519.681.3

А.А. Каленкова

Вычислительный центр им. А.А. Дородницына РАН

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

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

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

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

Проблема автоматической оптимизации потоков работ по времени выполнения, в частности, проблема автоматического распараллеливания независящих по данным действий, остаётся открытой, так как все привычные языки описания потоков работ имеют достаточно сложную формально определённую семантику или же она вовсе отсутствует. Был разработан специальный, построенный на нескольких основных сущностях, язык описания потоков работ [1]. Он представляет собой базис любого исполняемого языка описания потоков работ (такого, как BPEL [2], ВРМТ [3], XPDL [4] и т. д.), так как включает общие сущности для всех типов потоков работ.

Этот формальный язык позволяет использовать известные из теории компиляторов машинно-независимые оптимизиру-

ющие преобразования программ для оптимизации потоков работ.

В работе представлен метод оптимизации, основанный на удалении излишних потоков управления, позволяющий автоматически оптимизировать программу, записанную на формальном языке описания потоков работ. Ранее полуавтоматический метод оптимизации был предложен в [6]. Также были предложены методы распараллеливания потоков работ [7-8], базирующиеся на различных видах сетей Петри, таких, как сети потоков работ [9] и графы потоков работ [10]. Эти методы не учитывают наличие вершин выбора и циклов и во многих распространенных случаях бывают неприменимы.

В работе [5] предлагается автоматическая оптимизация потока работ, основанная на методах оптимизации из теории компиляторов [11]. Однако языки описания потоков работ отличаются от привычных языков программирования, и некоторые методы оптимизации, в частности, методы распараллеливания, должны быть изменены с учётом особенностей потоков работ. Приведен уникальный алгоритм автоматического распараллеливания независящих по данным действий потока работ.

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

леливания программ [12]. Каждому потоку работ ставится в соответствие граф анализа, который изменяется с помощью эквивалентных преобразований, и затем по новому графу анализа восстанавливается оптимизированный поток работ. Доказано, что в результате отдельных преобразований получается эквивалентный поток работ, то есть гарантируется идентичность результатов выполнения полученного в ходе оптимизации и исходного потоков работ для одних и тех же значений входных данных. Получено обоснование того, что преобразованный поток работ всегда будет выполняться за не большее время, чем исходный.

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

— множество идентификаторов — Id;

— множество произвольных строк — Str;

— множество типов данных — Type = {' string','boolean'};

— множество — Boolean = {'true',' false'}.

Поток работ задается формально как

шестерка WF = (E,H,A0,Ф,0,Ф).

1. Множество E С Id — это множество названий всех генерируемых в процессе выполнения потока работ событий. Множество E состоит из множества внутренних и внешних событий: E = Eint U Eext. Внутренние события генерируются самим экземпляром потока работ. В свою очередь множество внутренних событий разбивается на множество локальных и глобальных событий: Eint = Elocal U Eglobal. Информация о произошедших локальных событиях доступна только экземпляру потока работ, который сгенерировал эти события. Глобальные события обеспечивают возможность взаимодействия между экземпляром потока работ и внешними системами (например, другими исполняющимися экземплярами потоков работ). Внешним событием потока работ является некоторое событие, генерация которого имела место во внешней по отношению к потоку работ системе.

2. Множество действий П = ПсотрUQsimp состоит из множества составных и простых действий. Множество составных действий Псотр С Id — это множество названий действий. Множество сигнатур простых действий Qsimp С Id X Vtype X Vtype —

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

Vtype — это множество векторов произвольной длины с элементами из множества Type.

3. Начальное действие A0 G П. Действие, с которого начинается выполнение потока работ.

4. Множество переменных, определённых на уровне среды, уровне множественных экземпляров потока работ и уровне потока работ Ф = Фп U Фтс U Фwf. Переменные, определённые на уровне среды, доступны всем экземплярам потоков работ, выполняемым в этой среде. Переменные, определённые на уровне множественных экземпляров потоков работ, доступны всем экземплярам заданного потока работ. И наконец, переменные, определённые на уровне потока работ, доступны только текущему экземпляру потока работ. Каждая переменная — это тройка: название (уникальное для каждого уровня вложенности), тип и адрес уникальный в пределах среды Ф С Id X Type X Id. В любой момент времени переменной ставится в соответствие некоторое значение согласно её типу. Если при выполнении потока работ переменной не присвоено никакого значения, считается, что её значение — произвольная строка символов, соответствующая типу этой переменной. Если при описании потока работ явно не указан адрес переменной, он выдается автоматически.

5. Множество предикатов 0. Каждый предикат — это уникальное в пределах потока работ название предиката и вектор типов входных параметров 0 С Id X Vtype. Предикаты являются предопределёнными функциями, принимающими значение типа Boolean и использующимися в логических выражениях условных конструкций потока работ.

6. Множество формул Ф, описывающих структуру действий потока работ.

Для описания структуры действий используется множество формул Ф. Каждая из формул этого множества определяет

структуру составного действия, идентификатор которого указан в её левой части и имеет вид: A = (activity), где A Е Псотр.

Опишем синтаксис формул потока работ с помощью формы Бэкуса-Наура. Действия потока работ могут быть простыми и составными:

(activity) ::= (simpleActivity)\

(compositeActivity).

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

— Параллельная активация — '&'. Активация параллельных действий происходит в асинхронном режиме: на уровне исполняющей системы; это означает, что порождается набор параллельных процессов. При этом породивший их процесс (корневой) продолжает своё выполнение. Использование правила параллельной активации для единичного действия подразумевает его асинхронную активацию параллельно корневому процессу.

— Последовательная активация — '. '.

Или составное действие является специальным составным действием.

— Условный выбор IF. Проверяется логическое выражение, построенное на множестве предикатов, булевских переменных и булевских констант с использованием логических операторов '&' (конъюнкция), '\' (дизъюнкция),'!' (отрицание), а также скобок для расстановки приоритетов. Переменные задаются своими именами. Если значение выражения — 'истина'('true'), то запускается первое действие (второй аргумент), иначе — второе (третий аргумент).

— Цикл WHILE. Аналогично условному выбору вычисляется логическое выражение, пока значение выражения — 'истина'('true'), выполняется указанное действие.

(compositeActivity) ::= [ ('][(activity)]

(activationRule)(activity) [')'] \

'IF (' (booleanExpression)',

' (activity)',' (activity)')' \

'WHI LE(' (booleanExpression)',

'(activity)')'(activationRule) ::= '.'\'&'

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

— Генерация события с заданным именем — CREATE(x), x Е E.

— Удаление информации о произошедшем событии с заданным именем — DELETE(x), x Е E. Учитывается количество сгенерированных событий с заданным именем, и эта величина уменьшается на единицу. Если величина равна нулю, она не изменяется.

Ожидание события — WAIT(x), x Е E.

— Копирование значений переменных — COPY(x,y), COPY(x,s), x,y Е Ф, s Е Str. Специальное действие COPY присваивает переменной (первый аргумент) значение переменной или константу (второй аргумент). Аргументы должны иметь сопоставимый тип.

— Пустое действие, не выполняющее никакой работы, — EMPTY.

(simpleActivity) ::=

['

[' (' (variables)')']\' COPY (' (variable)',

' (variable/constant)')'

\'CREATE ('(identifier)')'

\' DELETE(' (identifier)')''

WAIT(' (identifier)')'\'EMPTY' (variables/constants) ::=

\

\

(variables) ::=

(variable/constant) ::=

Название простого действия не может совпадать с названиями ключевых слов CREATE, DELETE, WAIT, COPY, EMPTY, IF, WHILE, регистр учитывается.

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

Для пояснения формального описания потока работ приведём пример. Описываемый поток работ включает в себя три действия. Два из них A и B выполняются параллельно. Последнее действие C выполняется после синхронизации двух параллельных ветвей процесса. В примере введены дополнительные действия A', B', C', которые определяют «полезную» работу:

WF =

E Elocal {a,b}

П = {Ao,A,B,C,(A‘,(), (string)), (B‘,(),

(string)) ,(C ‘, (string ,string), (string))}

Ф = Ф^ = {(x,string) ,(y,string) ,(z,string)}

0 = 0 Ф = {Ao = A&B&C,

A = A'(x).CREATE (a),

B = B' (y).CREATE(b),

C = WAIT(a).W AIT (b).(x,y)C'(z)}

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

так как оптимизация по времени выполнения, основанная на работе с массивами, может быть темой отдельной работы. Нет локальных переменных, доступных на уровне вложенных потоков работ, то есть работа происходит над общей памятью. Это не сужает функциональность программ. Программы могут быть переписаны таким образом, что будет использоваться только общая память. Не указано правило активации «исключающий выбор» — '\', так как выбор действия неде-терминирован. Не предложены некоторые специальные предикаты для работы с событиями и переменными. И наконец, сильно сужено множество типов данных. Наложим дополнительные ограничения на программы, записанные на формальном языке описания потоков работ.

1. Программы синтаксически и семантически корректны.

2. Действия детерминированы. Результат выполнения каждого действия зависит только от входных параметров.

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

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

4. Выполнение всех действий в теле цикла завершается до начала следующей итерации этого цикла.

Это условие достаточно жёстко ограничивает выразительность языка (все действия, запущенные в асинхронном режи-

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

5. Во время выполнения потока работ локальные события с одним и тем же именем генерируются не более одного раза (тем не менее информация о произошедших событиях может быть использована несколько раз). Исключением является случай, когда событие создаётся внутри цикла (не более одного раза для каждой итерации цикла) и информация о нём должна быть удалена перед началом следующей итерации. Это является единственным случаем, когда может использоваться оператор DELETE. Информация

о произошедшем событии не может быть использована вне тела этого цикла. На основе предлагаемого метода анализа потоков работ могут быть определены алгоритмы автоматической проверки указанных условий.

6. Внутри цикла не может быть использован оператор ожидания WAIT внешнего по отношению к циклу события. Данное ограничение также достаточно жёстко ограничивает множество программ, но позволяет построить наглядный алгоритм оптимизации в пределах тела цикла.

7. Если в формулах потока работ есть действие по ожиданию события с заданным именем WAIT(a), то в формулах этого потока работ существует, по крайней мере, одно действие, генерирующее событие с этим именем CREATE (a).

8. Для удобства анализа будем рассматривать программы, где действия по ожиданию и созданию событий непосредственно следуют до и соответственно после терминального действия, не являющегося системным действием WAIT, CREATE или DELETE (отделены от него правилом активации '.').

Эти системные действия могут быть отделены лишь другими системными действиями по ожиданию и соответственно созданию событий.

Действия по ожиданию событий могут следовать непосредственно до составного действия IF или WHILE, и могут быть отделены лишь другими системными действиями по ожиданию событий. А действия по созданию событий могут следовать непосредственно до составного действия, которое запускается в результате выполнения или невыполнения условия выбора составного действия IF или является телом цикла для составного действия WHILE. Например, IF(f (a),CREATE(b).B,C) или WHILE(f (a),CREATE(b).B) и могут быть отделены лишь другими системными действиями по созданию событий. При этом действие по созданию события с одним и тем же именем не может быть выполнено перед каждым составным действием, запускающимся в зависимости от условия составного действия IF. Так, например, недопустим вариант

IF (f (a),CREATE (b).B, CREATE(d).CREATE(b).C).

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

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

Построим граф по формулам потока работ, для этого введём понятие графа анализа.

Определение. Графом анализа называется шестерка AG = (N, T, ts, C, M, F): N — конечное множество вершин;

T С N — конечное множество заданий; ts Е T — начальное задание;

C С N — конечное множество вершин выбора;

M С N — конечное множество вершин слияния;

F С N X N — поток управления.

При этом выполнены условия:

— у начального задания нет входящих дуг;

— для каждой вершины п Е N существует путь из в п.

Граф анализа — это направленный граф, в котором вершины делятся на задания, выполняющие полезную работу, и координаторы выбора или слияния (рис. 1).

W

Поток управления

7\

Начальное задание

w w

7\

Задание

/л

Выбор Слияние

Рис. 1. Элементы графа анализа

Семантика графа анализа потока работ похожа на семантику сети Петри, а точнее — на семантику графа потока работ [10]. Задание одновременно синхронизирует и разветвляет поток управления: ожидается появление фишек на всех входящих дугах (а не на вершинах в отличие от сети Петри), по одной фишке забирается с каждой дуги, далее выполняется задание и добавляется фишка на каждую исходящую дугу. При выборе ожидается появление фишек на всех входящих дугах, забираются фишки с входящих дуг, и добавляется по фишке на некоторые из исходящих дуг (количество исходящих дуг может быть произвольным). И, наконец, при слиянии забирается фишка с одной из входящих дуг (если фишки есть на нескольких дугах, выбор недетерминирован) и передается фишка на исходящую дугу. Будем говорить, что вершина графа анализа w обязательно предшествует вершине у, если w принадлежит каждому пути в графе от і8 до у. Вершина графа анализа w непосредственно обязательно предшествует вершине у, если w — ближайшая вершина к у, которая обязательно предшествует

V и не совпадает с ней [13].

Обозначим знаком ^ частичную функцию, а через Уіи и УаЫ множества векторов произвольной конечной длины с координатами из множества Ы и введём понятие размеченного графа анализа.

Определение. Размеченным графом анализа называется кортеж

LAG = (N, T, ts, C, M, F, Lt,

Lin, Lout, Lch, Lcond, Lf) •

— (N, T, ts, C, M, F) — граф анализа;

— Lt Є (T\{ts} — Id) — каждому заданию (за исключением начального задания) ставится в соответствие его название;

— Lin Є (T\{ts} U C — Vin) — некоторым заданиям и некоторым вершинам выбора ставится в соответствие список входных параметров;

— Lout Є (T\{ts} — Vout) — некоторым заданиям ставится в соответствие список выходных параметров;

— Lch Є (C — Str) — каждой вершине выбора ставится в соответствие условие выбора;

— Lcond Є (F — Boolean) — некоторым потокам управления ставится в соответствие условие;

— Lf Є (F — Id U {'&'}) — некоторым потокам управления ставится в соответствие идентификатор или амперсант.

Семантика размеченного графа анализа отличается тем, что вершина выбора передает фишки на все дуги с пометкой Lcond = true или на все дуги с пометкой

Lcond = false.

Опишем алгоритм построения размеченного графа анализа по формулам потока работ. Пусть Ao — начальное действие потока работ, тогда возможны два случая.

ts

Lt=A Lin=

Рис. 2. Правило построения простого начального действия

І. Если Ao — простое дей-

ствие. Тогда существует формула

A0 {pin і, pin 2, ..., pink )A{pout і, pout2, ..., poutl) Є ф.

Размеченным графом анализа будет граф, состоящий из двух вершин (рис. 2).

Если у действия нет входных/выходных параметров, то значение Lin/Lout не определено.

2. Если А0 — составное действие, то будет построен промежуточный граф (рис. 3).

Далее все составные действия «раскрываются» по одному из правил в соответствии с приоритетами операций и скобками. Построение выполняется рекурсивно «сверху-вниз». Пусть А — вершина, соответствующая составному заданию, а ,

, ..., — произвольные вершины гра-

фа (раскрытые или ещё не раскрытые), являющиеся контекстом. Приведём примеры раскрытия вершин, соответствующих

составному действию A = IF(a,B,C) и A = WHILE(a,B) (рис. 4).

ts

Рис. 3. Правило построения составного начального действия

Рис. 4. Правила раскрытия вершин, соответствующих составному действию IF и составному действию WHILE

У раскрываемых вершин может быть один, несколько или не быть вовсе исходящих потоков управления — /1, ..., /п и всегда один входящий поток управления — /0. Это утверждение может быть доказано с помощью анализа рекурсивных правил построения графа. Каждой вершине промежуточного графа соответствует некоторое название (на рис. 4 оно указано внутри фигуры, обозначающей вершину). Вершины-задания промежуточного графа обозначаются так, как указаны в формулах потока работ соответствующие простые или составные действия. Если у составного действия нет названия, используется его формула. Если простое действие является специальным системным действием, то в качестве названия используется соответствующее ключевое слово. Вершины выбора и слияния не требуют специальных обозначений для работы алгоритма, но для понимания преоб-

разований графа их названия указаны на рис. 4. После того как граф был построен с помощью рекурсивных правил, применяются правила обработки вершин, которые соответствуют системным действиям: CREATE, WAIT и DELETE. В общем случае удаляются вершины с названиями CREATE(a) и WAIT (a), где a — это название события. После чего соединяются потоками управления вершина, непосредственно обязательно предшествующая вершине с названием CREATE(a), и вершины, которым непосредственно обязательно предшествуют вершины с названием WAIT(a), при этом для новых дуг устанавливается пометка Lf = a. Другие случаи рассматриваются отдельно. Аналогично пункту 1 раскрываются вершины, соответствующие простым действиям. Для вершин с названием EMPTY устанавливается пометка — Lt = EMPTY, для вершин с названием COPY(pin,pout) уста-

навливаются пометки — Lt = COPY, Lin = pin, Lout = pout. Если у действия нет входных/выходных параметров, то значение Lin/Lout не определено.

Рассмотрим подмножество размеченных графов анализа, состоящее из графов, которые могут быть получены из некоторого слова, записанного на формальном языке описания потоков работ. Между словами формального языка описания потоков работ и этим подмножеством графов анализа существует взаимно однозначное соответствие с точностью до порядка следования системных действий, наличия системных действий, не влияющих на выполнение потока работ, и порядка асинхронного запуска действий. Это утверждение верно по построению. Теперь определим понятие состояния размеченного графа анализа.

Определение. Состояние размеченного графа анализа

LAG = (N, T, ts, C, M, F, Lt,

Lin,> Lout, Lch, Lcond, Lf)

— это sLag Е (F ^ IN0) — количество фишек на каждой дуге. Переход между состояниями происходит при активации некоторой вершины si ^ ns2, n Е N.

Определим начальное состояние размеченного графа анализа.

Определение. Начальным состоянием размеченного графа анализа

LAG = (N, T, ts, C, M, F, Lt,

Li

Lout, Lch,l Lcond, Lf)

называется состояние з0 такое, что для любого потока управления / Е Г:

- во(/) = 1, если Эи : / = %,и) — по одной фишке находится на исходящих дугах начального задания;

— з0(/) = 0 — в остальных случаях. Если не учитывать тупиковые, никогда не исполняющиеся циклы, которые выявляются в ходе предлагаемого метода исследования графа, может быть доказано, что построенные по формулам потоков работ графы представляют собой иерархию циклов и удобны для анализа. Это свойство гарантируется 4-6 ограничениями на множестве потоков работ.

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

Определение. Временной размеченный граф анализа — это кортеж

TLAG = (N, T, ts, C, M, F, Lt,

Lin, Lout, Lch,l Lcond, Lf, Time);

— размеченный граф анализа LAG = (N, T, ts, C, M, F, Lt,

Lin,! Lout, Lch,l Lcond, Lf);

— Time : yt Є T — IN0- функция времени, ставит в соответствие каждому заданию целое неотрицательное число;

— Time(t) = 0, если Lt(t) = EMPTY или Lt(t) = COPY;

— Time(ts) = 0.

Семантика временного размеченного графа анализа такова, что задание одновременно синхронизирует и разветвляет поток управления: ожидается появление фишек на всех входящих дугах, по одной фишке забирается с каждой дуги, далее некоторое время выполняется задание и после завершения задания добавляется фишка на каждую исходящую дугу. Будем говорить, что временной размеченный граф анализа TLAG соответствует размеченному графу анализа LAG. Введём понятие состояния временного размеченного графа анализа.

Определение. Состоянием временного размеченного графа анализа

TLAG = (N,T,ts ,C,M,F,Lt,

Lin,Lout,Lch,Lcond,Lf,Time)

называется пара stlag = (sAG,Tcur):

— saG Є (F — IN0) — количество фишек на каждой дуге;

— Tcur С T — множество текущих заданий (задания, выполняющиеся в данный момент времени).

Переход между состояниями происходит при активации вершины, не являющейся заданием — si — ns2, n Є M U C, вследствие начала выполнения некоторого задания — si — ts2, t Є T или же при завершении выполнения некоторого задания si —— ts2, t Є T.

Определение. Начальным состоянием временного размеченного графа анализа

ТЬАС = (N,T,ts ,С,И,Г,Ьг,

^/т 1 ^оиЬ ^ск ,Lcond,L f ,Т^'те')

называется пара з0 = (вла,Тсиг):

— У/ Е р : вАсЪ) = 0;

— Тсиг {ts}.

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

Введём функции на множестве состояний Бтьао временного размеченного графа анализа

тьас = ^,т,г3 ,С,ЫРМ,

1 ^оиЬ1Lch, Lcond, Lf ,Т^'те') .

Тгтвьедгп : в € Бтьао ^ ,Тгтеепл :

в Е Бтьао ^ — момент времени, ко-

гда временной размеченный граф анализа переходит в состояние в и момент времени, когда временной размеченный граф анализа переходит из состояния в в другое состояние соответственно. При этом выполняются условия:

— ТгтеЬедгп (в0) = 0, где в0 — начальное состояние;

— если есть переход из состояния в1 в состояние в2, то

Тгтее^(в1) — ТгтеЬедгп (в2);

— если переход из состояния в1 в некоторое состояние в2 не связан с завершением задания, то

ТгтеЬедгп (в1) — Тгтее^(в1');

— если переход в состояние в1 связан с началом выполнения задания Ь, а переход в состояние в2 связан с завершением выполнения этого задания, при этом состояние в2 выбирается таким образом, что граф переходит из состояния в1 в состояние в2 за наименьшее количество переходов, то Тгтеьедгп («2) = Тгтеьедгп («1) + Тгте(Ь).

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

потока работ выполняются за фиксированный промежуток времени независимо от значений входных переменных. Такая модель хорошо согласуется с сервисно-ориентированными архитектурами [14], где заданиям соответствуют вызовы сервисов, а сам поток работ представляет собой программу, их координирующую. Эта модель не подходит для формализации потока работ, где параллельно выполняющиеся действия используют один ресурс или выполняются одним ресурсом, в силу того, что суммарное время выполнения действий, не зависящих по данным, но разделяющих один ресурс, определяется как сумма времён выполнений этих действий.

Фундаментальная теорема зависимостей из теории оптимизирующих компиляторов говорит о том, что переупорядочивающее преобразование, сохраняющее зависимости по управлению и зависимости по данным в программе, не изменяет результат работы этой программы [15]. Определим понятия зависимости по управлению и зависимости по данным для потоков работ. Во время выполнения экземпляр потока работ представляет собой набор параллельно исполняющихся ветвей, между которыми может происходить синхронизация, при этом граф анализа может иметь достаточно сложную структуру. Исходя из этого, определение зависимости по управлению, основанное на отношении доминирования, не подходит. Все вершины выбора графа анализа нумеруются — Num : Уп Е C ^ IN. В размеченном графе анализа, построенном по формулам некоторого потока работ, можно для каждой вершины указать не более одной вершины выбора, соответствующей условию цикла, обязательно предшествующей рассматриваемой вершине и не предшествующей другим вершинам выбора, удовлетворяющим указанному условию. При этом путь от вершины выбора до заданной вершины начинается с дуги с пометкой Lcond = true и не содержит повторно указанную вершину выбора. Назовём такую вершину ближайшей вершиной условия цикла для заданной вершины. Если вершина находится в теле цикла, поставим ей в соответствие пометку Loop : Уп Е N ^ IN0, которая будет указывать номер ближайшей вершины условия цикла для заданной вершины. Если вершина n не принадлежит ни одно-

му телу цикла, то Loop(n) = 0. Предложен алгоритм, который позволяет поставить в соответствие каждой вершине графа условие её выполнения — логическое выражение C : Уп Е N ^ b Е Bool Expression, где BoolExpression — множество логических выражений на множестве номеров вершин выбора. Этот алгоритм имеет сходство с условной конверсией, изложенной в теории оптимизирующих компиляторов [15]. Его уникальность в том, что он работает с графами, родственными сетям потоков ра-

бот и сетям Петри, а не с последовательностью операторов. Фактически условие выбора вершины определяет, будет ли активирована эта вершина в текущей итерации цикла или же в текущем экземпляре потока работ, если она располагается вне циклов. Приведём пример размеченного графа анализа, где каждой вершине ставится в соответствие номер ближайшей вершины условия цикла и условие выполнения (рис. 5). На рис. 5 не указаны пометки Loop = 0 и C = true.

Рис. 5

Определим понятие взаимоисключающих вершин.

Определение. Пусть дан размеченный граф анализа О. Вершины размеченного графа анализа т и и называются вза-

имоисключающими, если выполнены условия:

— Ьоор(и) = Ьоор(т) — вершины имеют одинаковую ближайшую вершину условия цикла или не принадлежат ни одному телу цикла;

— C(n) * C(m) = false.

Зависимости по данным определяются так, как это принято в теории оптимизирующих компиляторов [15].

Определение. Две вершины размеченного графа анализа G — v и w зависят по данным, если выполняются условия.

1. Существует такая переменная, что её название указывается в списке входных или выходных параметров вершин (Lin или Lout), при этом хотя бы у одной вершины имя этой переменной указано в выходных параметрах (Lout).

2. Существует путь из одной вершины в другую.

Введём понятие строго детерминированного временного размеченного графа анализа.

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

Определение. Временной размеченный граф анализа G называют строго детерминированным, если он соответствует строго детерминированному размеченному графу анализа.

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

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

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

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

Опишем оптимизирующие преобразования. Дан строго детерминированный размеченный граф анализа G. Преобразуем его в размеченный граф G'. Рассмотрим иерархию вложенных циклов и для каждого цикла или всего графа применим правила преобразования. Каждый вложенный цикл сворачиваем — преобразуем по правилу, обратному правилу построения (рис. 4б). Это может быть сделано, так как тело цикла не связано дугами с внешними по отношению к циклу вершинами. Для полученной вершины сформируем списки входных и выходных параметров и соответствующие зависимости по данным, построенные по зависимостям вершин цикла с внешними по отношению к циклу вершинами. То есть если между вершиной, принадлежащей циклу, и внешней по отношению к циклу вершиной существует зависимость по данным, то она становится зависимостью между полученной взамен цикла вершиной и внешней по отношению к циклу вершиной. Преобразование выполняется для каждой пары вершин v, w графа G, не являющихся вершинами с пометками Lt = EMPTY и независящих по данным. При этом выполняется одно из условий:

— существует дуга (v w) ;

— существуют дуги (v , u) и (u , w), где u — вершина слияния;

— или существует путь из вершины v в вершину w, при этом вершины на пути являются либо вершинами слияния, либо вершинами заданиями с пометкой Lt = EMPTY.

В этих случаях будем говорить, что вершина w следует за вершиной v. Преобразования будут выполняться последовательно для каждого пути из v в w одного из указанных трёх типов. Вершина v является заданием, а вершина w — заданием или вершиной выбора. Для того чтобы не распараллеливать действия копирования, которые выполняются мгновенно, введём дополнительное ограничение для вершин v и w. Если Lt(v) = COPY, то найдется вершина v' такая, что v следует за вер-

шиной v , при этом нет зависимости по данным между вершинами v' и w. Если Lt(w) = COPY, то найдется вершина w' такая, что w' следует за вершиной w, при этом нет зависимости по данным между v

и Ш .

Для краткости рассмотрим случай, когда V и ш — задания, между ними существует дуга с пометкой Ьf, зависимости по данным будем изображать пунктирными стрелками (рис. 6).

Рис. 6

В ходе преобразования размеченного графа анализа выполняется набор действий.

1. Удаляется дуга (v , w).

2. Если часть зависимостей по данным от некоторых вершин пропала, эти вершины соединяются исходящим потоком управления с вершиной w. В приведённом примере это вершины — x и у, z не является такой вершиной, так как существует путь из вершины z в вершину w. Если среди этих вершин есть взаимоисключающие, они соединяются с вершиной w с помощью вершины слияния.

3. Из построенных дуг остаются только те, которые гарантируют сохранение зависимостей по данным для всех рассматриваемых вершин. Таким образом, в примере удаляется дуга (x , w), так как существует путь из вершины x в вершину у.

4. Достраивается граф так, что условие выполнения вершины w будет сохранено. Для этого вычисляется текущее условие выполнения вершины w, и строятся дополнительные вершины слияния и вершины с пометкой Lt = EMPTY, они соединяются между собой и входящими потоками управления с вершинами выбора. Количество избыточных вершин может быть со-

кращено, если использовать уже существующие вершины слияния и вершины с пометкой Lt = EMPTY, при условии, что они удовлетворяют необходимым требованиям. Будем считать, что все новые дуги графа, построенные в ходе преобразования, если не оговорено другого, имеют пометки Lf. Причём значения пометок являются уникальными идентификаторами (они не используются нигде более в графе), за исключением входных дуг одних и тех же вершин слияния, а также дуг, исходящих из одного и того же задания.

5. Вершина w соединяется с вершиной выбора, соответствующей ближайшему циклу дугой с пометками Lcond = true и Lf = & или с начальным заданием ts, если нет ближайшего цикла, дугой с пометкой Lf = &. Если вершина w не была соединена дугой с указанной вершиной.

6. Вершина v и вершины, обязательно предшествующие v — s1, ..., si, соединяются исходящим потоком управления с другими вершинами. Этот пункт выполняется аналогично пунктам 2-4 так, чтобы зависимости по данным и условия выполнения вершин были сохранены.

Рис. 7

Отметим, что случай, когда существует дуга между заданиями v и w без пометки Lf, оговаривается отдельно для того, чтобы можно было корректно восстановить формулы преобразованного потока работ. В этом случае строится дополнительное задание с пометкой Lt = EMPTY, дуга

дугами (е/). Вершина ш соединяется исходящей дугой с вершиной е (рис. 7).

Далее выполняются преобразования 2-5, но уже не для пары вершин V и ш, а для вершин V и е.

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

Покажем, как поток работ может быть оптимизирован по времени выполнения с помощью предлагаемых преобразований. Рассмотрим строго детерминированный временной размеченный граф анализа О и его вершину ш: ш — задание или вершина выбора, пусть в графе О существуют задания — V!, ..., Vk, за которыми следует эта вершина. Очевидно, время начала выполнения задания ш или время активации вершины выбора ш определяется как максимум времён завершения заданий v1, ..., Vk. Если среди этих заданий есть вершина VI такая, что нет зависимости по данным между VI и ш, то удаляется избыточная зависимость по управлению между V и ш, и могут быть добавлены новые зависимости по управлению между ш и вершинами графа и1, ..., щ. Вершины щ, ..., и обязательно предшествуют вершине VI. После преобразований время начала выполнения задания ш или время активации вершины выбора ш будет определено как максимум времён завершения заданий v1, ...,

Vi-11Vi+1, ..., Vk,и1, ..., щ. Если максимум времён завершения заданий v1, ..., Vk равен времени завершения выполнения задания vi, то время начала выполнения задания ш или время активации вершины выбора ш будет уменьшено как минимум на время выполнения задания vi, иначе оно останется неизменённым. Необходимо учитывать, что в действительности задание VI часто является единственным заданием, за кото-

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

В настоящее время особое внимание уделяется автоматизации обработки изображений [16]. Продемонстрируем работу алгоритма оптимизации на примере потока работ, автоматизирующего процесс повышения качества изображения.

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

На рис. 9 изображен временной размеченный граф анализа, соответствующий преобразованному размеченному графу анализа. Пометки Time согласуются с пометками графа, представленного на рис. 8. Чтобы не перегружать рис. 9, на нём не указаны зависимости по данным и пометки Lin/Lout. Для вершин указаны условия выполнения, которые нарушаются и восстанавливаются в ходе оптимизации. Благодаря оптимизирующим преобразованиям такие действия, как отбеливание зубов и локализация красных зрачков, могут быть выполнены параллельно. Кроме того, поиск лица на фотографии может быть выполнен независимо от общего процесса улучшения качества изображения в том случае, если необходимо одновременно улучшить качество изображения и повысить качество фотопортрета. В приведённом примере (рис. 9) одна единица вре-

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

выполнения потока работ, оптимизирую- работ.

щие преобразования позволяют ощутимо

Рис. 8

Рис. 9

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

В дальнейшие планы работы входит расширение формального языка описания потоков работ, реализация таких оптимизирующих преобразований [17], как исключение повторных вычислений, исключение из тела цикла инвариантных вычислений, разукрупнение логических выражений, предсказывание ветвей, оптимизация языка BPEL, для этого будут установлены соответствия между конструкциями формального языка описания потоков работ и BPEL. Планируется реализовать подсистему автоматической оптимизации потоков работ для средства интерпретации потоков работ [18].

Литература

1. Нестеренко А.К. Формализация потоков работ и её применение. — Диссертация на соискание степени кандидата технических наук: 05.13.18 / А.К. Нестеренко. — М., 2007. — 100 с.

2. Web Services Business Process Execution Language Version 2.0 / ed. by Alves A., Arkin A., Askary S. — 2007. — ht tp://docs.oasis-open.org/wsbpel/2.0/0S/ws bpel-v2.0-0S.html.

3. Business Process Modeling Language / ed. by Arkin A. — 2002. — http://xml.cov erpages.org/BPML--2002.pdf.

4. Process Definition Interface. — XML Process Definition Language 0.03 / ed. by Marin M., Norin R., Shapiro R. — 2001. — http://xml.coverpages.org/XPDL20010522. pdf.

5. Florescu D., Grunhagen A., Kossmann D. XL: a platform for Web Services // Conference on Innovative Data Systems Research. — 2003. — www.dbis.eth z.ch/research/publications/47.pdf.

6. Olkhovich L. Semi-Automatic Business

Process Performance Optimization Based On Redundant Control Flow Detection

// International Conference on Internet and Web Applications and Services /

Advanced International Conference on

Telecommunications. — 2006. — P. 146.

7. Netjes M., Reijers H.A., Aalst W.M.P. On the Formal Generation of Process Redesigns // 1st International Workshop on Model-Driven Engineering For Business Process Management. — 2008. — P. 49-60.

8. Cao H, Jin H., Wu S., Tao Y.

PGWFT: A Petri Net Based Grid Workflow Verification and Optimization Toolkit // Lecture Notes In Computer Science. — Berlin / Heidelberg: Springer, 2003. — V. 5036. — P. 48-58.

9. Aalst W.M.P. PGWFT: Workflow Verification: Finding Control-Flow Errors Using Petri-Net-Based Techniques / /

Lecture Notes In Computer Science. London: Springer-Verlag, 2000. — V. 1806. — P. 161-183.

10. Aalst W.M.P., Hirnschall A., Verbeek H.M.W. An Alternative Way to Analyze Workflow Graphs // Lecture Notes In Computer Science. — Berlin-Heidelberg: Springer, 2002. — V. 2348. — P. 535-552. .

11. Aho A.V., Sethi R., Ullman J.D.

Compilers: principles, techniques, and

tools. — Boston: Addison-Wesley Longman Publishing Co., 1986.

12. Касьянов В.Н., Евстигнеев В.А. Графы в программировании: обработка, визуализация и применение. — СПб: БХВ-Петербург, 2003.

13. Касьянов В.Н. Оптимизирующие преобразования программ. — М.: Наука, 1988.

14. Koskimies M. Composing Services in SOA: Workflow Design, Usage and Patterns // Research seminar on Service-Oriented Software Engineering. — 2006. — http://ww w.cs.helsinki.fi/u/thruokol/opetus/2006/sos e/papers/koskimies_workflows.pdf.

15. Kennedy K., Allen J.R. Optimizing

compilers for modern architectures: a

dependence-based approach. — San Francisco: Morgan Kaufmann Publishers Inc., 2001.

16. Hastings S. Kurc T., Langella S. — Image processing for the grid: a toolkit for building grid-enabled image processing. — 2003. — http://bmi.osu.edu/resources/techr eports/OSUBMI_TR_2003_n03.pdf.

17. Саркисян А.А. Машинонезависимая оптимизация исходных программ. — М.: Радио и связь, 1985.

18. Нестеренко А.К. Служба управления потоками работ на базе стандартов WfMC // Интегрированная система информационных ресурсов: архитектура, реализация, приложения: Сборник трудов. — М.: ВЦ РАН, 2004. — С. 96-112.

Поступила в редакцию 13.03.2009.