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
В графе можем переупорядочивать инструкции только если сохраняется порядок стрелок.