stringtranslate.com

Конвейеризация инструкций

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

Концепция и мотивация

В конвейерном компьютере инструкции проходят через центральный процессор (ЦП) поэтапно. Например, он может иметь одну стадию для каждого шага цикла фон Неймана : выборка инструкции, выборка операндов, выполнение инструкции, запись результатов. Конвейерный компьютер обычно имеет «конвейерные регистры» после каждой стадии. Они хранят информацию из инструкции и вычислений, чтобы логические вентили следующей стадии могли выполнить следующий шаг.

Такая компоновка позволяет ЦП выполнять инструкцию на каждом такте. Обычно четные этапы работают на одном краю прямоугольного тактового сигнала, а нечетные — на другом. Это обеспечивает большую пропускную способность ЦП , чем многоцикловый компьютер при заданной тактовой частоте , но может увеличить задержку из-за дополнительных накладных расходов самого процесса конвейеризации. Кроме того, даже несмотря на то, что электронная логика имеет фиксированную максимальную скорость, конвейерный компьютер можно сделать быстрее или медленнее, изменяя количество этапов в конвейере. При большем количестве этапов каждый этап выполняет меньше работы, и поэтому этап имеет меньше задержек от логических вентилей и может работать на более высокой тактовой частоте.

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

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

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

При эффективной работе конвейерный компьютер будет иметь инструкцию на каждом этапе. Затем он работает над всеми этими инструкциями одновременно. Он может завершить около одной инструкции за каждый цикл своих часов. Но когда программа переключается на другую последовательность инструкций, конвейер иногда должен сбросить данные в процессе и перезапуститься. Это называется «задержка».

Большая часть конструкции конвейерного компьютера предотвращает помехи между ступенями и сокращает простои.

Количество ступеней

Количество зависимых шагов зависит от архитектуры машины. Например:

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

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

История

Конвейеризация впервые была использована в проектах ILLIAC II и IBM Stretch , хотя более простая версия использовалась ранее в Z1 в 1939 году и Z3 в 1941 году. [5]

Конвейеризация началась всерьез в конце 1970-х годов в суперкомпьютерах, таких как векторные процессоры и матричные процессоры. [ необходима цитата ] Одним из первых суперкомпьютеров была серия Cyber, созданная Control Data Corporation. Ее главный архитектор, Сеймур Крэй , позже возглавил Cray Research. Cray разработала линейку суперкомпьютеров XMP, используя конвейеризацию как для функций умножения, так и для функций сложения/вычитания. Позже Star Technologies добавила параллелизм (несколько конвейерных функций, работающих параллельно), разработанный Роджером Ченом. В 1984 году Star Technologies добавила конвейерную схему деления, разработанную Джеймсом Брэдли. К середине 1980-х годов конвейеризация использовалась многими различными компаниями по всему миру. [ необходима цитата ]

Конвейеризация не ограничивалась суперкомпьютерами. В 1976 году универсальная ЭВМ серии 470 корпорации Amdahl имела 7-шаговый конвейер и запатентованную схему предсказания ветвлений. [ необходима цитата ]

Опасности

Модель последовательного выполнения предполагает, что каждая инструкция завершается до начала следующей; это предположение неверно для конвейерного процессора. Ситуация, когда ожидаемый результат проблематичен, известна как опасность . Представьте себе следующие две регистровые инструкции для гипотетического процессора:

1: добавить 1 к R52: копировать R5 в R6

Если процессор имеет 5 шагов, перечисленных в начальной иллюстрации («Базовый пятиступенчатый конвейер» в начале статьи), инструкция 1 будет извлечена в момент времени t 1 , а ее выполнение будет завершено в момент времени t 5 . Инструкция 2 будет извлечена в момент времени t 2 и будет завершена в момент времени t 6 . Первая инструкция может поместить увеличенное число в R5 в качестве своего пятого шага (обратная запись регистра) в момент времени t 5 . Но вторая инструкция может получить число из R5 (для копирования в R6) на своем втором шаге (декодирование инструкции и выборка регистра) в момент времени t 3 . Похоже, что первая инструкция не увеличила бы значение к тому времени. Приведенный выше код вызывает опасность.

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

Обходные пути

В некоторых ранних процессорах DSP и RISC документация советует программистам избегать таких зависимостей в смежных и почти смежных инструкциях (называемых слотами задержки ), или объявляет, что вторая инструкция использует старое значение, а не желаемое (в примере выше процессор может нелогично скопировать неувеличенное значение), или объявляет, что используемое им значение не определено. У программиста может быть несвязанная работа, которую процессор может выполнить в это время; или, чтобы обеспечить правильные результаты, программист может вставлять NOP в код, частично сводя на нет преимущества конвейеризации.

Решения

Конвейерные процессоры обычно используют три метода для работы, как ожидается, когда программист предполагает, что каждая инструкция завершается до начала следующей:

Филиалы

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

Условный переход еще более проблематичен. Процессор может перейти или не перейти в зависимости от вычисления, которое еще не произошло. Различные процессоры могут останавливаться, могут пытаться предсказывать переходы и могут начать выполнять две разные последовательности программ ( жадное выполнение ), каждая из которых предполагает, что переход выполнен или нет, отбрасывая всю работу, которая относится к неправильному предположению. [a]

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

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

Особые ситуации

