Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
- | <P STYLE="margin-bottom: 0cm">Чернов, 21.11.06</P>
| + | == From Ebaums Inc to MurkLoar. == |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | We at EbaumsWorld consider you as disgrace of human race. |
- | </P>
| + | Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated. |
- | <P STYLE="margin-bottom: 0cm">Расстановка поколений переменных.</P>
| + | Dig yourself a grave - you will need it. |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Определние границ доминир</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Простановка границ доминир шаблонов для
| + | |
- | фи-функций</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Переименрвание. т. е. расстановка
| + | |
- | поколений.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Первый случай:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Использование переменной не в
| + | |
- | фи-функции. Использование а</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Таким образом, для расст поколений мы
| + | |
- | можем делать обход нашей функции согластно дереву доминирования. Как
| + | |
- | только мы в процессе длерева доминирования попадаем в базовый блок,
| + | |
- | мы обрабатывем его линейно, и как только нам попадается переменная,
| + | |
- | мы назначаем ей поколение и заносим стек. Как только она попадается
| + | |
- | ещё раз, мы берём её из стека и перенумеровываем.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Когда мы обрабатываем очередной базовый
| + | |
- | блок, мы просматриваем каждую исходящую дугу, и проставляем поколение
| + | |
- | в соотв со стеком. Нам нужен счётчик поколений и стек поколений.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Init</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach a принадлежит Vans</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> count[a] <- 0</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> stack[a] <- empty</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> stack[a].push(0)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Rename(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Запускать расстановук поколений мы
| + | |
- | должны с корня дерева. Делаем первый проход.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Rename(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach s принадлежит stmt(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> if s != фи-финкция</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach x принадлежит use(s)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> i <- stack[x].top()</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> заменить x на x<SUB>i</SUB></P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach a принадлежит defs(s)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> count[a]++</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> i <- count[a]</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> stack[a].push(i)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> заменить a на a<SUB>i</SUB></P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">На этом просмотр переменных
| + | |
- | заканчивается.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Предположим,
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">foreach y принадлежит succ(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> пусть n – j-й предш. для y</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach фи принадлежит фи-функция(y)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> пусть a- j-й операнд</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> i <- stack[a].top()</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> заменить а на a<SUB>i</SUB></P>
| + | |
- | <P STYLE="margin-bottom: 0cm">for x принадлежит child(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> Rename(x)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">//ну и последнее, совсем последнее –
| + | |
- | почистить стек</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">foreach s прниадлежит stmt(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach a принадлежит def(j)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> stack[a].pop();</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">проблемы:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">когда возникают перекрывающиеся
| + | |
- | интервалы жизни переменных (требуется edge splitting)</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Параллельна янатура всех
| + | |
- | фи-присваиваний – все фи-присв одновременны</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Нарушение границ доминирования<BR><BR>
| + | |
- | </P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm">Распределение регистров</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">register allocation</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">register assignment</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm">В многих Яп есть конструкции или
| + | |
- | переменные, которые не имеет смысла помещать в регистр. Например,
| + | |
- | переменные у которых беруться адреса, переменные, слишком большие для
| + | |
- | регистров.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для всех переменных, которые будут
| + | |
- | помещаться на регистры, мы назначим временный регистр, псевдорегистр,
| + | |
- | при этом исходим из предположения, что их неогр количество.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для назн регистров нам нужна инф, жива
| + | |
- | перем или нет, следовательно, предварительно нужен анализ живых
| + | |
- | переменных.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если переменная не жива, то в этой
| + | |
- | точке программы мы можем повторно использовать регистр, на которую
| + | |
- | она распределена.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Какие переменные не могут одновременно
| + | |
- | помещены на регистр – которые одновременно живы.Каждую
| + | |
- | переменную, которая исп. в программе, представляем вершиной графа.
| + | |
- | Регистры также предст. вершинами. Если две переменные одновременно не
| + | |
- | являются живыми, то мы их соединяем. Такой граф называется графом
| + | |
- | наложений.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Теперь поставим в соотв регистру цвет.
| + | |
- | Соответственно, две перем не могут иметь одного цвета. Эта задача
| + | |
- | широко известна – задача о раскраске графа. Нас интересует
| + | |
- | раскраска с мин. количеством цветов. Это NP-полная задача. Тем не
| + | |
- | менее, можно применять эфристики.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Несколько дополнительных замечаний:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">На самом деле, переменные исрпользовать
| + | |
- | не очень хорошо. Это накладывает лишние ограничения.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Поэтому распред регистров лучше вести
| + | |
- | для сетей (web)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Что такое сеть – предположим, что
| + | |
- | есть построенные du-цепочки (можно обобщитьна SSA). Пусть есть опред
| + | |
- | x, от него есть ссылки на места использования. У этого использования
| + | |
- | есть, возможно на него ссылкаются другие определения. Соответственно,
| + | |
- | максимальная компонента и будет являться сетью.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Именно компоненты связности двудольного
| + | |
- | графа должны рассм.при распред на регистры. Т. о. прежде, чем
| + | |
- | выполнятьанализ живых переменных, нам нужно провести сети.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Второе замечание. Переменные не могут
| + | |
- | попадать на один регистр тогда, когда они не явл. одновременно
| + | |
- | живыми. Но это приводит к большому количеству дуг. Пример:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Можно ослабить этот критерий.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">(я прослушал, как он звучит :( Похоже,
| + | |
- | что надо смотреть только на точки определения)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В соответствии с ним гв графе будут
| + | |
- | только два ребра, соед а1 а2 и b1 b2.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">При распред регистров Необходимо
| + | |
- | учитывать требования архитектуры.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Соглашения по вызовам функций.
| + | |
- | Например, если известно, что нек-рые регистры после вызова функции
| + | |
- | пользоваться, то нужно соед их дугами с всеми живыми в точке вызова
| + | |
- | перем, чтобы исключить их нахождение там. Или например. перем цикла
| + | |
- | должна быть на опред регистре.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для преобр. графа можно склеивать
| + | |
- | регистры (<SPAN LANG="en-US">register</SPAN> <SPAN LANG="en-US">coalescing</SPAN>)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">ai <- aj</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Либо ai и aj не накладываются друг
| + | |
- | на друга, либо они не исп. от текущей точки до конца функции. В этом
| + | |
- | случае их можно склеить</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">=> def ai -> def aj удаляем ai
| + | |
- | <- aj</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Склецйка регистров:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Выполняем edge splitting</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm"><IMG SRC="CO_06_11_21_html_528d24d7.gif" ALIGN=LEFT>a3=a1
| + | |
- | a3=a2</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm"><IMG SRC="CO_06_11_21_html_70a6898f.gif" ALIGN=LEFT><IMG SRC="CO_06_11_21_html_m3a7159c4.gif" ALIGN=LEFT>
| + | |
- | В резульатте появляется множество лишних
| + | |
- | копирований, что может поставить под вопрос саму целесообразность
| + | |
- | преобразования.</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Раскраска графа наложений:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Пусть у нас есть R регистров</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Вершины степени меньше R –
| + | |
- | всегда могут быть раскрашены, выкидываем их, так можно удалять, пока
| + | |
- | не останутя только вершины степени больше равно R</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">2. Найдём произв узел со степенью
| + | |
- | больше равно R, найдём ту, для которой отношение стоимости сброса к
| + | |
- | её степени минимальна. Стоимость сброса – то, насколько плохо
| + | |
- | запихивать переменную в память.Такую вершину мы, как и все со
| + | |
- | степенью меньше R помещаем в стек. Это мы делаем, пока граф не
| + | |
- | опустошится. 3. Теперь их будем выимать и назначать цвета. Если
| + | |
- | назначили, то всё хорошо, если же нет, то в опред момент появляется
| + | |
- | переменная, которая становится кандидатом на сброс.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В чё мзаключается сброс (spill).
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"></P>
| + | |
- | </OL>
| + | |
- | | + | |
- | {{Введение в теорию построения оптимизирующих компиляторов}}
| + | |
- | {{Lection-stub}}
| + | |