В computing, конвейер, также известный как конвейер данных, представляет собой набор элементов обработки данных, соединенных последовательно, где выходной сигнал одного элемента является входом следующего. Элементы конвейера часто выполняются параллельно или с временным интервалом. Некоторое количество буферной памяти часто вставляется между элементами.
Связанные с компьютером конвейеры включают:
Некоторые операционные системы могут предоставлять UNIX-подобный синтаксис для нескольких строк программа выполняется в конвейере, но реализует последнее как простое последовательное выполнение, а не истинную конвейерную обработку, а именно, ожидая завершения каждой программы перед запуском следующей.
Конвейерная обработка - это широко используемое понятие в повседневной жизни. Например, на сборочной линии автомобильного завода каждая конкретная задача - такая как установка двигателя, установка капота и установка колес - часто выполняется на отдельном рабочем месте. Станции выполняют свои задачи параллельно, каждая на своем автомобиле. Как только автомобиль выполнил одно задание, он переезжает на следующую станцию. Различия во времени, необходимом для выполнения задач, можно компенсировать «буферизацией» (удерживание одной или нескольких машин в пространстве между станциями) и / или «остановкой» (временной остановкой вышестоящих станций) до тех пор, пока не станет доступна следующая станция..
Предположим, что для сборки одной машины требуется три задачи, которые занимают 20, 10 и 15 минут соответственно. Тогда, если бы все три задачи выполняла одна станция, завод выпускал бы одну машину каждые 45 минут. Используя трубопровод из трех станций, завод будет выпускать первую машину за 45 минут, а затем новую каждые 20 минут.
Как показывает этот пример, конвейерная обработка не уменьшает задержку, то есть общее время прохождения одного элемента через всю систему. Однако это увеличивает пропускную способность системы, то есть скорость, с которой новые элементы обрабатываются после первого.
Поскольку пропускная способность конвейера не может быть лучше, чем пропускная способность его самого медленного элемента, разработчик должен попытаться разделить работу и ресурсы между этапы, чтобы все они занимали одинаковое время для выполнения своих задач. В приведенном выше примере сборки автомобиля, если на каждую из трех задач требуется 15 минут вместо 20, 10 и 15 минут, задержка все равно будет 45 минут, но новая машина будет завершаться каждые 15 минут вместо 20.
В идеальных условиях, если все элементы обработки синхронизированы и для обработки требуется одинаковое количество времени, тогда каждый элемент может быть получен каждым элементом так же, как он был освобожден предыдущим один за один цикл clock. Таким образом, предметы будут течь по трубопроводу с постоянной скоростью, как волны в водном канале. В таких «волновых конвейерах» не требуется никакой синхронизации или буферизации между этапами, кроме хранилища, необходимого для элементов данных.
В более общем смысле, буферизация между этапами конвейера необходима, когда время обработки нерегулярно или когда элементы могут быть созданы или уничтожены вдоль конвейера. Например, в графическом конвейере, который обрабатывает треугольники для отображения на экране, элемент, который проверяет видимость каждого треугольника, может отбрасывать треугольник, если он невидим, или может выводить два или более треугольных фрагмента элемента, если они частично скрыто. Буферизация также необходима для устранения отклонений в скорости, с которой приложение подает элементы на первый этап и потребляет выходные данные последнего.
Буфер между двумя каскадами может быть просто аппаратным регистром с подходящей логикой синхронизации и сигнализации между двумя каскадами. Когда каскад A сохраняет элемент данных в регистре, он посылает сигнал «данные доступны» следующему каскаду B. После того, как B использует эти данные, он отвечает сигналом «данные получены» в A. Стадия A останавливается, ожидая для этого сигнала перед сохранением следующего элемента данных в регистре. Этап B останавливается, ожидая сигнала «данные доступны», если он готов обработать следующий элемент, но этап A еще не предоставил его.
Если время обработки элемента является переменным, весь конвейер может часто останавливаться, ожидая, пока этот элемент и все предыдущие элементы потребят элементы в своих входных буферах. Частоту таких остановок конвейера можно уменьшить, предоставив место для более чем одного элемента во входном буфере этого этапа. Такой буфер из нескольких элементов обычно реализуется как очередь «первым пришел - первым вышел». Стадия восходящего потока может все еще быть остановлена, когда очередь будет заполнена, но частота этих событий будет уменьшаться по мере предоставления большего количества буферных слотов. Теория организации очередей может определить количество необходимых буферных слотов в зависимости от изменчивости времени обработки и желаемой производительности.
Если какой-то этап занимает (или может занять) намного больше времени, чем другие, и не может быть ускорен, разработчик может предоставить два или более элемента обработки для выполнения этой задачи в параллельно, с одним буфером ввода и одним буфером вывода. Когда каждый элемент завершает обработку своего текущего элемента данных, он доставляет его в общий выходной буфер и берет следующий элемент данных из общего входного буфера. Примером этой концепции «нелинейного» или «динамического» конвейера являются магазины или банки, у которых есть два или более кассира, обслуживающих клиентов из одной очереди ожидания.
В некоторых приложениях обработка элемента Y на этапе A может зависеть от результатов или эффекта обработки предыдущего элемента X на более позднем этапе B конвейера. В этом случае этап A не может правильно обработать элемент Y, пока элемент X не очистит этап B.
Такая ситуация очень часто возникает в конвейерах команд. Например, предположим, что Y - арифметическая инструкция, которая считывает содержимое регистра, который должен был быть изменен более ранней инструкцией X. Пусть A будет этапом, на котором выполняется выборка команды операндов, а B будет этап, который записывает результат в указанный регистр. Если этап A пытается обработать инструкцию Y до того, как инструкция X достигнет этапа B, регистр может все еще содержать старое значение, и эффект Y будет неправильным.
Для правильной обработки таких конфликтов конвейер должен быть снабжен дополнительной схемой или логикой, которые обнаруживают их и предпринимают соответствующие действия. Стратегии для этого включают:
Конвейерная система обычно требует больше ресурсов (элементы схемы, блоки обработки, память компьютера и т. Д..), чем тот, который выполняет один пакет за раз, потому что его этапы не могут совместно использовать эти ресурсы, и потому что между элементами может потребоваться буферизация и дополнительная логика синхронизации.
Более того, передача элементов между отдельными элементами обработки может увеличить задержку, особенно для длинных конвейеров.
Дополнительные затраты на сложность конвейерной обработки могут быть значительными, если существуют зависимости между обработкой различных элементов, особенно если для их обработки используется стратегия предположения и возврата. Действительно, стоимость реализации этой стратегии для сложных наборов команд послужила причиной некоторых радикальных предложений по упрощению компьютерной архитектуры, таких как RISC и VLIW. Компиляторы также были обременены задачей переупорядочения машинных инструкций, чтобы улучшить производительность конвейеров команд.