Московский физико-технический институт Поиск максимальной длины рекуррентности в графе зависимостей Научный руководитель: Гимпельсон В.Д. Работу выполнила Филиппова В.Н. Описание проблемы Конвейеризация цикла является очень важной оптимизацией. Перед конвейеризацией строится граф зависимостей, в котором вершинами являются операции, а дугами – зависимости между операциями, учитываются зависимости как на одной, так и на разных итерациях цикла. Рекуррентностью называется цикл в графе зависимостей, т.е. цепочка вычислений, в которой каждая операция зависит от предыдущей. Одна итерация цикла не может быть выполнена быстрее, чем длина рекуррентности этого цикла. Для эффективного проведения конвейеризации необходимо знать, за какое минимальное количество тактов возможно исполнить одну итерацию цикла. Формализация проблемы Для цикла C длина рекуррентности определяется по формуле: 4;0 3;1 5;2 2;1 3;0 2;1 , где – длина задержки между операциями - количество итераций, через которое реализуется зависимость 2;0 4;1 На рисунке показан граф, в котором выделенный цикл имеет длину рекуррентности, равную (5+3+2+4)/(2+1+0+1)=3,5. Следовательно данный цикл не может быть выполнен быстрее 4 тактов. Ранее используемый алгоритм Находятся дуги, идущие снизу вверх по «линейке» операций. Для каждой такой дуги выполняется обход сверху вниз по «линейке» операций от операции-последователя до операции предшественника, для всех промежуточных операций вычисляется максимальная задержка от начала цикла (время раннего). Время раннего последней операции плюс длина зависимости по обратной дуге и будет длиной рекуррентности. После нахождения всех обратных дуг выполняется максимизация длин рекуррентности. Пример неправильной работы старого алгоритма 6/0 2/0 2/1 10/1 4/0 Длина На самом рекуррентности, деле есть более найденная длинныйэтим цикл, алгоритмом его длина в рекуррентности данном случае будет равнаравна 11. 4. Постановка задачи Реализовать корректный алгоритмподсчета длины рекуррентности. Исследовать его эффективность по качеству результирущего кода и скорости работы. Был выбран алгоритм из книги Combinatorial Optimization: Network and Matroids. Eugene L.Lawler. Сложность алгоритма Математическое обоснование нового алгоритма Пусть Таким образом для любого цикла выполняется неравентство: Выберем некоторое λ', и сделаем замену для всех весов графа: Теперь если в графе с модифицированными весами есть отрицательный цикл, то λ' < λ, а если нет, то λ' ≥ λ. По этому критерию мы можем последовательно приближать λ‘ к точному значению максимальной длины рекуррентности. Описание нового алгоритма Максимальная длина рекуррентности заключена на отрезке от 1 такта (быстрее одну итерацию цикла выполнить невозможно) до времени раннего последней операции в «линейке» плюс максимальная задержка. Зная критерий, по которому можно определить больше или меньше максимальная длина рекуррентности заданного значения, методом деления пополам приближаем её к точному значению. Реализация нового алгоритма Маркировка операций и зависимостей, чтобы в дальнейшем рассматривать только те операции из «линейки» операций, из которых достижима последняя операция. Нумерация операций. Занесение в матрицу смежностей операций и зависимостей между ними. Если между операциями несколько дуг и нельзя определенно сказать, какая из них даст большую длину рекуррентности, то одну из них заносим в список, чтобы потом продублировать операцию-последователя. Дублирование операций-последователей обратных дуг, инцидентных одним и тем же вершинам. Вычисление , и нахождение максимальной длины рекуррентности методом деления отрезка пополам. Дублирование операций Для построения матрицы смежности необходимо, чтобы между вершинами была только одна дуга, но в графе зависимостей встречаются кратные дуги. Иногда от некоторых дуг можно избавиться, просто выбрав дугу, дающую большую рекуррентность для всего цикла. Если задержка одной дуги больше, а количество итераций, через которое реализуется зависимость меньше, чем у второй, то первая дуга однозначно даст большую длину рекуррентности. В противном случае надо продублировать вершины, чтобы в результирующем графе были реализованы обе зависимости. На рисунке изображены две дуги, идущие от source к node и граф, который получается после дублирования вершин. prev 1 source prev n node succ 1 succ 2 prev 1 source node succ n succ 1 prev n node_copy succ 2 succ n Точность вычислений В описанном алгоритме было предложено продолжать вычисления до тех пор, пока Эта точность следовала из такой оценки минимальной разности длин рекуррентности: ,где - сумма итераций, через которое реализуются зависимости, по всему графу Но нам интересно только целое значение максимальной длины рекуррентности, поэтому эту оценку можно улучшить: Это следует из того, что точное значение максимальной длины рекуррентности отличается от ближайшего целого числа, больше, чем на Реализованные оптимизации Поиск отрицательного цикла имеет сложность . Можно сократить количество вершин, если заранее найти максимальные расстояния между всеми операциями, являющимися началом или концом обратных дуг. Проход вниз по линейке операций позволяет вычислить эти расстояния за время для каждой такой операции. На горячих регионах пакета тестов spec95 таким образом можно избавиться в среднем от 19% вершин. Преобразование графа Реализванные оптимизации После преобразования графа элементарный цикл в нем может иметь не больше Ω дуг, Ω = max (L(С)) = 2*min{ Nbeg , Nend } L(C) – количество дуг в цикле С, Nbeg - количество операций, являющихся началом обратных дуг, Nend - количество операций, являющихся концом обратных дуг). При поиске отрицательного цикла первоначально искался путь длиной n, теперь можно искать путь длиной Ω . Так как часто встречаются ситуации, когда от одной операции идет вверх большое количество обратных дуг, такая оптимизация дает возможность уменьшить количество итераций при поиске отрицательного цикла. На горячих регионах пакета тестов spec95 в среднем количество итераций уменьшилось на 24% Результаты Число регионов, в Общее Тестовые которых старый число пакеты алгоритм давал регионов неверный результат Коэффициент улучшения времени Среднее работы значение оптимизированного коэффициента кода на таких регионах bogo95 272 6 (2,20%) 1,000 — 1,007 1,001 bogo2000 532 19 (3,57%) 1,000 — 1,034 1,002 bogow2k 1609 23 (1,42%) 1,000 — 1,021 1,001 Максимальная длина рекуррентности может оказаться меньше ресурсной оценки цикла, тогда именно ей будет определяться минимальное время выполнения цикла. Результаты Изменение скорости работы: В среднем новый алгоритм работает в 100 раз медленнее старого, неоптимизированный алгоритм работает в 600 раз медленнее. Выводы Реализован корректный алгоритм подсчета максимальной длины рекуррентности. Реализованы оптимизации к этому алгоритму, благодаря которым скорость работы возросла в 211 раз. Проведен анализ качества результирующего кода и количества циклов, в которых старый алгоритм дает неверный результат. Из-за низкой скорости работы этот алгоритм может применяться только в статических компилляторах.