Главная страница

Тема 13 2018Распределение_и_назначение. 13. Распределение и назначение регистров 13. 1


Скачать 0.73 Mb.
Название13. Распределение и назначение регистров 13. 1
Дата20.11.2018
Размер0.73 Mb.
Формат файлаpdf
Имя файлаТема 13 2018Распределение_и_назначение.pdf
ТипДокументы
#57018
страница4 из 4
1   2   3   4
R1
стек
Граф конфликтов до исключения узлов R1
,
R2
,
R3
,
R4
Граф конфликтов после исключения узлов R1
,
R2
,
R3
,
R4
13.3
Глобальное распределение и назначение регистров
13.3.15
Примеры глобального распределения регистров

Теперь узел R5
имеет меньше пяти смежных узлов; заталкиваем и его в стек и удаляем из графа конфликтов. Получается граф, изображенный на правом рисунке
s1
s2
s3
s5
s6
стек
Граф конфликтов до исключения узла R5
Граф конфликтов после исключения узла R5
s1
s2
s3
s5
s6
R5
R5
R4
R3
R2
R1
13.3
Глобальное распределение и назначение регистров
13.3.15
Примеры глобального распределения регистров

Теперь все оставшиеся узлы графа конфликтов имеют меньше пяти смежных узлов; заталкиваем их (в произвольном порядке) в стек и удаляем из графа конфликтов.
s1
s2
s3
s5
s6
стек
s1
s2
s3
s5
s6
R5
R4
R3
R2
R1
13.3
Глобальное распределение и назначение регистров
13.3.15
Примеры глобального распределения регистров

Выталкиваем регистры из стека и присваиваем каждому свободный цвет (всего имеется пять цветов).
R5
имеет 4 смежных узла:
s1
(
1
),
s2
(
2
),
s3
(
3
) и
s6
(
5
). Следовательно, ему можно присвоить цвет
4
(только он свободен).
стек
s1
s2
s3
s5
s6
R5
R4
R3
R2
R1
Регистр
Цвет
s1
1
s2
2
s3
3
s5
4
s6
5
R5
4
R4
1
R3
2
R2
3
R1
5
R4 = 2
R3 = 3
R2 = c
R5 = R2 + 1
R4 < R2
R3 = R3 + 1
R2 = 2 * R2
R3 < 10
R2 = R2 + 1
R1 = R4 + R3
R5 = R4 + R5
print(R3,R2,R4,R5)
B
1
B
2
B
3
B
4
13.3
Глобальное распределение и назначение регистров
13.3.15
Примеры глобального распределения регистров

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

Пусть доступно
R регистров и пусть составлен список из n интервалов жизни. Алгоритм
Linear scan должен распределить на регистры как можно больше ИЖ таким образом, чтобы никакие пересекающиеся ИЖ не были распределены на один и тот же регистр.

Если n > R и ИЖ пересекаются в некоторой точке, то по крайней мере n
− R ИЖ должны быть размещены в памяти.

Количество пересекающихся ИЖ изменяется только в начале и в конце одного из ИЖ.

Все ИЖ помещаются в список, отсортированный по возрастанию их начал. Тогда алгоритм может быстро просмотреть все ИЖ, перескакивая с одного начала ИЖ к следующему. На каждом шагу алгоритм поддерживает список активных ИЖ, которые пересекаются в данной точке и уже размещены на регистрах.
Этот список активных поддерживается отсортированным по возрастанию концов входящих в него ИЖ.

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

На псевдокоде
active

{}
for each live interval i в порядке
возрастания начал
ExpireOldIntervals(i)//окончание
старых интервалов
if length(active) = R then
SpillAtInterval(i) //слив интервала i
else
register[i]

регистр, удаляемый из
пула свободных регистров
добавить i в active, отсортированный
по возрастанию концов ИЖ

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

На псевдокоде
ExpireOldIntervals(i)
foreach interval j in active, in order of
increasing end point
if endpoint[j] ≥ startpoint[i] then
remove j from active
add register[j] to pool of free
registers
return

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

