46 lines
3.4 KiB
Markdown
46 lines
3.4 KiB
Markdown
#### Истинная зависимость по данным, антизависимость, выходная зависимость. Граф зависимостей.
|
||
|
||
Пусть есть 2 инструкции $i$, $j$. где $i$ предшествует $j$ в программе.
|
||
|
||
- **Инструкция $j$ зависит по данным от инструкции $i$, если:**
|
||
- $i$ выдает результат, используемый $j$ (конфликт RAW), если порядок выполнения не сохраняется.
|
||
- $j$ зависит по данным от $k$ и $k$ зависит по данным от $i$ (цепочка конфликтов RAW).
|
||
|
||
**Пример зависимости по данным:**
|
||
```armasm
|
||
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 и некорректному исполнению.
|
||
|
||
**Пример:**
|
||
```armasm
|
||
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
|
||
```
|
||
|
||
В графе можем переупорядочивать инструкции только если сохраняется порядок стрелок.
|