3.1. Блок (линейный участок)
Вопросы оптимизации обычно связаны с топологией программы, т.е. со способом ее построения. Для того, чтобы локализовать процессы оптимизации и не связывать их с конкретным входным языком, они проводятся внутри отдельных участков программы, называемых блоками и сильно связанными областями.
Блок (линейный участок) - выполняемая по порядку последовательность операторов, имеющая единственную точку входа - первый оператор с меткой, на который может быть передано управление, и единственную точку выхода - последний оператор.
Блок моделирует часть программы на промежуточном языке, которая содержит операторы присваивания.
Формально модель линейного участка может быть представлена следующим образом:
блок B - это тройка вида (P,I,U),где
(1) P - список операторов S1,S2,...Sn (n>=0),
(2) I - множество входных переменных,
(3) U - множество выходных переменных.
При этом оператором называется цепочка (в общем случае) вида
A <--QB1...Br,
где A,B1,...,Br - переменные,Q - операция.
Здесь оператор присваивает значение переменной А и ссылается на B1,...,Br.
Если оператор Sj ссылается на А, то либо А--входная переменная, либо осуществлено присваивание ей значения некоторым оператором до Sj, (т. е. некоторым оператором Si,(i<j) . Таким образом, внутри ,блока все переменные, на которые ссылаются, к этому моменту определены либо внутренним образом как переменные, которым присвоены значения, либо внешним как входные переменные. Аналогично каждая выходная переменная либо является входной переменной, либо ей присвоено значение некоторым оператором.
Оператор S в программе называется входом в линейный участок, если он либо первый оператор в программе, либо помечен идентификатором, появляющимся в операторе перехода, либо непосредственно следует за условным оператором.
Линейный участок, относящийся к входу в участок S, состоит из S и всех операторов, следующих за ним вплоть до оператора останова, включая его, или вплоть до входа в следующий блок.
3.2. Сильно связанная область
Для каждого блока B=(P,I,U) можно найти ориентированный ациклический граф , представляющий этот блок. При этом каждый лист графа (концевая вершина) соответствует одной входной переменной в I, а каждая его внутренняя вершина - оператору из
P. Граф отражает порядок выполнения операторов программы и дает более наглядное представление, чем линейная последовательность операторов.
Если вершины i и j графа соответствуют участкам i и j программы, то дуга идет из i в j, если
1) последний оператор участка i не является ни оператором перехода, ни оператором останова, а участок j следует в программе за участком i или
2) последний оператор участка i является оператором перехода на метку L, которой помечен первый оператор участка j.
Сильно связанной областью направленного графа называется такое множество его вершин, что для любых двух вершин x и y (x != y) существует путь из x в y.
Будем рассматривать сильно связанные области Ri, обладающие следующими свойствами:
1) Ri является сильносвязанной областью, состоящей из множества блоков, каждый из которых предшествует сам себе и следует сам за собой внутри этого множества;
2) Ri != Rj;
3) для каждого i<j или пересечение Ri и Rj пусто, или Ri является подобластью Rj (включена в нее).
4. Способы оптимизации
Различают две категории оптимизирующих преобразований: преобразования исходной программы в ее внутренней форме, которые не зависят от объектного языка (машинно-независимые) и преобразования, осуществляемые на уровне объектной программы (машинно-ориентированные).
Методы первой категории применимы почти к любому алгебраическому языку - ФОРТРАНу, АЛГОЛу, PL/1 и.т.д.
На практике используется весьма широкий набор машинно-независимых оптимизирующих преобразований, что связано с большим разнообразием неоптимальностей. К ним относятся:
- разгрузка участков повторяемости;
- упрощение действий;
- реализация действий;
- чистка программы;
- экономия памяти;
- сокращение программы.
4.1. Разгрузка участков повторяемости
Такое название получил способ оптимизации, состоящий в вынесении вычислений из многократно проводимых (исполняемых ) участков программы на участки программы , редко проходимые.
К этому виду преобразований относятся различные чистки зон, тел циклов и тел рекурсивных процедур, когда инвариантные (по результату выполнения) в соответствующих участках повторяемости выражения, линейные компоненты (т. е. гамаки, обязательно исполняемые при каждом прохождении участка повторяемости) выносятся из него и размещаются перед входом в участок повторяемости - чистка вверх,- или когда уничтожающие свои предыдущие результаты линейные компоненты или группы линейных компонент участка повторяемости выносятся из него и размещаются за выходы из участка повторяемости - чистка вниз.
При чистке вверх вынесенные вычисления образуют новый непосредственный обязательный предшественник участка повторяемости, а при чистке вниз - непосредственный обязательный преемник участка повторяемости.
Обычно выносятся только такие выражения и линейные фрагменты программы, которые обязательно исполняются при каждом прохождении разгружаемого участка повторяемости.
Примеры.
а) Чистка вниз преобразует цикл
для K:=1, K+1 пока K<=100
цикл
начало
X:=X*K;
если Z>0 то Y:=sin(X);
иначе A[I]:=X+2;
конец
к виду
для K:=1, K+1 пока K<=100
цикл X:=X*K;
если Z>0 то Y:=sin(X);
иначе A[I]:=X+2;
б) Чистка вверх преобразует цикл
для K:=1, K+1 пока K<=100
цикл
начало
если Z>0 то Y:=1;
иначе Y:=Z+2;
X[K]:=X[K] - Y; конец
к виду
если Z>0 то Y:=1;
иначе Y:=Z+2;
для K:=1, K+1 пока K<=100
цикл X[K]:=X[K] - Y;
Примером чистки тела рекурсивной функции может быть следующий:
тело рекурсивной функции
цел функция Ф(N)
начало
целые Z,W;
W:=1;
если X>0 то W:=Y;
если N<=0 то Ф:=1
иначе
начало
Z:=N-W; Ф:=Z*Ф(Z) конец
конец
содержит два инвариантных гамака, в результате вынесения которых может быть получена следующая функция:
цел функция Ф(N)
начало
целое N;
цел функция F(M)
начало
целое Z;
если M<=0 то F:=1;
иначе
начало
Z:=M-W; F:=Z*F(Z) конец
конец
W:=1;
если X>0 то W:=Y;
Ф:=F(N); конец;
В группу разгрузок участков повторяемости также входят и различные преобразования, которые осуществляют перемещение гамака по пути, ведущему к месту использования его результатов. При таком преобразовании в отличие от чисток гамак остается в тех же зонах, циклах и процедурах.
Например, с помощью этих преобразований фрагмент
для K:=1, K+1 пока K<=100
цикл
начало
N:=A[K];
если N>0 то переход на L; N:=N*N;
L: если Z=0 то ВЫВОД(N); конец
N:=100;
может быть преобразован к виду:
для K:=1, K+1 пока K<=100
цикл
если Z=0 то
начало
N:=A[K];
если N>0 то переход на L; N:=N*N;
L: ВЫВОД(N); конец;
N:=100;
... ; i=1,3. Q – количество сырья Для автоматизированной обработки данных и вычислений используется пакет программ линейной оптимизации программного продукта Microsoft Excel. Решение Определяем оптимальные производственные мощности филиалов для производства определенного количества продукции различных видов с помощью транспортной задачи. Постановка транспортной задачи. Требуется определить ...
... практичных алгоритмов оптимизированного перебора, позволяющих за разумное время осуществлять распараллеливание достаточно больших участков. Анализ работ, посвященных оптимизации кода для процессоров с параллелизмом на уровне команд показывает, что для достижения наилучших результатов необходимо применение комплекса оптимизаций, среди которых можно выделить следующие классы. Преобразования циклов ...
... заданных операндов. 3) Использование косвенной адресации, когда операнд хранит адрес операнда. 4) Ограничение использования стека. программа оптимизация ассемблер код 4. Машинно-независимая оптимизация кода ассемблера Машинно-независимая оптимизация предполагает: 1. Одним из важнейших источников оптимизации кода является удаление общих подвыражений, т.е. подвыражений, которые ...
... лишь контекстным анализом. Как было отмечено в [12], применение глубокого статического анализа программ может позволить существенно снизить количество ложных срабатываний и повысить точность обнаружения уязвимостей защиты. 4.3. Использование методов анализа потоков данных для решения задачи обнаружения уязвимостей В отделе компиляторных технологий по контракту с фирмой Nortel Networks ...
0 комментариев