Опасность (компьютерная архитектура) - Википедия - Hazard (computer architecture)

В области центральное процессорное устройство (ЦПУ) дизайн, опасности проблемы с конвейер команд в CPU микроархитектуры когда следующая инструкция не может выполняться в следующем тактовом цикле,[1] и потенциально может привести к неверным результатам вычислений. Три распространенных типа опасностей - это опасности для данных, структурные опасности и контрольные опасности (опасности ветвления).[2]

Существует несколько методов борьбы с опасностями, в том числе: стойла трубопроводов / барботаж трубопровода, пересылка операндов, а в случае внеочередное исполнение, то табло метод и Алгоритм Томасуло.

Фон

инструкции в конвейерном процессоре выполняются в несколько этапов, так что в любой момент времени несколько инструкций обрабатываются на различных этапах конвейера, таких как выборка и выполнение. Есть много разных конвейеров инструкций микроархитектуры, и инструкции могут быть выполнен вне очереди. Опасность возникает, когда две или более из этих одновременных (возможно, вышедших из строя) инструкций конфликтуют.

Типы

Опасности для данных

Опасности для данных возникают, когда инструкции, зависимость данных изменять данные на разных этапах конвейера. Игнорирование потенциальных опасностей данных может привести к условия гонки (также называемые расовыми опасностями). Существует три ситуации, в которых может возникнуть опасность для данных:

  1. чтение после записи (RAW), истинная зависимость
  2. писать после чтения (WAR), анти-зависимость
  3. писать после записи (WAW), выходная зависимость

Рассмотрим две инструкции i1 и i2, с i1 происходящее до i2 в программном порядке.

Чтение после записи (RAW)

(i2 пытается прочитать источник перед i1 пишет в него) Опасность чтения после записи (RAW) данных относится к ситуации, когда инструкция ссылается на результат, который еще не был вычислен или получен. Это может произойти, потому что даже если инструкция выполняется после предыдущей инструкции, предыдущая инструкция была обработана только частично через конвейер.

Пример

Например:

i1. R2 <- R5 + R3i2. R4 <- R2 + R3

Первая инструкция вычисляет значение для сохранения в регистре. R2, а второй будет использовать это значение для вычисления результата для регистра R4. Однако в трубопровод, когда операнды выбираются для второй операции, результаты первой еще не сохранены, и, следовательно, возникает зависимость данных.

Зависимость данных возникает с инструкцией i2, так как это зависит от завершения инструкции i1.

Запись после чтения (WAR)

