#### Истинная зависимость по данным, антизависимость, выходная зависимость. Граф зависимостей. Пусть есть 2 инструкции $i$, $j$. где $i$ предшествует $j$ в программе. - **Инструкция $j$ зависит по данным от инструкции $i$, если:** - $i$ выдает результат, используемый $j$ (конфликт RAW), если порядок выполнения не сохраняется. - $j$ зависит по данным от $k$ и $k$ зависит по данным от $i$ (цепочка конфликтов RAW). **Пример зависимости по данным:** ```assembly 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 и некорректному исполнению. **Пример:** ```assembly 1 LD F0, [R1] 2 DADD F2, F0, F4 3 ST F4, [R1] 4 LD F0, [R1-8] 5 DADD F2, F0, F4 6 ST F4, [R1-8] ``` В графе можем переупорядочивать инструкции только если сохраняется порядок стрелок.