Введение

Метод повышения параллелизма уровня инструкций + базовый пятиступенчатый конвейер 1 2 3 4 5 6 71IFIDEX MEMWB2IFID EXMEMWB3IF IDEXMEMWB4 IFIDEXMEM5 IFIDEX (IF = выборка инструкции, ID = декодирование инструкции, EX = выполнение, MEM = доступ к памяти, WB = запись результата в регистр). В четвертом такте (зелёная колонка) самая ранняя инструкция находится на стадии MEM, а последняя ещё не вошла в конвейер. В компьютерной инженерии, конвейеризация инструкций – это техника реализации параллелизма уровня инструкций в пределах одного процессора. Конвейеризация стремится занять все части процессора выполнением инструкций, разделяя входящие инструкции на последовательность этапов (так называемый "конвейер"), выполняемых различными блоками процессора с параллельной обработкой разных частей инструкций.

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

В конвейерном компьютере инструкции проходят через центральный процессор (ЦП) последовательно, по стадиям. Например, может быть выделена отдельная стадия для каждого этапа цикла фон Неймана: выборка инструкции, выборка операндов, выполнение инструкции, запись результатов. Конвейерный компьютер обычно имеет "регистры конвейера" после каждой стадии. Они хранят информацию из инструкции и промежуточные результаты вычислений, чтобы логические элементы следующей стадии могли выполнить следующий шаг. Такая организация позволяет ЦП завершать выполнение одной инструкции за каждый тактовый цикл. Часто четные стадии работают на одном фронте прямоугольного тактового сигнала, а нечетные – на другом. Это обеспечивает более высокую пропускную способность ЦП по сравнению с многотактным компьютером при той же тактовой частоте, но может увеличить задержку из-за дополнительных накладных расходов, связанных с самим процессом конвейеризации. Кроме того, хотя электронная логика имеет фиксированную максимальную скорость, конвейерный компьютер можно ускорить или замедлить, изменяя количество стадий в конвейере. Чем больше стадий, тем меньше работы выполняет каждая стадия, что снижает задержки, вносимые логическими элементами, и позволяет использовать более высокую тактовую частоту. Конвейерная модель компьютера часто является наиболее экономичной, если стоимость измеряется в количестве логических элементов на инструкцию в секунду. В любой момент времени инструкция находится только на одной стадии конвейера, а в среднем стоимость одной стадии конвейера ниже, чем стоимость многотактного компьютера. Более того, при правильной реализации большая часть логики конвейерного компьютера используется большую часть времени. В отличие от этого, в компьютерах с внеочередным выполнением обычно имеется значительный объем неиспользуемой логики в любой момент времени. Схожие расчеты обычно показывают, что конвейерный компьютер потребляет меньше энергии на инструкцию. Однако конвейерный компьютер обычно сложнее и дороже, чем сопоставимый многотактный компьютер. Как правило, он содержит больше логических элементов, регистров и имеет более сложный блок управления. Соответственно, он может потреблять больше общей энергии, при этом потребляя меньше энергии на инструкцию. Процессоры с внеочередным выполнением обычно могут выполнять больше инструкций в секунду, поскольку они могут выполнять несколько инструкций одновременно. В конвейерном компьютере блок управления обеспечивает запуск, продолжение и остановку потока выполнения команд программы. Данные инструкций обычно передаются из регистра в регистр между стадиями конвейера, при этом для каждой стадии предусмотрена отдельная логика управления. Блок управления также гарантирует, что выполнение инструкции на одной стадии не нарушит работу инструкций на других стадиях. Например, если двум стадиям требуется использовать один и тот же фрагмент данных, логика управления обеспечивает их использование в правильной последовательности. При эффективной работе конвейерный компьютер содержит инструкцию на каждой стадии. Таким образом, он одновременно работает над всеми этими инструкциями. Он может завершить примерно одну инструкцию за каждый цикл тактового сигнала. Однако при переключении программы на другую последовательность инструкций конвейеру иногда приходится отбрасывать обрабатываемые данные и перезапускаться. Это называется "простой" (или "зависание"). Большая часть конструкции конвейерного компьютера направлена на предотвращение взаимного влияния стадий и уменьшение количества простых.

