Выпускная квалификационная работа Оптимизация управляющего графа программ, имеющих избыточные условные вычисления Выполнил: Степнов Денис, 816 гр. Научный руководитель: Бучнев А.Ю. Общие понятия • Нумерация значений – разбиение множества операций промежуточного представления на классы конгруэнтности (эквивалентности); • Класс конгруэнтности – подмножество операций, безусловно имеющих одинаковый результат; • Гиперблок – непрерывная последовательность инструкций, имеющая одну точку входа; • CTP – операция подготовки передачи управления; • Станок – регистр, необходимый для выполнения операции CTP. Проблематика • Наличие в программах избыточных условных вычислений, вырабатывающих предикат, который используется для постановки операций под условие; • Наличие безусловно исполняемых и ненужных операций передачи управления; • Потери в производительности, которые могут быть вызваны ограниченным числом станков для подготовок и давлением на кэш инструкций. Постановка задачи • Реализовать отдельную оптимизацию, устраняющую избыточные вычисления предикатов • Внедрить оптимизацию в оптимизирующий компилятор «Эльбрус» • Определить место в линейке оптимизаций • Провести верификацию на стандартных пакетах тестов • Поддержка оптимизации • Провести оценку эффективности на пакете SPEC Подход к решению задачи 1. Поиск избыточных условных вычислений • Используя результаты анализа «Нумерация значений», выявить избыточные условные вычисления; 2. Применение оптимизации • Дублировать If-узел с избыточным условием по всем входящим в него дугам, по которым оно однозначно определяется, и перенаправить на копии исходящие дуги; • Удалить невыполнимые исходящие дуги из полученных копий If-узла и быть может оригинала (если у него осталась одна входящая дуга по которой условие однозначно определяется), преобразовать Ifузлы в Simple-узлы. Простейший пример Если в узлах 2, 3, 4 нет операций, изменяющих переменные a или b, то вычисление предиката в узле 4 является избыточным нужно создать копию узла 4 (узел 7) и упростить узлы 4 и 7 1. Поиск избыточных условных вычислений • Алгоритм Осуществить обход по всем возможным парам If-узлов рассматриваемой процедуры Нет Один из узлов доминирует над другим Да Осуществить обход по всем исходящим дугам доминатора и входящим дугам доминируемого узла Нет Преемник исходящей дуги доминирует над предшественником входящей дуги & класс конгруэнтности операций, вырабатывающих предикат, совпадает Да Занести доминируемый узел, входящую дугу, значение предиката в специальный список 1. Поиск избыточных условных вычислений • Пример В данном примере существует единственная подходящая для рассмотрения пара If-узлов: If-узел 1 доминирует If-узел 4. Осуществив обход по дугам, можно выявить две входящие в узел 4 дуги, в предшественниках которых значение предиката точно известно. Однако оптимизацию возможно применить только по одной из входящих в узел 4 дуг, так как переменная «a» переопределяется в узле 2. 2. Применение оптимизации • Алгоритм Осуществить обход списка, полученного анализирующим алгоритмом Нет В узел входит более одной дуги Удалить лишнюю исходящую дугу и вычисление предиката Да Дублировать узел со всеми исходящими дугами Перенаправить на копию дугу, содержащуюся в списке Удалить у копии лишнюю исходящую дугу и вычисление предиката 2. Применение оптимизации • Пример Создаём узел 7 — копию узла 4. При копировании узла CFGграфа средствами компилятора «Эльбрус» (функция graph_GetNodeCopy), автоматически копируются исходящие из него дуги. Входящие дуги не копируются. 2. Применение оптимизации • Пример Перенаправляем входящую дугу, по которой значение предиката точно известно, на скопированный узел. 2. Применение оптимизации • Пример Удаляем дугу, исходящую из узла 7, соответствующую отрицательному значению предиката. Удаляем вычисление предиката и преобразовываем узел 7 из Ifузла в Simple-узел. Оценка эффективности 3.00% 2.72% 2.50% 2.00% 1.92% 1.50% 1.17% 1.00% 0.50% 0.37% 0.22% 0.14% 0.00% 176.gcc 181.mcf 186.crafty 253.perlbmk 255.vortex 301.apsi Ускорение, полученное на пакете тестов spec2000, в среднем составило 0,5% Результаты исследования • Оптимизация реализована и внедрена в линейку оптимизирующего компилятора «Эльбрус»: • Применение на 3-м уровне оптимизации • Применение перед объединением базовых блоков в гипер-узлы (оптимизация if_conversion) • Проведена верификация на пакетах дневного тестирования при вливе в основную ветку компилятора, а так же на генераторе тестов • Проведена оценка эффективности на пакете тестов spec2000