На псевдокоде
SpillAtInterval(i)
spill

last interval in active
if endpoint[spill] > end point[i] then
register[i]

register[spill]
location[spill]

new stack location
remove spill from active
add i to active, sorted by increasing
end point
else
location[i]

new stack location

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

При обнаружении каждого нового ИЖ алгоритм просматривает список
active
с начала до конца. Во время просмотра из списка удаляются все закончившиеся ИЖ (ИЖ, которые больше не пересекаются, так как конец одного из них раньше начала другого) и делает соответствующий регистр доступным для распределения.


13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

Пример. Пусть доступно всего два регистра r1
и r2
v1 v2 v3 v4 v5
(1) v1 = 10
(2) v2 = 20
(3) v3 = v1 + v2
(4) v4 = v2 + v3
(5) v1 = v3 + v4
(6) v5 = v4 + v1
(7) return (v1 + v5)

ИЖ обрабатываются в порядке v1,v2,v3,v4,v5.
Сначала список Active
пуст.
На первом шаге обрабатывается ИЖ v1
Так как список Active
пуст
, регистр r1
выделяется для v1, и v1
заносится в список
Active

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

Пример. Пусть доступно всего два регистра r1
и r2
v1 v2 v3 v4 v5
(1) v1 = 10
(2) v2 = 20
(3) v3 = v1 + v2
(4) v4 = v2 + v3
(5) v1 = v3 + v4
(6) v5 = v4 + v1
(7) return (v1 + v5)

ИЖ обрабатываются в порядке v1,v2,v3,v4,v5.
После первого шага список Active
содержит ИЖ v1.
На втором шаге обрабатывается ИЖ v2
Так как v1
продолжает оставаться активным, v1
не исключается из списка Active, и для ИЖ v2
выделяется единственный свободный регистр r2, а
v2
заносится в список
Active

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

Пример. Пусть доступно всего два регистра r1
и r2

На рисунках показано состояние до и после третьего шага.
v1 v2 v3 v4 v5
v1 v2 v3 v4 v5
r1 r2 m1 r2 r1
(1)
(2)
(3)
(4)
(5)
(6)
(7)
Cписок Active:v1,v2
Cписок Active:v2,v3
Слито
в
память:m1
Текущий шаг

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

Пример. Пусть доступно всего два регистра r1
и r2

Полученное распределение регистров показано на рисунке.
Метод раскраски графа конфликтов обеспечивает для рассмотренного примера лучшее распределение регистров.
(1) v1 = 10
(2) v2 = 20
(3) v3 = v1 + v2
(4) v4 = v2 + v3
(5) v1 = v3 + v4
(6) v5 = v4 + v1
(7) return (v1 + v5)
(1) m1 = 10
(2) r2 = 20
(3) r1 = m1 + r2
(4) r2 = r2 + r1
(5) m1 = r1 + r2
(6) r1 = r2 + m1
(7) return (m1 + r1)

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

Пример. Пусть доступно всего два регистра r1
и r2

Метод раскраски графа конфликтов обеспечивает для рассмотренного примера лучшее распределение регистров.
(1) v1 = 10
(2) v2 = 20
(3) v3 = v1 + v2
(4) v4 = v2 + v3
(5) v1 = v3 + v4
(6) v5 = v4 + v1
(7) return (v1 + v5)
(1) r2 = 10
(2) r1 = 20
(3) r2 = r2 + r1
(4) r1 = r1 + r2
(5) r2 = r2 + r1
(6) r1 = r1 + r2
(7) return (r2 + r1)

Но метод раскраски графа конфликтов имеет асимптотическую временную сложность
O
(
n
2
).
Метод линейного сканирования реализует распределение регистров за один просмотр текста программы и имеет асимптотическую временную сложность
O
(
n
).

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

Разработчики
JIT-
компиляторов (например, для языка
Java
или для языка
Python
) предпочитают метод линейного сканирования.

В отличие от метода раскраски графа конфликтов, имеющего асимптотическую временную сложность
O
(
n
2
)
, метод линейного сканирования реализует распределение регистров всего за один просмотр текста программы и имеет асимптотическую временную сложность
O
(
n
).

