Природа этих опасностей конвейерной работы заключается в том, будет ли конвейер в противном случае пытаться работать с устаревшими значениями или нет. Конвейерная передача распределяет выполнение одной инструкции по этапам (каждый этап происходит в последующем цикле), что позволяет каждому этапу иметь более короткое время цикла. Чтобы не снижать производительность, конвейерные процессоры перекрывают выполнение последовательных инструкций. Именно это совпадение ускоряет производительность и создает потенциальные опасности.
Во время декодирования команды регистровый файл используется для операндов для выполняемой команды - в однотактном (не конвейерном) процессоре, эти значения всегда архитектурно корректны на 100%, даже если они были недавно обновлены с помощью непосредственно предшествующих инструкций.
Аналогично, в конвейерном процессоре файл регистров используется для операндов для выполняемой инструкции: это происходит специально на этапе ID.
Однако для любых двух последовательных инструкций этап WB 1-й инструкции произойдет после этапа ID 2-й инструкции - и это является источником опасности.
Когда у двухсторонних инструкций есть зависимость от регистра, возникает опасность (на этапе идентификации уже прочитаны устаревшие значения, потому что большинство актуальные значения пока еще не готовы. инструкции не имеют зависимости, опасности нет, так как на этапе ID уже прочитаны правильные и самые актуальные значения.
Для получения правильной, большей -создание значений, как правило, без остановки процессора (как было бы необходимо, если бы мы ожидали завершения этапа WB 1-й инструкции перед выполнением этапа ID 2-й инструкции - это было бы задержкой в два цикла).
Дело в том, что у нас есть три варианта:
- для go перекрывающегося выполнения - что не является опцией для производительности
- задержка при наличии зависимости - также не очень хорош для производительности
- использование прямого или байпасного режима
прямой / байпас работает с наблюдением, что самое раннее время, когда нужное значение доступно, находится в конце EX стадия (для опасностей ALU), и что самое последнее время, которое мы могли бы предоставить наиболее актуальную ценность, находится в начале стадии EX. Таким образом, если мы можем получить значения до go с выхода ALU на вход ALU между циклами, мы сможем избежать опасности, не вводя срывов.
Вперед (или обход) имеет два механизма:
- Решите, когда необходимо задействовать
- Как задействовать
Сложнее всего определить, существует ли зависимость между двумя последовательными инструкциями , Нам понадобится эта сложность, будь то остановка или обход, так же как и последняя, так как стойла страдают от производительности.
Грубо говоря, логика c для определения того, когда задействовать, должна определять, когда существует зависимость между регистром / операндом между целью одной инструкции и источником следующей, поэтому аппаратное обеспечение постоянно ищет это между любыми двумя последовательными инструкциями.
Когда такая зависимость найдена устаревшие значения, которые были считаны на этапе идентификации, должны быть заменены правильными значениями - в случае опасности ALU, затем выход из ALU (выход). Таким образом, механизм обхода, когда он включается, игнорирует этап ID, предоставленный значения операнда, и переопределяет одно (или другое, или оба) выходным значением ALU.