Самоизменяющиеся программы
Метод самомодифицирующегося кода может быть проблематичным на конвейерном процессоре. В этом методе одним из эффектов программы является изменение ее собственных предстоящих инструкций. Если процессор имеет кэш инструкций , исходная инструкция, возможно, уже была скопирована в очередь предварительной выборки входных данных , и изменение не вступит в силу. Некоторые процессоры, такие как Zilog Z280, могут настраивать свою кэш-память на кристалле для выборки только данных или как часть своего обычного адресного пространства памяти и избегать таких трудностей с самомодифицирующимися инструкциями.
Непрерывные инструкции
Инструкция может быть непрерываемой, чтобы гарантировать ее атомарность , например, когда она меняет местами два элемента. Последовательный процессор допускает прерывания между инструкциями, но конвейерный процессор перекрывает инструкции, поэтому выполнение непрерываемой инструкции делает части обычных инструкций также непрерываемыми. Ошибка комы Cyrix зависала бы одноядерной системе, используя бесконечный цикл, в котором непрерываемая инструкция всегда находилась в конвейере.

Конструктивные соображения

Скорость
Конвейеризация занимает все части процессора и увеличивает объем полезной работы, которую процессор может выполнить за определенное время. Конвейеризация обычно сокращает время цикла процессора и увеличивает пропускную способность инструкций. Преимущество в скорости уменьшается в той степени, в которой выполнение сталкивается с опасностями, требующими замедления выполнения ниже идеальной скорости. Неконвейерный процессор выполняет только одну инструкцию за раз. Начало следующей инструкции задерживается не на основе опасностей, а безусловно.
Необходимость конвейерного процессора организовывать всю свою работу в модульные шаги может потребовать дублирования регистров, что увеличивает задержку некоторых инструкций.
Экономика
Упрощая каждый зависимый шаг, конвейеризация может позволить выполнять сложные операции более экономично, чем добавление сложных схем, например, для числовых вычислений. Однако процессор, который отказывается от повышения скорости с помощью конвейеризации, может быть проще и дешевле в производстве.
Предсказуемость
По сравнению со средами, где программисту необходимо избегать или обходить опасности, использование неконвейерного процессора может облегчить программирование и обучение программистов. Неконвейерный процессор также облегчает прогнозирование точного времени заданной последовательности инструкций.

Иллюстрированный пример

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

Исполнение следующее:

Универсальный 4-ступенчатый конвейер; цветные прямоугольники представляют собой независимые друг от друга инструкции.

Пузырь трубопровода

Пузырь в цикле 3 задерживает исполнение.

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

На иллюстрации справа в цикле 3 процессор не может декодировать фиолетовую инструкцию, возможно, потому что процессор определяет, что декодирование зависит от результатов, полученных при выполнении зеленой инструкции. Зеленая инструкция может перейти на этап Execute, а затем на этап Write-back, как и было запланировано, но фиолетовая инструкция останавливается на один цикл на этапе Fetch. Синяя инструкция, которая должна была быть извлечена во время цикла 3, останавливается на один цикл, как и красная инструкция после нее.

Из-за пузырька (синие овалы на иллюстрации) схема декодирования процессора простаивает во время цикла 3. Его схема выполнения простаивает во время цикла 4, а схема обратной записи простаивает во время цикла 5.

Когда пузырек выходит из конвейера (на цикле 6), возобновляется нормальное выполнение. Но теперь все отстает на один цикл. Для полного выполнения четырех инструкций, показанных цветами, потребуется 8 циклов (циклы с 1 по 8) вместо 7. [b]

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

Примечания

  1. ^ Ранние конвейерные процессоры без какой-либо из этих эвристик, такие как процессор PA-RISC компании Hewlett-Packard , справлялись с опасностями, просто предупреждая программиста; в этом случае, что одна или несколько инструкций, следующих за ветвью, будут выполнены независимо от того, была ли сделана ветвь. Это могло быть полезно; например, после вычисления числа в регистре, условный переход мог следовать за загрузкой в ​​регистр значения, более полезного для последующих вычислений как в случае ветвления, так и в случае отсутствия ветвления.
  2. ^ Однако следует отметить, что даже при наличии пузыря процессор все равно способен — по крайней мере, в этом случае — выполнять последовательность инструкций гораздо быстрее, чем это мог бы сделать неконвейерный процессор.

Ссылки

  1. ^ Гласковски, Питер (18 августа 2003 г.). «Xelerated's Xtraordinary NPU — World's First 40Gb/s Packet Processor Has 200 CPUs». Microprocessor Report . 18 (8): 12–14 . Получено 20 марта 2017 г.
  2. ^ «Xelerated привносит программируемую технологию 40 Гбит/с в массовый Ethernet». 31 мая 2003 г.
  3. ^ Джон Пол Шен, Микко Х. Липасти (2004). Современный дизайн процессора. МакГроу-Хилл Профессионал . ISBN 9780070570641.
  4. ^ Сунгу Ли (2000). Проектирование компьютеров и других сложных цифровых устройств. Prentice Hall . ISBN 9780130402677.
  5. ^ Рохас, Рауль (апрель–июнь 1997 г.). «Наследие Конрада Цузе: архитектура Z1 и Z3» (PDF) . IEEE Annals of the History of Computing . 19 (2): 5–16. doi :10.1109/85.586067. Архивировано (PDF) из оригинала 03.07.2022 . Получено 03.07.2022 .(12 страниц)
  6. ^ "CMSC 411 Lecture 19, Pipelining Data Forwarding". Университет Мэриленда, округ Балтимор, факультет компьютерных наук и электротехники . Получено 22.01.2020 .
  7. ^ "Высокопроизводительные вычисления, заметки класса 11". hpc.serc.iisc.ernet.in. Сентябрь 2000. Архивировано из оригинала 2013-12-27 . Получено 2014-02-08 .

Внешние ссылки