Зависимость данных в информатике — это ситуация, в которой оператор программы (инструкция) ссылается на данные предыдущего оператора. В теории компиляторов метод, используемый для обнаружения зависимостей данных между операторами (или инструкциями), называется анализом зависимости .
Предполагая утверждение и , зависит от того, если:
где:
Эти условия называются условиями Бернштейна, названными в честь Артура Дж. Бернстайна. [1]
Существуют три случая:
Истинная зависимость, также известная как зависимость потока или зависимость данных , возникает, когда инструкция зависит от результата предыдущей инструкции. Нарушение истинной зависимости приводит к опасности чтения после записи (RAW) .
1. А = 32. Б = А3. С = В
Инструкция 3 действительно зависит от инструкции 2, так как конечное значение C зависит от инструкции, обновляющей B. Инструкция 2 действительно зависит от инструкции 1, так как конечное значение B зависит от инструкции, обновляющей A. Поскольку инструкция 3 действительно зависит от инструкции 2, а инструкция 2 действительно зависит от инструкции 1, инструкция 3 также действительно зависит от инструкции 1. Таким образом, параллелизм на уровне инструкций не является вариантом в этом примере. [2]
Антизависимость возникает, когда инструкция требует значение, которое позже обновляется. Нарушение антизависимости приводит к опасности записи после чтения (WAR) .
В следующем примере инструкция 2 антизависима от инструкции 3 — порядок этих инструкций не может быть изменен, и они не могут выполняться параллельно (возможно, с изменением порядка инструкций), поскольку это повлияет на конечное значение A.
1. В = 32. А = В + 13. В = 7
Пример:
МУЛ R3,R1,R2 ДОБАВИТЬ R2,R5,R6
Очевидно, что между этими двумя инструкциями есть антизависимость. Сначала мы считываем R2, а затем во второй инструкции записываем для него новое значение.
Антизависимость — это пример зависимости имени . То есть переименование переменных может удалить зависимость, как в следующем примере:
1. В = 3Н. В2 = В2. А = В2 + 13. В = 7
Новая переменная B2 была объявлена как копия B в новой инструкции, инструкции N. Антизависимость между 2 и 3 была удалена, что означает, что эти инструкции теперь могут выполняться параллельно. Однако модификация ввела новую зависимость: инструкция 2 теперь действительно зависит от инструкции N, которая действительно зависит от инструкции 1. Как потоковые зависимости, эти новые зависимости невозможно безопасно удалить. [2]
Выходная зависимость возникает, когда порядок инструкций влияет на конечное выходное значение переменной. Нарушение выходной зависимости приводит к опасности записи после записи (WAW) .
В приведенном ниже примере существует выходная зависимость между инструкциями 3 и 1 — изменение порядка инструкций в этом примере изменит конечное значение A, поэтому эти инструкции не могут выполняться параллельно.
1. В = 32. А = В + 13. В = 7
Как и в случае с антизависимостями, выходные зависимости являются зависимостями имени . То есть, они могут быть удалены путем переименования переменных, как в приведенной ниже модификации приведенного выше примера:
1. В2 = 32. А = В2 + 13. В = 7
Обычные программы пишутся с учетом модели последовательного выполнения . В этой модели инструкции выполняются одна за другой, атомарно (т. е. в любой момент времени выполняется только одна инструкция) и в порядке, указанном программой.
Однако зависимости между операторами или инструкциями могут препятствовать параллелизму — параллельному выполнению нескольких инструкций либо распараллеливающим компилятором, либо процессором, использующим параллелизм на уровне инструкций . Безрассудное выполнение нескольких инструкций без учета связанных зависимостей может привести к опасности получения неправильных результатов, а именно к опасностям .
Зависимости данных актуальны в различных областях вычислений, особенно при проектировании процессоров, создании компиляторов, параллельных вычислениях и параллельном программировании.
Зависимости данных важны для различных оптимизаций компилятора , например:
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка )