В компьютерной инженерии конвейеризация инструкций — это метод реализации параллелизма на уровне команд в одном процессоре. Конвейеризация пытается заставить каждую часть процессора быть занятой какой-либо инструкцией, разделяя входящие инструкции на серию последовательных шагов (одноименный « конвейер »), выполняемых разными процессорными модулями , при этом разные части инструкций обрабатываются параллельно.
В конвейерном компьютере инструкции проходят через центральный процессор (ЦП) поэтапно. Например, он может иметь один этап для каждого шага цикла фон Неймана : выборка инструкции, выборка операндов, выполнение инструкции, запись результатов. Конвейерный компьютер обычно имеет «конвейерные регистры» после каждого этапа. Они хранят информацию из инструкций и вычислений, чтобы логические элементы следующего этапа могли выполнить следующий шаг.
Такое расположение позволяет ЦП выполнять инструкцию в каждом такте. Обычно каскады с четными номерами работают на одном фронте прямоугольных импульсов, а каскады с нечетными номерами — на другом фронте. Это обеспечивает большую пропускную способность ЦП , чем многоцикловый компьютер при заданной тактовой частоте , но может увеличить задержку из-за дополнительных затрат на сам процесс конвейеризации. Кроме того, хотя электронная логика имеет фиксированную максимальную скорость, конвейерный компьютер можно сделать быстрее или медленнее, изменяя количество этапов в конвейере. При большем количестве каскадов каждый каскад выполняет меньше работы, поэтому каскад имеет меньше задержек от логических вентилей и может работать с более высокой тактовой частотой.
Конвейерная модель компьютера часто является наиболее экономичной, когда стоимость измеряется как логические элементы на инструкцию в секунду. В каждый момент времени инструкция находится только на одном этапе конвейера, и в среднем один этап конвейера обходится дешевле, чем многотактный компьютер. Кроме того, если все сделано правильно, большая часть конвейерной логики компьютера используется большую часть времени. Напротив, вышедшие из строя компьютеры обычно в любой момент времени имеют большое количество простаивающей логики. Подобные расчеты обычно показывают, что конвейерный компьютер использует меньше энергии на одну команду.
Однако конвейерный компьютер обычно сложнее и дороже, чем сопоставимый многоцикловый компьютер. Обычно он имеет больше логических элементов, регистров и более сложный блок управления. Подобным образом он может использовать больше общей энергии, но при этом использовать меньше энергии на команду. Неисправные процессоры обычно могут выполнять больше инструкций в секунду, поскольку они могут выполнять несколько инструкций одновременно.
В конвейерном компьютере блок управления обеспечивает запуск, продолжение и остановку потока по команде программы. Данные команд обычно передаются в регистрах конвейера от одного этапа к другому, с отдельной частью управляющей логики для каждого этапа. Блок управления также гарантирует, что инструкции на каждом этапе не вредят работе инструкций на других этапах. Например, если два этапа должны использовать один и тот же фрагмент данных, логика управления гарантирует, что использование выполняется в правильной последовательности.
При эффективной работе конвейерный компьютер будет иметь инструкцию на каждом этапе. Затем он работает над всеми этими инструкциями одновременно. Он может выполнить примерно одну инструкцию за каждый такт своего такта. Но когда программа переключается на другую последовательность инструкций, конвейер иногда должен отбросить обрабатываемые данные и перезапуститься. Это называется «стойло».
Большая часть конструкции конвейерного компьютера предотвращает помехи между этапами и уменьшает задержки.
Количество зависимых шагов зависит от архитектуры машины. Например:
Поскольку конвейер делается «глубже» (с большим количеством зависимых шагов), данный шаг может быть реализован с помощью более простой схемы, что может позволить тактовой частоте процессора работать быстрее. [3] Такие трубопроводы можно назвать супертрубопроводами. [4]
Процессор называется полностью конвейерным , если он может получать инструкции в каждом цикле. Таким образом, если некоторые инструкции или условия требуют задержек, препятствующих выборке новых инструкций, процессор не является полностью конвейерным.
Основополагающее использование конвейерной обработки было в проекте ILLIAC II и проекте IBM Stretch , хотя простая версия использовалась ранее в Z1 в 1939 году и Z3 в 1941 году . [5]
Конвейерная обработка всерьез началась в конце 1970-х годов в суперкомпьютерах , таких как векторные процессоры и процессоры массивов. [ нужна цитация ] Одним из первых суперкомпьютеров была серия Cyber, созданная Control Data Corporation. Его главный архитектор, Сеймур Крей , позже возглавил Cray Research. Крэй разработал линейку суперкомпьютеров XMP, использующую конвейерную обработку как для функций умножения, так и для функций сложения/вычитания. Позже Star Technologies добавила параллелизм (несколько конвейерных функций, работающих параллельно), разработанный Роджером Ченом. В 1984 году Star Technologies добавила конвейерную схему деления, разработанную Джеймсом Брэдли. К середине 1980-х годов конвейерная обработка использовалась многими различными компаниями по всему миру. [ нужна цитата ]
Конвейерная обработка не ограничивалась суперкомпьютерами. В 1976 году мэйнфрейм общего назначения серии 470 корпорации Amdahl имел 7-ступенчатый конвейер и запатентованную схему прогнозирования ветвей. [ нужна цитата ]
Модель последовательного выполнения предполагает, что каждая инструкция завершается до начала следующей; это предположение неверно для конвейерного процессора. Ситуация, когда ожидаемый результат является проблематичным, называется опасностью . Представьте себе следующие две инструкции регистрации для гипотетического процессора:
1: добавить 1 к R52: скопировать R5 в R6
Если процессор имеет 5 шагов, перечисленных на исходной иллюстрации («Базовый пятиэтапный конвейер» в начале статьи), инструкция 1 будет выбрана в момент времени t 1 и ее выполнение будет завершено в момент t 5 . Инструкция 2 будет получена в момент времени 2 и будет завершена в момент времени 6 . Первая инструкция может поместить увеличенное число в R5 на пятом этапе (обратная запись регистра) в момент t 5 . Но вторая инструкция может получить номер из R5 (для копирования в R6) на втором этапе (декодирование инструкции и выборка регистра) в момент времени t 3 . Кажется, что к тому времени первая инструкция не увеличила бы значение. Приведенный выше код вызывает опасность.
Написание компьютерных программ на компилируемом языке может не вызывать этих проблем, поскольку компилятор может быть спроектирован так, чтобы генерировать машинный код, избегающий опасностей.
В некоторых ранних процессорах DSP и RISC документация советует программистам избегать таких зависимостей в соседних и почти соседних инструкциях (называемых слотами задержки ) или заявляет, что вторая инструкция использует старое значение, а не желаемое значение (в приведенном выше примере процессор может нелогично скопировать неувеличенное значение) или объявляет, что используемое им значение не определено. У программиста может быть несвязанная работа, которую в это время может выполнять процессор; или, чтобы гарантировать правильные результаты, программист может вставлять NOP в код, частично сводя на нет преимущества конвейерной обработки.
Конвейерные процессоры обычно используют три метода для правильной работы, когда программист предполагает, что каждая инструкция завершается до начала следующей:
Ответвление от обычной последовательности команд часто сопряжено с опасностью. Если процессор не сможет выполнить ветвь за один временной цикл, конвейер продолжит последовательную выборку инструкций. Таким инструкциям нельзя позволить вступить в силу, поскольку программист переключил управление на другую часть программы.
Условное ветвление еще более проблематично. Процессор может разветвляться, а может и не разветвляться, в зависимости от еще не выполненных вычислений. Различные процессоры могут остановиться, попытаться предсказать ветвление и начать выполнять две разные программные последовательности ( активное выполнение ), каждая из которых предполагает, что ветвь выбрана или нет, отбрасывая всю работу, связанную с неправильным предположением. [а]
Процессор с реализацией предсказания ветвления, который обычно делает правильные предсказания, может минимизировать снижение производительности из-за ветвления. Однако если ветки прогнозируются плохо, это может создать дополнительную работу для процессора, например, сбросить из конвейера неправильный путь кода, выполнение которого началось, прежде чем возобновить выполнение в правильном месте.
Программы, написанные для конвейерного процессора, намеренно избегают ветвления, чтобы минимизировать возможную потерю скорости. Например, программист может обрабатывать обычный случай последовательным выполнением и переходить только при обнаружении необычных случаев. Использование таких программ, как gcov , для анализа покрытия кода позволяет программисту измерить, как часто на самом деле выполняются отдельные ветки, и получить представление о том, как оптимизировать код. В некоторых случаях программист может обрабатывать как обычный случай, так и необычный случай с кодом без ветвей .
Справа показан общий конвейер с четырьмя этапами: выборка, декодирование, выполнение и обратная запись. Верхнее серое поле — это список инструкций, ожидающих выполнения, нижнее серое поле — это список инструкций, выполнение которых завершено, а среднее белое поле — это конвейер.
Исполнение следующее:
Конвейерный процессор может бороться с опасностями, останавливаясь и создавая пузыри в конвейере, что приводит к одному или нескольким циклам, в которых ничего полезного не происходит.
На иллюстрации справа в цикле 3 процессор не может декодировать фиолетовую инструкцию, возможно, потому, что процессор определяет, что декодирование зависит от результатов, полученных в результате выполнения зеленой инструкции. Зеленая инструкция может перейти к этапу выполнения, а затем к этапу обратной записи, как запланировано, но фиолетовая инструкция приостанавливается на один цикл на этапе выборки. Синяя инструкция, которая должна была быть получена во время цикла 3, остановлена на один такт, как и красная инструкция после нее.
Из-за пузырька (синие овалы на рисунке) схема декодирования процессора простаивает во время цикла 3. Его схема выполнения простаивает во время цикла 4, а схема обратной записи простаивает во время цикла 5.
Когда пузырь выходит из конвейера (в цикле 6), возобновляется нормальное выполнение. Но сейчас все происходит с опозданием на один цикл. Для полного выполнения четырех инструкций, показанных цветом, потребуется 8 циклов (циклы с 1 по 8), а не 7. [б]