В последнее время используется модификация метода линейного сканирования, называемая
Second
Chance
Binpacking
. Во многих случаях она позволяет увеличить точность линейного сканирования, сохраняя асимптотическую временную сложность
O
(
n
).

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
метод
линейного сканирования (
Linear scan)

Разработчики
JIT-
компиляторов (например, для языка
Java
или для языка
Python
) предпочитают метод линейного сканирования.

В отличие от метода раскраски графа конфликтов, имеющего асимптотическую временную сложность
O
(
n
2
)
, метод линейного сканирования реализует распределение регистров всего за один просмотр текста программы и имеет асимптотическую временную сложность
O
(
n
).

В последнее время используется модификация метода линейного сканирования, называемая
Second
Chance
Binpacking
Во многих случаях она позволяет увеличить точность линейного сканирования, сохраняя асимптотическую временную сложность
O
(
n
)
. Рассмотрим кратко этот метод.

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
модифицированный метод линейного сканирования
(Second Chance Binpacking)

Одним из основных недостатков метода линейного сканирования является тот факт, что он не рассматривает возможных «дыр» в ИЖ.
В то же время анализ ГПУ реальных программ показывает, что такие дыры нередко возникают в связи с многочисленными ветвлениями. Даже простой пример, рассмотренный выше, подтверждает это.

В самом деле ИЖ для v1 имеет дыру от инструкции (3) до инструкции (5): значение v1 == 10 после инструкции (3) не используется, а в инструкции (5) переопределяется.
(1) v1 = 10
(2) v2 = 20
(3) v3 = v1 + v2
(4) v4 = v2 + v3
(5) v1 = v3 + v4
(6) v5 = v4 + v1
(7) return (v1 + v5)

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
модифицированный метод линейного сканирования
(Second Chance Binpacking)

В самом деле ИЖ для v1
имеет дыру от инструкции (3) до инструкции (5): значение v1 == 10
после инструкции (3) не используется, а в инструкции (5) вообще переопределяется.
Методу линейного сканирования,
(1) v1 = 10
(2) v2 = 20
(3) v3 = v1 + v2
(4) v4 = v2 + v3
(5) v1 = v3 + v4
(6) v5 = v4 + v1
(7) return (v1 + v5)
который игнорирует этот факт, приходится и после инструкции (3) хранить в памяти
(так как регистров не хватает) мертвое значение v1

В модифицированном методе реализована возможность расщепления ИЖ.
Эта возможность позволяет расщепить ИЖ v1
на два ИЖ –
v11
и
v12.
В
итоге v1
получает второй шанс занять регистр.
Отметим, что если бы использовалась
SSA-
форма, расщепления бы не потребовалось, оно бы произошло автоматически.

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
модифицированный метод линейного сканирования
(Second Chance Binpacking)

В модифицированном алгоритме ИЖ v1
сначала помещается в список
Active
, на третьем шаге переводится в список
Inactive
, а на пятом шаге снова помещается в список Active
В
итоге получается распределение регистров, показанное на рисунке.
(1) v1 = 10
(2) v2 = 20
(3) v3 = v1 + v2
(4) v4 = v2 + v3
(5) v1 = v3 + v4
(6) v5 = v4 + v1
(7) return (v1 + v5)
r1 = 10
r2 = 20
r1 = r1 + r2
r2 = r2 + r1
r1 = r1 + r2
r2 = r2 + r1
return (r1 + r2)
v1 v2 v3 v4 v5
r1 r2 r1 r2 r2

13.3
Глобальное распределение и назначение регистров
13.3.11
Быстрый алгоритм распределения регистров –
модифицированный метод линейного сканирования
(Second Chance Binpacking)

Модифицированный алгоритм имеет примерно
такую же скорость, как и базовый алгоритм линейного сканирования, и при этом генерирует код примерно
такого же качества, что и алгоритм раскраски графа конфликтов.
1   2   3   4


написать администратору сайта