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

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

Пример

На иллюстрации показан простой пятиуровневый конвейер в RISC-процессорах. Здесь: IF () — получение инструкции, ID () — раскодирование инструкции, EX () — выполнение, MEM () — доступ к памяти, WB () — запись в регистр. Вертикальная ось — последовательные независимые инструкции, горизонтальная — время. Зелёная колонка показывает состояние процессора в один момент времени, в ней самая ранняя, верхняя инструкция уже находится в состоянии записи в регистр, а самая последняя, нижняя инструкция — только в процессе чтения.

Терминология арифметический конвейер (arithmetic pipeline) — реализация в АЛУ поэтапного исполнения арифметических операций чаще всего над вещественными числами супер-конвейер, гипер-конвейер, глубокий конвейер (super-pipeline, hyper-pipeline, deep pipeline) — вычислительный конвейер с необычно большим количеством стадий. Например, процессор Intel Pentium 4 имел 20 стадий конвейера, а в модификации Prescott получил конвейер из 31 стадииGlaskowsky, Peter N. Prescott Pushes Pipelining Limits // Microprocessor Report, 2 February 2004. недозагруженный конвейер (underutilized pipeline) — конвейер, в котором в одно и то же время не все стадии конвейера выполняют какую-то операцию. Например ранние процессоры MIPS имели 6-стадийный конвейер, но в каждый момент было задействовано только 3 его стадии.

История Сам термин «конвейер» пришёл из промышленности, где используется подобный принцип работы — материал автоматически подтягивается по ленте конвейера к рабочему, который осуществляет с ним необходимые действия, следующий за ним рабочий выполняет свои функции над получившейся заготовкой, следующий делает ещё что-то. Таким образом, к концу конвейера цепочка рабочих полностью выполняет все поставленные задачи, сохраняя высокий темп производства. Например, если на самую медленную операцию затрачивается одна минута, то каждая деталь будет сходить с конвейера через одну минуту. В процессорах роль рабочих исполняют функциональные модули, входящие в состав процессора.

Простейшая форма совмещения выполнения инструкций во времени была реализована в машине «Z3» Конрада Цузе в 1941 году.

Ламповая малая ЭЦВМ «Урал» (1957 год, СССР) имела двухступенчатый конвейер операций.

Многостадийные конвейеры в современном представлении были реализованы в машине Анатолия Ивановича Китова , UNIVAC LARC (1960 год, США), IBM Stretch (1961 год, США), Atlas (1962 год, Великобритания) и БЭСМ-6 (1967 год, СССР). В проекте IBM Stretch были предложены термины «выборка» (), «декодирование» () и «выполнение» (), которые затем стали общеупотребительными.

Связь между сложностью конвейера и тактовой частотой процессора

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

Например, простейший конвейер RISC-процессоров можно представить пятью стадиями с наборами триггеров между стадиями:

получение инструкции (); декодирование инструкции () и чтение регистров (); выполнение (); доступ к памяти (); запись в регистр ().

Конфликты конвейера Ситуации, называемые (), препятствуют выполнению очередной команды из потока команд в предназначенном для неё такте. Конфликты уменьшают реальное ускорение в производительности конвейерной обработки и могут вызвать необходимость остановки конвейера. Для разрешения конфликта нужно, чтобы некоторые команды в конвейере могли продолжать выполняться, в то время как другие были задержаны.

Существует три класса конфликтовMorgan Kaufmann Publishers, Computer Organization and Design, David A. Patterson & John L. Hennessy, Edition 3, ISBN 1-55860-604-1, page 738.

Структурные конфликты Структурные конфликты возникают из-за конфликтов ресурсов, когда аппаратура не может поддерживать все возможные комбинации одновременно выполняемых командMorgan Kaufmann Publishers, Computer Organization and Design, David A. Patterson & John L. Hennessy, Edition 3, ISBN 1-55860-604-1, page 740. Если какая-то комбинация команд не может быть поддержана, то говорят, что процессор имеет структурный конфликт. Наиболее часто структурные конфликты происходят, когда некоторый функциональный блок не полностью конвейеризован. Например, некоторые процессоры совместно используют единый конвейер памяти для данных и команд. В результате, когда команда содержит обращение к памяти данных, она вступает в конфликт с обращением более поздней командой. Чтобы этот конфликт разрешался при обращении к памяти за данными, конвейер приостанавливается на один такт.

В качестве альтернативы такому структурному конфликту разработчик мог бы обеспечить отдельное обращение к памяти команд либо путём разбиения кэша на отдельные кэш команд и кэш данных, либо используя множество буферов, называемыми буферами команд для хранения команд, однако, этого не делается во избежание увеличения стоимости блокаMorgan Kaufmann Publishers, Computer Organization and Design, David A. Patterson & John L. Hennessy, Edition 3, ISBN 1-55860-604-1, page 743.

Конфликты по данным Конфликты по данным возникают, когда зависимость команды от результатов предыдущей проявляется при совмещении команд в конвейере. Данные конфликты происходят, когда конвейер изменяет порядок обращений считывания/записи к операндам так, что он отличается от порядка, который существует для последовательно выполняемых команд в процессоре без конвейера. Существует метод устранения конфликта по данным: (иногда называется bypass)Morgan Kaufmann Publishers, Computer Organization and Design, David A. Patterson & John L. Hennessy, Edition 3, ISBN 1-55860-604-1, page 745. К сожалению, не все потенциальные конфликты по данным можно обработать с помощью байпаса, в этом случае конвейер приостанавливается до разрешения конфликта.

Конфликты по управлению Конфликты по управлению возникают при конвейерном выполнении условных передач управления и других команд, которые изменяют значение программного счетчика. Существует много способов обработки остановки конвейера, вызванных задержкой передачи управления, но для глубоких конвейеров в основном используются агрессивные средстваMorgan Kaufmann Publishers, Computer Organization and Design, David A. Patterson & John L. Hennessy, Edition 3, ISBN 1-55860-604-1, page 756, такие как предсказания передач управления.

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

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

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

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

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

Недостатки: Бесконвейерный процессор исполняет только одну инструкцию за раз. Это предотвращает задержки веток инструкций (фактически каждая ветка задерживается), и проблемы, связанные с последовательными инструкциями, которые исполняются параллельно. Следовательно, схема такого процессора проще, и он дешевле для изготовления. Задержка инструкций в бесконвейерном процессоре слегка ниже, чем в конвейерном эквиваленте. Это происходит из-за того, что в конвейерный процессор должны быть добавлены дополнительные триггеры. У бесконвейерного процессора скорость обработки инструкций стабильна. Производительность конвейерного процессора предсказать намного сложнее, и она может значительно различаться в разных программах.

Примеры

Общий конвейер

Справа изображён общий конвейер с четырьмя стадиями работы: Получение () Раскодирование () Выполнение () Запись результата ()

Верхняя серая область — список инструкций, которые предстоит выполнить. Нижняя серая область — список инструкций, которые уже были выполнены. И средняя белая область является самим конвейером.

Выполнение происходит следующим образом: Цикл Действия 0 Четыре инструкции ожидают исполнения 1 Зелёная инструкция забирается из памяти 2 Зелёная инструкция раскодируется Фиолетовая инструкция забирается из памяти 3 Зелёная инструкция выполняется (то есть исполняется то действие, которое она кодировала) Фиолетовая инструкция раскодируется