Программный разрыв зависимостей между операциями обращения в память в двоичном

реклама
Программный разрыв
зависимостей между
операциями обращения в
память в двоичном
оптимизирующем компиляторе
Магистерская диссертация студента 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
Необходимость разрешения конфликтов
с другими оптимизациями для введения
предложенного алгоритма в следующую
версию двоичного компилятора
Спасибо за внимание.
Скачать