(i2 пытается записать место назначения до того, как оно будет прочитано i1Опасность записи после чтения (WAR) данных представляет проблему с одновременным выполнением.

Пример

Например:

i1. R4 <- R1 + R5i2. R5 <- R1 + R2

В любой ситуации есть шанс, что i2 может закончить раньше i1 (т. е. при параллельном выполнении) необходимо убедиться, что результат регистрации R5 не хранится раньше i1 имел шанс получить операнды.

Запись после записи (WAW)

(i2 пытается записать операнд до того, как он будет записан i1) Опасность записи после записи (WAW) данных может возникнуть в одновременное исполнение среда.

Пример

Например:

i1. R2 <- R4 + R7i2. R2 <- R1 + R3

Обратная запись (WB) i2 должен быть отложен до i1 завершает выполнение.

Структурные опасности

Структурная опасность возникает, когда две (или более) инструкции, которые уже находятся в конвейере, нуждаются в одном и том же ресурсе. В результате инструкция должна выполняться последовательно, а не параллельно для части конвейера. Структурные опасности иногда называют опасностями, связанными с ресурсами.

Пример: ситуация, в которой несколько инструкций готовы к переходу в фазу выполнения инструкций и имеется один ALU (арифметический логический блок). Одним из решений такой опасности ресурсов является увеличение доступных ресурсов, например наличие нескольких портов в основной памяти и нескольких блоков ALU (Arithmetic Logic Unit).

Управляйте опасностями (опасностями в филиалах или инструкциями)

Опасность управления возникает, когда конвейер принимает неправильные решения по предсказанию ветвления и, следовательно, вводит в конвейер инструкции, которые впоследствии должны быть отброшены. Термин "опасность ветвления" также относится к опасности управления.

Устранение опасностей

Универсальный

Барботирование трубопровода

Бурление трубопровода, также называемый разрыв трубопровода или же стойло трубопровода, это метод предотвращения опасностей, связанных с данными, структурой и ветвями. По мере получения инструкций управляющая логика определяет, может ли / произойдет ли опасность. Если это правда, то управляющая логика вставляет нет операцииs (NOPs) в трубопровод. Таким образом, перед выполнением следующей инструкции (которая может вызвать опасность) у предыдущей будет достаточно времени, чтобы завершить и предотвратить опасность. Если количество NOPs равно количеству стадий в конвейере, процессор очищен от всех инструкций и может работать без опасностей. Все формы остановки приводят к задержке, прежде чем процессор сможет возобновить выполнение.

Промывка трубопровода происходит, когда инструкция ветвления переходит в новую ячейку памяти, делая недействительными все предыдущие этапы конвейера. Эти предыдущие этапы очищаются, позволяя конвейеру продолжить работу с новой инструкцией, указанной ветвью.[3][4]

Опасности для данных

Существует несколько основных решений и алгоритмов, используемых для устранения опасностей, связанных с данными:

  • вставить пузырь на трубопроводе всякий раз, когда встречается зависимость чтения после записи (RAW), гарантированно увеличивает задержку, или
  • использовать внеочередное исполнение чтобы потенциально предотвратить потребность в пузырях трубопровода
  • использовать пересылка операндов использовать данные с более поздних этапов конвейера

В случае внеочередное исполнение, используемый алгоритм может быть:

Задача удаления зависимостей данных может быть делегирована компилятору, который может заполнить соответствующее количество NOP инструкции между зависимыми инструкциями, чтобы гарантировать правильную работу, или изменить порядок инструкций, где это возможно.

Пересылка операндов

Примеры

В следующих примерах вычисленные значения находятся в смелый, а номера регистров - нет.

Например, чтобы записать значение 3 в регистр 1 (который уже содержит 6), а затем добавить 7 в регистр 1 и сохранить результат в регистре 2, то есть:

i0: R1 = 6i1: R1 = 3i2: R2 = R1 + 7 = 10

После выполнения регистр 2 должен содержать значение 10. Однако если i1 (написать 3 в регистр 1) не полностью выходит из конвейера до начала выполнения i2, это означает, что R1 не содержит значения 3 когда i2 выполняет его сложение. В таком случае i2 добавляет 7 к старому значению регистра 1 (6), поэтому регистр 2 содержит 13 вместо этого:

i0: R1 = 6i2: R2 = R1 + 7 = 13i1: R1 = 3

Эта ошибка возникает из-за того, что i2 читает регистр 1 до того, как i1 зафиксирует / сохранит результат своей операции записи в регистр 1. Таким образом, когда i2 читает содержимое регистра 1, регистр 1 все еще содержит 6, нет 3.

Пересылка (описанная ниже) помогает исправить такие ошибки, в зависимости от того, что вывод i1 (который 3) можно использовать в последующих инструкциях перед Значение 3 фиксируется / сохраняется в регистре 1.

Пересылка, примененная к примеру, означает, что нет ожидания, чтобы зафиксировать / сохранить вывод i1 в регистре 1 (в этом примере вывод 3) перед тем, как сделать этот вывод доступным для последующей инструкции (в данном случае i2). Эффект заключается в том, что i2 использует правильное (самое последнее) значение Регистра 1: фиксация / сохранение были выполнены немедленно и не конвейерно.

При включенной пересылке Декодирование / выполнение инструкций (ID / EX) этап конвейера теперь имеет два входа: значение, считываемое из указанного регистра (в данном примере значение 6 из Регистра 1) и новое значение Регистра 1 (в этом примере это значение 3) который отправляется со следующего этапа Выполнение инструкции / доступ к памяти (ЕХ / MEM). Добавленная логика управления используется для определения того, какой ввод использовать.

Управляйте опасностями (отраслевыми опасностями)

Чтобы избежать опасностей управления, микроархитектуры могут:

  • вставить пузырь на трубопроводе (обсуждалось выше), гарантированное увеличение задержка, или же
  • использовать предсказание ветвления и, по сути, делать обоснованные предположения о том, какие инструкции вставить, и в этом случае пузырь на трубопроводе понадобится только в случае неверного прогноза

В случае, если ветвление вызывает пузырек конвейера после того, как неправильные инструкции поступили в конвейер, необходимо принять меры, чтобы любая из неправильно загруженных инструкций не повлияла на состояние процессора, за исключением потерь энергии на их обработку до того, как они будут обнаружены. загружается неправильно.

Другие техники

Задержка памяти - еще один фактор, на который должны обратить внимание дизайнеры, поскольку задержка может снизить производительность. Различные типы памяти имеют разное время доступа к памяти. Таким образом, выбирая подходящий тип памяти, разработчики могут улучшить производительность конвейерного пути данных.[5]

Смотрите также

Рекомендации

  1. ^ Паттерсон и Хеннесси 2009, п. 335.
  2. ^ Паттерсон и Хеннесси 2009 С. 335-343.
  3. ^ «Схемы прогнозирования ветвлений». cs.iastate.edu. 2001-04-06. Получено 2014-07-19.
  4. ^ «Опасности, связанные с данными и контролем». classes.soe.ucsc.edu. 2004-02-23. Получено 2014-07-19.
  5. ^ Ченг, Чинг-Хва (27 декабря 2012 г.). «Пример проектирования полезной задержки памяти для разработки высокопроизводительного встроенного микропроцессора в конвейере предотвращения опасностей». Дизайн СБИС. 2013: 1–10. Дои:10.1155/2013/425105.

внешняя ссылка