Ответ 1
Большинство процессоров в наши дни используют конвейеры. Идеи и проблемы из книги H & P используются везде. Во время этих оригинальных работ я бы предположил, что фактическое оборудование соответствует этому конкретному понятию конвейера. выборка, декодирование, выполнение, запись.
В принципе, конвейер - это сборочная линия с четырьмя основными этапами в строке, так что вы одновременно должны обрабатывать не более четырех команд. Это смущает представление о том, сколько часов требуется для выполнения инструкции, ну, а это занимает больше одного часа, но если у вас есть несколько/несколько выполняемых параллельно, то "средний" может приближаться или превышать один за такт.
Когда вы берете ветку, хотя сборочная линия выходит из строя. Инструкции на этапе выборки и декодирования должны быть брошены, и вы должны снова начать заполнение, так что вы получаете удар нескольких часов для извлечения, декодирования, а затем возврата к выполнению. Идея тени ветки ветки или задержки заключается в том, чтобы восстановить один из этих часов. Если вы заявляете, что команда после ветки всегда выполняется, то при ветве берется инструкция в слоте декодирования, и команда в слоте выборки отбрасывается, и у вас есть одно отверстие времени не два. Поэтому вместо выполнения, пустого, пустого, выполнить, выполнить, вы теперь выполняете, выполняете, пустуете, выполняете, выполняете... на этапе выполнения конвейера. Филиал на 50% менее болезненен, ваша общая средняя скорость выполнения улучшается и т.д.
У ARM нет слота задержки, но он также создает иллюзию конвейера, заявляя, что счетчик программ - это две инструкции впереди. Любая операция, которая опирается на счетчик программ (pc-относительная адресация), должна вычислять смещение, используя компьютер, который состоит из двух инструкций, для команд ARM это 8 байт для оригинального большого пальца 4 байта, и когда вы добавляете в инструкции thumb2, он становится беспорядочным.
Это иллюзии на данный момент за пределами академических кругов, конвейеры глубже, имеют множество трюков и т.д., чтобы устаревший код продолжал работать и/или не должен был переопределять, как инструкции работают для каждой архитектуры, Представьте себе mips rev x, 1 слот задержки, rev y 2 слота задержки, rev z 3 слота, если условие a и 2 слота, если условие b и 1 слот, если условие c) процессор идет вперед и выполняет первую инструкцию после ветки и отбрасывает другая горстка или дюжина после того, как она повторно заполняет трубу. Насколько глубоко трубы действительно существуют, часто не передаются публике.
Я видел комментарий об этом как о RISC, возможно, он начался там, но процессоры CISC используют те же самые точные трюки, просто давая иллюзию устаревшего набора инструкций, временами процессор CISC - это не более чем RISC или Ядро VLIW с оболочкой для эмуляции устаревшего набора команд CISC (микрокод).
Следите за тем, как это было сделано. Визуализируйте конвейерную линию, каждый шаг в строке имеет задачу. Что делать, если один шаг в строке закончился из-за синего цвета, и для получения синего и желтого продукта вам понадобится синий цвет. И вы не можете получить новую синюю тоску за неделю, потому что кто-то прищурился. Таким образом, вам нужно остановить линию, сменить расходные материалы на каждый этап и сделать красно-зеленый продукт на некоторое время, что обычно можно было бы поэтапно выполнить без сброса линии. Это похоже на то, что происходит с веткой, где-то глубоко в конвейере, что-то заставляет строку менять, сбрасывать линию. временной интервал задержки - способ восстановить один продукт из-за необходимости отбрасывать в строке. Вместо N продуктов, выходящих до остановки линии, в течение производственного цикла выходили продукты N + 1. Выполнение кода похоже на всплески производственных прогонов, вы часто получаете короткие, иногда длинные линейные пути выполнения, прежде чем ударить ветку, чтобы перейти на другой короткий путь выполнения, разветките еще один короткий путь выполнения...