Автор оригинала: Erik Eidt.
Pipelining — это подход, который позволяет более быстрому времени цикла. Мы рассмотрим классический 5-ступенчатый трубопровод в стиле MIPS и RISC V.
Трубопроводы Работают путем разделения работы на одну инструкцию на несколько меньших кусочков, каждый из которых может работать быстрее из-за того, что он будет меньше, чем делать, по сравнению с выполнением всей работы для одной инструкции в одном цикле. Итак, это означает, что мы можем запустить часы быстрее, по стоимости иметь инструкцию предпринять несколько циклов.
Кусочки инструкции разбиты на этапы, которые действуют последовательно для одной инструкции, так что 5 глубокого трубопровода займет 5 циклов для завершения инструкции. Однако исполнение одной инструкции — и следующая, а следующая — перекрывать Так что (в идеале) одна инструкция входит в трубопровод каждый цикл, а также выходит также.
Благодаря этому совпадению, одна инструкция завершается (в идеале) каждый цикл, и поэтому циклы процессора на инструкцию, ИПЦ ближе к 1, чем 5, мы могли бы ожидать. Выполнение одной инструкции распространяется более 5 циклов, но выполнение 5 или около того инструкции одновременно перекрываются.
Однако, поскольку выполнение одной инструкции растягивается со временем, это вводит концепцию опасности, которая заключается в том, что ценность конечного одуревания предыдущих инструкций еще не готова к началу успешной инструкции для использования. Поскольку все инструкции растягиваются во времени, их перекрытие может вызвать проблемы, когда есть зависимости.
Прежде чем мы попадем в конкретный пример диаграммы трубопровода, давайте обсудим разные подходы к схеме или иллюстрирующим трубопроводами. У нас есть 3 фундаментальных компонента, которые мы пытаемся показать:
- время — что увеличивается,
- Инструкции, которые также увеличиваются, и,
- Стадии трубопровода — которые фиксированы.
Один популярный подход к схеме трубопровода, показывающий отношения между этими тремя концепциями, является следующим:
Основная сила этого подхода заключается в том, что следует знакомый горизонтальный подход временной шкалы, когда время увеличивается, когда мы идем налево направо.
Тем не менее, этот подход имеет значительный недостаток, что ось X, так и оси Y, как указано стрелками на обеих осях. Если мы выберем это даже 50 инструкциям, диаграмма прошла в столбце 50 и строка 50 !! Этот подход не масштабируется до сотен (не говоря уже о тысячах) инструкций.
При выполнении исследовательского проекта мы могли бы захватить следы тысяч до миллионов инструкций, и мы хотели бы использовать лучшие практики в моделировании данных, например, с использованием базы данных. В подходе с использованием базы данных мы бы тяготели к фиксированным столбцам и позволяем строки расширяться для захвата переменной информации (продолжительность времени и/или инструкций).
По этим причинам я использую следующий подход на этих диаграммах:
Строки расширяются по мере необходимости для учета времени, тогда как столбцы фиксируются для представления стадий фиксированного оборудования.
(Я выбрал это как лучший формат; однако, конечно, еще есть еще другие подходы. Например, мы можем использовать фиксированные столбцы для этапов трубопроводов и имеют инструкции для измерения строки. Клетки затем удерживают информацию о времени. Все диаграммы, которые я обсуждали, эквивалентны с точки зрения передаваемой информации.)
Давайте попадем в конкретный пример. Традиционный монетный трубопровод в стиле MIPS 5 имеет следующие этапы:
ПК, инструкция памяти | ПК | Инструкция слово | Инструкция | ЕСЛИ |
Контроль, регистрирует | Инструкция слово | Контрольные сигналы, значения регистре | Инструкция декодирует | Я БЫ |
Алуаг | Регистрация значений | Результат ALU | Исполнение | БЫВШИЙ |
Память данных | Адрес памяти | Значение памяти | объем памяти | Мемлес |
Реестры | Ценить написать | n/ a | Писать обратно | Вот |
- Если — выбирает инструкцию из памяти инструкции, используя ПК для адреса инструкции Word для чтения
- ID — декодирует слово инструкции в сигналы управления, и использует имена регистров в инструкции Word для поиска значений регистров
- Ex — выполняет некоторую арифметическую операцию, как добавить или и
- Mem — доступ к памяти данных для инструкций нагрузки или хранения
- WB — записывает выходные значения в регистры
Этап WB завершает выполнение инструкции. Нет другого вывода, поскольку следующего этапа нет. Инструкции по последовательной программе связываются друг с другом через (значения IN) регистров и памяти. Этап WB обычно довольно проста с точки зрения его внутренней логики.
Вам придется изучить конкретную архитектуру процессора, используемого в вашем курсе, чтобы получить правильные ответы. Например, в приведенном ниже я предположил, что реестрельный блок внутренне способен на свой собственный переадресацию, так что он пересылает любое значение записи на его выходы в том же цикле. Если это не так, то существует дополнительная опасность. Смотрите пузырьковую диаграмму для большего на этом.
Вот пример:
**1 В конце этого цикла (который начинается при t + 3, где inr 2: находится в ex) значение A2 + 64 выходит из ALU, но это еще не в регистре A0! Кроме того, в конце этого же цикла SHAR 3: ID прочитал устаревшие/плохие значения для A0.
** 2 Давайте соблюдаем, что регистр пишет (записать назад) A0 для SHAR 3: не происходит до стадии WB в T + 5. Таким образом, реестр наконец-то обновлен в начале T + 5 (с внутренним переадресами в регистр или T + 6 без), 2 циклов слишком поздно для этапа ID SHAD 3: начнут в T + 3, где Это читает регистрацию a0.
Без обхода процессор должен был бы остановить, чтобы избежать опасности — этот стойл также называется пузырем в трубопроводе. Точная природа пузыря зависит от того, как процессор обнаруживает опасность.
(Некоторые процессоры не обнаруживают их вообще, требуют программистов и компиляторов и компиляторов сборки для вставки инструкций NOP InBENTWEN, по мере необходимости, чтобы избежать опасностей. Это означает, что такой машинный код сильно зависит от внутренней архитектуры процессора, и потребует корректировки для проведения процессоров с различными архитектурами трубопровода.)
Здесь мы видим, что обычный регистр прочитал для SHAR 3: произойдет в ID в T + 3. Чтобы избежать опасности (без какой-либо формы байпаса), инструкция будет повторять этап ID, пока правильное значение A0 наконец не готово, что будет в T + 5. При t + 5 inr. 2: Наконец, запись его значения обратно в файл реестра, поэтому к началу T + 5, реестр, чтение A0 получит текущее значение (снова предполагающий переадресацию файла внутреннего регистра). Такое избежание опасности будет стоить 2 циклов, чтобы решить эту проблему. (См. Изображение пузыри и ноты ниже.)
А Обход это сложная цепь, работа, в конечном итоге, должна выбрать — в точных правильных условиях — использовать ли либо использовать значения чтения реестра на этапе ID (только в том случае, если они не устарели), либо переопределяют другое значение из-за чего-то еще (когда Регистрация устарела).
Принципиально байпас должен сравнить имена регистров, используемых в соседних инструкциях (сравните целевой реестр прежних инструкций для обоих (если присутствующих) источниках последних инструкций). Если имена регистров совпадают, то байпас указывается, поскольку этап ID последнего инструкции выяснил стоимость осторожного регистра.
Алу обход Наносят вывод ALU обратно на вход ALU, чтобы операцию ALU только что начинается с нового цикла, может использовать значение, которое он только что вычисляется в цикле, просто заканчивая, не дожидаясь ценности, чтобы пройти еще два этапа трубопровода, чтобы получить обратно в правильный реестр.
На диаграмме мы указываем с Красная стрелка где здесь должна возникнуть операция байпаса ALU.
Отметим, что в этом примере фактическое значение ALU готово после ex intr 2: в T + 3 — значение A2 + 64 впервые появляется в процессоре по времени T + 4, и, что ALU естественно хочет Чтобы вычислить Add (для режима адресации инструкции нагрузки, здесь A0 + 24), начиная с T + 4.
Если у нас есть байпас ALU (красная стрелка), мы можем кормить вывод ALU из операции ALU T + 3 на вход Alu в T + 4. Этот механизм избежет этой опасности без каких-либо киосков или пузырьков!
Давайте посмотрим на следующую опасность: опасность нагрузки также записывает значение регистра в конце этапа WB, поэтому также есть задержка 3 цикла для немедленно последующей успешной инструкции.
Обход нагрузки также будет полезен для производительности. Обход нагрузки будет подавать в вход ALU для следующего цикла, и значение поставляется для этого байпаса с стадии MEM (тогда как значение байпаса ALU поступает из бывшего этапа).
Поскольку результат операции нагрузки не доступен до конца сцены MEM, здесь будет иметь возможность устранить только 2 из 3 циклов пузырьков. В дополнение к байпусу нагрузки ( фиолетовая стрелка ), процессор должен будет вставить один цикл стойла, показанный как
Отказ
NB: Это, вероятно, являются двумя наиболее важными обходами для иллюстративных целей, но ни в коем случае не единственные.
Филиалы также вызывают проблемы для трубопроводов. Всякий раз, когда процессор начинает заново заново инструкцию, она берет (в нашем примере 5-ступенчатых трубопровод) до 5 циклов, прежде чем мы увидим результаты первой инструкции. После 5 циклов труба теперь полна, а процессор эффективно перекрывает выполнение нескольких инструкций в трубе. Итак, это значит сказать, что существует запуск накладных расходов для переключения последовательностей инструкций.
Такое накладное расхождение запуска понесено, когда программа изменяет поток контроля из того, что предполагает процессор. Программы изменяют поток управления с петлями, а затем, а затем, используя инструкции с использованием филиалов, а в частности, условные филиалы трудно предсказать, будут ли они или не будут ветчать, поскольку состояние, которое они используют, является динамическим.
Например, когда процессор предполагает, что условная ветвь не будет принята, и оказывается, что к тому времени, когда он знает, что он уже начал работать над несколькими другими инструкциями, которые больше не являются актуальными (они неправы Контроль потока программы) и должны быть отброшены. Это связано с тем, что трубопроволочный процессор всегда пытается полностью держать трубу, а не делать ничего, ожидая, что ветвь разрешится как взят или не взята. Резолюция для условных ветвей обычно происходит на этапе EX, как операция сравнения использует схему вычитания ALU. Это означает, что, когда условная ветвь оказывается, где предполагается, что процессор предполагал, что это не было бы, есть инструкции на более ранних этапах, если и идентификатор, которые должны быть отброшены. Эта ситуация будет стоить пузырь 2 циклов, так как процессор перезапускается с новой последовательностью инструкции.
Следующая диаграмма иллюстрирует NOP, которые вставляются, чтобы избежать опасности ALU (только мы не избегаем опасности нагрузки). Если сделано так, это будет стоить 2 циклов ..
Опять же, мы предполагаем, что зарегистрированная единица имеет внутреннюю переадресацию, чтобы он мог выводить значение записи записи в том же цикле (здесь t + 5) при использовании следующей инструкции. Это правдоподобно, потому что в отличие от всех других этапов, этап WB Не должен вычислять какие-либо значения — Он должен хранить/копировать существующий, и эти операции намного быстрее, чем арифметические или доступ к памяти.
Если бы не тот случай, когда устройство регистрации имеет внутреннюю переадресацию, то третий NOP необходимо будет полностью избежать опасности ALU, показанной здесь.
Оригинал: «https://www.codementor.io/@erikeidt/pipelining-and-hazards-wjncsd2s0»