История

Первоначальное применение конвейерной обработки было в проектах ILLIAC II и IBM Stretch, хотя простая версия использовалась ранее в Z1 в 1939 году и Z3 в 1941 году. Активное развитие конвейерной обработки началось в конце 1970-х годов в суперкомпьютерах, таких как векторные и матричные процессоры. Одним из первых суперкомпьютеров была серия Cyber, созданная компанией Control Data Corporation. Её главный архитектор, Сеймур Крей, позже возглавил Cray Research. Cray разработал линейку суперкомпьютеров XMP, используя конвейерную обработку как для операций умножения, так и для сложения/вычитания. Позже компания Star Technologies добавила параллелизм (несколько конвейерных функций, работающих параллельно), разработанный Роджером Ченом. В 1984 году Star Technologies добавила конвейерный делитель, разработанный Джеймсом Брэдли. К середине 1980-х годов конвейерная обработка использовалась многими различными компаниями по всему миру. Конвейерная обработка не ограничивалась суперкомпьютерами. В 1976 году серия 470 корпорации Amdahl имела 7-ступенчатый конвейер и запатентованную схему предсказания переходов.

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

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

Филиалы

Ответвление от нормальной последовательности инструкций часто связано с риском возникновения конфликта. Если процессор не может выполнить переход по ветви за один тактовый цикл, конвейер продолжит последовательное извлечение инструкций. Такие инструкции нельзя допускать к выполнению, поскольку программист перенаправил управление в другую часть программы. Условный переход еще более проблематичен. Процессор может выполнить переход, а может и не выполнить, в зависимости от вычисления, которое еще не завершено. Различные процессоры могут приостанавливать работу, могут пытаться предсказывать переходы и могут начать выполнять две различные последовательности программ (раннее выполнение), каждая из которых предполагает, что переход будет выполнен или не выполнен, отбрасывая всю работу, относящуюся к неверному предположению. Процессор с реализацией предсказания переходов, который обычно делает правильные прогнозы, может минимизировать снижение производительности из-за переходов. Однако, если переходы предсказываются неверно, это может создать дополнительную нагрузку на процессор, например, очистку из конвейера неверного пути кода, который начал выполняться, прежде чем возобновить выполнение в правильном месте. Программы, написанные для конвейерного процессора, намеренно избегают переходов, чтобы минимизировать возможную потерю скорости. Например, программист может обрабатывать обычный случай последовательным выполнением и выполнять переход только при обнаружении необычных случаев. Использование таких программ, как gcov, для анализа покрытия кода позволяет программисту измерять, как часто фактически выполняются конкретные переходы, и получать информацию для оптимизации кода. В некоторых случаях программист может обрабатывать как обычный, так и необычный случай с помощью кода, не содержащего переходов.

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

Процессор с конвейером может разрешать конфликты, вызывая задержку и создавая "пузырь" в конвейере, что приводит к одному или нескольким циклам, в течение которых ничего полезного не происходит. На иллюстрации справа, в цикле 3, процессор не может декодировать фиолетовую инструкцию, возможно, потому что процессор определяет, что декодирование зависит от результатов, полученных в результате выполнения зеленой инструкции. Зеленая инструкция может перейти на стадию выполнения, а затем на стадию записи, как и планировалось, но фиолетовая инструкция задерживается на один цикл на стадии выборки. Синяя инструкция, которая должна была быть выбрана в цикле 3, также задерживается на один цикл, как и красная инструкция после нее. Из-за "пузыря" (синие овалы на иллюстрации) схема декодирования процессора простаивает в цикле 3. Его схема выполнения простаивает в цикле 4, а схема записи – в цикле 5. Когда "пузырь" покидает конвейер (в цикле 6), нормальное выполнение возобновляется. Однако теперь все отстает на один цикл. Для полного выполнения четырех инструкций, показанных разными цветами, потребуется 8 циклов (с 1 по 8) вместо 7.