3.4 KiB
Истинная зависимость по данным, антизависимость, выходная зависимость. Граф зависимостей.
Пусть есть 2 инструкции i, j. где i предшествует j в программе.
- Инструкция
jзависит по данным от инструкцииi, если: iвыдает результат, используемыйj(конфликт RAW), если порядок выполнения не сохраняется.jзависит по данным отkиkзависит по данным отi(цепочка конфликтов RAW).
Пример зависимости по данным:
Loop:
LD [R1], F0
DADD F2, F0, F4
ST F4, [R1]
Зависимость по именам возникает, когда 2 инструкции используют один и тот же регистр или место в памяти, т.е. общее имя места. Между инструкциями, имеющими зависимость по именам, нет потока данных (нет отношения выдает/использует). Может существовать два типа зависимостей по именам:
- Антизависимость.
- Существует, когда
jпишет в тот же регистр или место в памяти, котороеiчитает.
Нарушение антизависимости (относительный порядок чтения/записи изменен): приводит к конфликту WAR и потому относительный порядок чтения/записи и исполнения должен сохраняться.
i считывает значение по имени, j записывает значение по тому же имени. j антизависима от i.
Изменение относительного порядка исполнения i, j нарушает эту зависимость по именам и приводит к конфликту WAR и некорректному исполнению.
- Выходная зависимость (зависимость записи).
- Существует, когда
iиjпишут в один и тот же регистр или место в памяти.
Нарушение выходной зависимости (относительный порядок записи изменен): приводит к конфликту WAW и потому порядок записи и исполнения должен сохраняться.
i, j пишут по одинаковому имени. Тогда j зависима по выходу от i.
Изменение относительного порядка исполнения i, j нарушает эту зависимость по именам и приводит к конфликту WAW и некорректному исполнению.
Пример:
LD F0, [R1] ; 1
DADD F2, F0, F4 ; 2
ST F4, [R1] ; 3
LD F0, [R1-8] ; 4
DADD F2, F0, F4 ; 5
ST F4, [R1-8] ; 6
В графе можем переупорядочивать инструкции только если сохраняется порядок стрелок.