Программный разрыв зависимостей между операциями обращения в память в двоичном оптимизирующем компиляторе Магистерская диссертация студента 212 группы ФРТК Волкова Павла Москва 2008 Постановка задачи Развитие оптимизации по разрыву зависимостей между операциями обращения в память с целью учета внутренней структуры циклов и избавления от построения избыточных проверок Суть проблемы Статически нераспознаваемые зависимости между операциями обращения в память ограничивают возможности компилятора в применении оптимизаций над кодом mov G1 -> V1 mov G2 -> V2 mov G1 -> V1 mov G2 -> V2 … store V1 1 load V2 -> V4 add V4 1 -> V4 load V2 -> V4 … store V1 1 add V4 1 -> V4 Динамическое развязывание адресов памяти mov G1 -> V1 mov G2 -> V2 … store V1 1 load V2 -> V4 add V4 1 -> V4 mov G1 -> V1 mov G2 -> V2 If V1 != V2 y load V2 -> V4 … store V1 1 add V4 1 -> V4 n … store V1 1 load V2 -> V4 add V4 1 -> V4 Ранее реализованный алгоритм динамического развязывания адресов памяти 1. Поиск самых вложенных циклов 2. Для каждого из них: Распознавание адресов операций обращения в память и законы их изменения (только индуктивные с постоянным шагом и инвариантные адреса) Объединение в диапазоны одноименных операций работы с памятью со смежными адресами Построение развязывающих выражений Недостатки алгоритма Неоптимальная частота перехода на цикл с развязанными операциями из-за построения “грубых” динамических проверок Анализ причин: 1. Не учитывается внутренняя структура цикла при построении развязывающих выражений 2. Избыточное развязывание Отображение виртуального адресного пространства на физическую память 4096 … Виртуальные адреса MMU Физическая память Построение проверок в прежнем алгоритме LDw a1 STw a2 a1 += 4 a2 += 4 0 4096 dist = N*шаг индукции= 2*4 = 8 с1 = a1 + 3/2 c2 = a2 + 3/2 c_dist = f(c1,c2) = min( c1-c2, c2-c1) mod 4096 c_dist >= dist + 4/2 + 4/2 = 12 f(a1,a2) = f(c1,c2) = c_dist >= 12 d = (a1-a2) mod 4096 d = [12, 4084] a1 с1 0 -12 4096 4084 a1+3 с2 a2+3 a2 dist d 12 Предложенный алгоритм построения проверок Для каждой пары диапазонов [a1, a1+s1] и [a2, a2+s2]: Для всех пар операций load(a1+d1) и store(a2+d2): Построение уравнения развязывания операций на N итераций: если операция чтения выше записи, то [a1 + d1, a1 + d1 + ld_size -1] ∩ [a2 + d2 - N*h, a2 + d2 – h + st_size -1] = 0 в противном случае: [a1 + d1, a1 + d1 + ld_size -1] ∩ [a2 + d2 - N*h, a2 + d2 + st_size -1] = 0 Замена переменных: d = (a1-a2) mod 4096 Определение решения для d Пересечение получившихся решений Построение развязывающих выражений Пример построения развязывающих выражений в предложенном алгоритме LDw a1 STw a2 a1 += 4 a2 += 4 [a1, a1+3] ∩ [a2-8, a2-1] mod 4096=0 d = (a1 – a2) mod 4096 [d, d+3] ∩ [-8, -1] = 0 d <= 4084 0 0 -12 4096 4084 d -12 4096 d 12 Относительное изменение времени исполнения тестов при использовании старого и нового алгоритма ( (Tстар / Tнов – 1) * 100 % ) 3 2 Spec95 % 1 0 -1 e5 av w p pp fp si ap d 3 rb tu u pl ap id gr m 2d o dr hy r o 2c su im sw tv ca m to x rte vo rl pe eg ijp s li res p m co c gc im ks 88 m go 6 5 4 3 2 % 1 0 -1 -2 -3 Spec2000 d a3 si ap fm c re ce fa el id gr lg ga m e is w up w Относительное изменение времени исполнения тестов при использовании старого и нового алгоритма (комментарии) На задачах su2cor, wupwise и fma3d наблюдаются ухудшения из-за невозможности применения ряда используемых оптимизаций совместно с новым алгоритмом. Результаты работы Реализован новый алгоритм динамического развязывания операций обращения в память. Его отличия: построение условий, увеличивающих частоту переходов на оптимизированный цикл уменьшение числа операций, необходимых для построения развязывающих выражений Сокращение времени исполнения ряда тестов Spec95/2000 Необходимость разрешения конфликтов с другими оптимизациями для введения предложенного алгоритма в следующую версию двоичного компилятора Спасибо за внимание.