Вычислительный конвейер
Трубопроводная обвязка инструкций - это метод, используемый при проектировании современных микропроцессоров, микроконтроллеров и ЦПУ для увеличения их пропускной способности (количества инструкций, которое может быть выполнено за единицу времени).
Основная идея состоит в том, чтобы разделить (так называемый "split") обработку команды процессора, как она определена командным микрокодом, на серию независимых шагов микроопераций (также называемых "микроинструкциями", "микро-оп" или "µop"), с хранением в конце каждого шага. Это позволяет логике управления ЦПУ обрабатывать инструкции со скоростью самого медленного шага, которая значительно быстрее, чем время, необходимое для обработки инструкции в один шаг.
Термин "трубопровод" относится к тому факту, что каждая ступень несет одну микроинструкцию (как капля воды), и каждая ступень связана с другой ступенью (аналогия; аналогично водопроводным трубам).
Большинство современных процессоров управляются часами. ЦП состоит из внутренней логики и памяти (флип-флопс). Когда поступает тактовый сигнал, флопы флипа сохраняют свое новое значение, затем логика требует определенного периода времени для декодирования новых значений флопов флипа. Затем приходит следующий тактовый импульс, и дискеты флипа сохраняют другие значения, и так далее. Разбивая логику на мелкие кусочки и вставляя флопы между кусочками логики, уменьшается время, требуемое логикой (для декодирования значений до генерации корректных выходов в зависимости от этих значений). Таким образом можно сократить период времени.
Например, трубопровод RISC разбивается на пять ступеней с набором флип-флоп между каждой ступенью следующим образом:
- Формуляр инструкции
- Декодирование инструкций и извлечение регистра
- Выполнить
- Доступ к памяти
- Зарегистрируйся, напиши в ответ
Процессоры с трубной обвязкой состоят из внутренних стадий (модулей), которые могут полунезависимо работать над отдельными микроинструкциями. Каждая ступень соединяется перекидными флопами со следующей ступенью (подобно "цепочке"), так что выход ступени является входом в другую ступень до тех пор, пока не будет выполнена работа над инструкциями по обработке. Такая организация внутренних модулей процессора сокращает общее время обработки инструкции.
Не трубопроводная архитектура не так эффективна, так как некоторые процессорные модули простаивают, в то время как другой модуль активен во время цикла команд. Трубопроводная архитектура не полностью устраняет время простоя в работающем процессоре, но заставляя процессорные модули работать параллельно, увеличивает пропускную способность инструкций.
Считается, что трубопровод для инструктажа полностью укомплектован, если он может принимать новую инструкцию каждый часовой цикл. Трубопровод, который не полностью отфрезерован, имеет циклы ожидания, которые задерживают ход трубопровода.
Основной пятиступенчатый конвейер в машине RISC (IF = Сбор инструкций, ID = Декодирование инструкций, EX = Выполнение, MEM = Доступ к памяти, WB = Регистрация обратной записи). Вертикальная ось - последовательные инструкции, горизонтальная ось - время. Поэтому в зеленом столбце самая ранняя команда находится на этапе WB, а самая последняя проходит процедуру извлечения команд.
Преимущества и недостатки трубопроводов
Преимущества Трубопроводов:
- Сокращается время цикла процессора; увеличивается пропускная способность команд. Трубопровод не уменьшает время выполнения команды, а увеличивает количество одновременно обрабатываемых команд ("сразу") и уменьшает задержку между завершёнными командами (так называемая "пропускная способность").
Чем больше этапов трубопровода у процессора, тем больше команд он может обрабатывать "сразу" и тем меньше задержки между завершёнными командами. Каждый доминирующий микропроцессор
общего назначения, выпускаемый сегодня, использует не менее 2-х ступеней трубопровода до 30 или 40 ступеней. - При использовании трубопроводов арифметический логический блок ЦПУ может быть спроектирован быстрее, но будет сложнее.
- Теоретически прокладка трубопровода увеличивает производительность по однотрубному ядру в несколько раз (в предположении, что тактовая частота также увеличивается в один и тот же фактор), и код идеально подходит для выполнения трубопровода.
- Трубопроводные процессоры, как правило, работают на более высокой тактовой частоте, чем тактовая частота ОЗУ (по состоянию на 2008 год технологии ОЗУ работали на низких частотах по сравнению с частотами ЦП), что повышает общую производительность компьютеров.
Недостатки трубопроводов:
Pipelining имеет много недостатков, хотя проектировщики CPU и компиляторов используют множество методик для преодоления большинства из них; ниже приведен список распространенных недостатков:
- Конструкция непипериодического процессора проще и дешевле в производстве, непипериодический процессор выполняет только одну инструкцию за раз. Это предотвращает задержки ветвей (в Pipelining каждая ветвь задерживается), а также проблемы при одновременном выполнении последовательных инструкций.
- В трубчатом процессоре вставка флипс флопов между модулями увеличивает задержку обучения по сравнению с не трубчатым процессором.
- Непипериодический процессор будет иметь заданную пропускную способность команд. Производительность конвейерного процессора гораздо сложнее предсказать и может сильно отличаться для разных программ.
- Многие проекты включают трубопроводы длиной до 7, 10, 20, 31 и даже больше стадий; недостатком длинного трубопровода является то, что при разветвлении программы весь трубопровод должен быть промыт (очищен). Более высокая пропускная способность конвейеров падает, когда исполняемый код содержит много ветвей: процессор не может заранее знать, где прочитать следующую инструкцию, и должен ждать, пока инструкция по ветвям закончится, оставляя конвейер пустым. Этот недостаток можно уменьшить, предсказывая, будет ли условная инструкция ветки ветвиться на основе предыдущей активности. После того, как ответвление разрешено, следующая инструкция должна пройти весь путь через конвейер, прежде чем её результат станет доступен, и процессор возобновит "работу" снова. В таких экстремальных случаях производительность конвейерного процессора может быть хуже, чем у не конвейерного.
- К сожалению, не все инструкции независимы. В простом трубопроводе для выполнения инструкции может потребоваться 5 этапов. Чтобы работать на полную мощность, на этом трубопроводе необходимо будет выполнить 4 последующие независимые инструкции, пока заполняется первая. Любая из этих 4 инструкций может зависеть от результатов первой инструкции, что заставляет логику управления конвейером ждать и вставлять в конвейер остановку или тратить время впустую до тех пор, пока зависимость не будет устранена. К счастью, такие методы, как переадресация, могут значительно сократить случаи, когда требуется остановка.
- Самоизменяющиеся программы могут не выполняться должным образом на конвейерной архитектуре, когда изменяемые инструкции находятся рядом с выполняемыми. Это может быть вызвано тем, что инструкции могут уже находиться в очереди ввода предварительной выборки, поэтому модификация может не вступить в силу для предстоящего выполнения инструкций. Кэш инструкций делает проблему еще хуже.
- Опасности: Когда программист (или компилятор) пишет ассемблерный код, они обычно предполагают, что каждая инструкция выполняется до того, как выполняется следующая. Когда это предположение не подтверждается обвязкой, это приводит к некорректному поведению программы, ситуация называется опасной. Существуют
различные методы устранения опасностей или работы с ними, такие как переадресация и задержка (путем вставки стойла или потерянного тактового генератора).
Примеры
Общий трубопровод
Справа - общий трубопровод с четырьмя ступенями:
- Получить
- Декодировать
- Выполнить
- Написать обратно
Верхняя серая рамка - это список инструкций, ожидающих выполнения; нижняя серая рамка - это список инструкций, которые были выполнены, а средняя белая рамка - это трубопровод.
Казнь выглядит следующим образом:
Время | Исполнение |
0 | Четыре инструкции ожидают выполнения |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | Все инструкции выполнены |
Пузырь
Когда происходит "икота" (прерывание) в выполнении, в трубопроводе создается "пузырь", в котором ничего полезного не происходит. Во втором цикле получение фиолетовой команды задерживается, а в третьем цикле на этапе декодирования появляется пузырек. Все, что находится за фиолетовой командой, также задерживается, но все, что находится перед фиолетовой командой, продолжает выполняться.
Очевидно, что по сравнению с исполнением, приведенным выше, пузырь дает общее время исполнения 8 часов тиков вместо 7.
Пузырьки похожи на киоски (задержки), в которых ничего полезного не произойдет для получения, декодирования, выполнения и обратной записи. Это как NOP (сокращение от No OPeration) код.
Пример 1
Типичной инструкцией для добавления двух чисел может быть ADD A, B, C
, который добавляет значения, найденные в ячейках памяти A и B, а затем помещает результат в ячейку памяти C. В конвейерном процессоре контроллер разбивает это на ряд задач, похожих на эти:
Места 'R1' и 'R2' - это регистры в процессоре. Значения, хранящиеся в ячейках памяти с метками 'A' и 'B', загружаются (копируются) в эти регистры, затем добавляются, и результат сохраняется в ячейке памяти с меткой 'C'.
В данном примере трубопровод представляет собой три этапа длительной загрузки, выполнения и хранения. Каждый из этапов называется этапами трубопровода.
На непипелинированном процессоре может работать только один этап за раз, поэтому вся инструкция должна быть завершена до того, как может начаться следующая. На конвейерном процессоре все стадии могут работать одновременно по разным инструкциям. Поэтому, когда эта команда находится на этапе выполнения, вторая команда будет на этапе декодирования, а третья - на этапе извлечения.
Пример 2
Чтобы лучше понять концепцию, можно посмотреть на теоретический трехступенчатый трубопровод:
Этап | Описание |
Загрузить | Чтение инструкций из памяти |
Выполнить | выполнить инструкцию |
Магазин | Хранить результат в памяти и/или регистрах |
и псевдокодовый список сборки, который должен быть выполнен:
Вот как это будет исполнено:
Часы 1 | ||
Загрузить | Выполнить | Магазин |
LOAD |
|
|
Команда LOAD извлекается из памяти.
Часы 2 | ||
Загрузить | Выполнить | Магазин |
MOVE | LOAD |
|
Команда LOAD выполняется, а команда MOVE забирается из памяти.
Часы 3 | ||
Загрузить | Выполнить | Магазин |
ADD | MOVE | LOAD |
Команда LOAD находится в стадии Store, где ее результат (номер 40) будет сохранен в регистре A. Тем временем, команда MOVE выполняется. Так как она должна переместить содержимое A в B, она должна дождаться окончания LOAD-инструкции.
Часы 4 | ||
Загрузить | Выполнить | Магазин |
ИСТОРИЯ | ADD | MOVE |
Команда STORE загружается, в то время как команда MOVE заканчивается, а ADD вычисляется.
И так далее. Обратите внимание, что иногда команда будет зависеть от результата другой команды (как в нашем примере MOVE). Когда несколько команд ссылаются на конкретное место для операнда, либо читая его (как вход), либо записывая (как выход), выполнение этих команд в порядке, отличном от исходного порядка программы, может привести к опасной ситуации (упомянутой выше).
Пузырь в цикле 3 задерживает выполнение
Общий 4-ступенчатый трубопровод; цветные коробки представляют собой независимые друг от друга инструкции
Связанные страницы
- Трубопровод (вычислительная техника)
- Параллельные вычисления
- Параллелизм на уровне инструкций
Вопросы и ответы
В: Что такое конвейеризация инструкций?
О: Конвейерная обработка инструкций - это техника, используемая в конструкции современных микропроцессоров, микроконтроллеров и центральных процессоров для увеличения пропускной способности их инструкций путем разделения обработки инструкции процессора на ряд независимых шагов с сохранением в конце каждого шага.
В: Как работает конвейеризация?
О: Конвейерная обработка работает путем разбиения логики на более мелкие части и вставки флип-флопов между частями логики, что уменьшает время, необходимое логике для декодирования значений до генерации действительных выходов в зависимости от этих значений. Это позволяет ускорить тактовые периоды.
В: Каковы некоторые примеры конвейеров?
О: Примером конвейера является конвейер RISC, который разбит на пять этапов с набором флип-флопов между каждым этапом.
В: Как конвейеризация увеличивает пропускную способность команд?
О: Конвейерная обработка увеличивает пропускную способность команд, позволяя модулям процессора работать параллельно, что уменьшает время простоя во время цикла выполнения команд и увеличивает общее время обработки.
В: Каждый ли конвейер полностью конвейеризован?
О: Нет, не все конвейеры полностью конвейерные; некоторые конвейеры имеют циклы ожидания, которые задерживают продвижение по конвейеру.