Конвейерная архитектура

Конвейерная архитектура была введена с целью эксплуатации параллелизма на уровне инструкций. Иными словами, одновременного их выполнения. Для выполнения какой-либо команды осуществляются однотипные операции. Эти однотипные операции и будут называться стадиями конвейера.

Примеры этапов конвейера:
IF – выборка инструкции
ID – декодирование макрооперации
IE – выполнение микрооперации
WB – запись результата

Любой конвейер на CISC архитектуре будет иметь как минимум 4 стадии. Пусть у нас один этап будет длиться одному такту. Рассмотрим случай, когда инструкции будут выполняться на процессоре без конвейера.

Конвейерная архитектура, image #1
Анализ тактов:
1 такт - выбор инструкции
2 такт — декодирование инструкции
3 такт — исполнение инструкции
4 такт — запись результатов
5 такт — выбор инструкции I2
6 такт — декодирование инструкции I2
7 такт — исполнение инструкции I2
8 такт — запись результатов

4 инструкции выполнились за 16 тактов. Можно сделать этапы независимыми от инструкции, увеличив производительность тем, что инструкции будут выполняться одновременно. Так будет выглядеть наш гипотетический процессор с применением конвейерной архитектуры

Конвейерная архитектура, image #2

За 7 тактов выполнились все 4 инструкции. Конвейерная архитектура позволила увеличить производительность более чем в 2 раза. Во втором такте первая инструкция продолжает продвигаться, но одновременно происходит выборка второй инструкции. Не всё так хорошо, как кажется на первый взгляд. В конвейере могут возникать конфликты. Сначала стоит рассказать о некоторых формулах и терминах. Главная цель процессора - выполнять инструкции. Количеством выполнения инструкций за такт называют IPC (Instructions Per Clock).

IPC = 1/CPI

CPI (clocks per instruction) — это среднее количество тактов процессора, необходимых для выполнения одной инструкции. Не стоит забывать, что инструкции разные, поэтому нет точного количества тактов для выполнения одной инструкции. Тем не менее, на процессоре без конвейера у нас CPI = 4, а с конвейером CPI ≈ 1. В суперскалярных процессорах CPI < 1. Такты на современных процессорах очень короткие. Длительность такта измеряется по формуле:
C = 1/F (F — тактовая частота).

CPI = T/L (L — количество инструкций в программе)

T = L * CPI * C (T — время выполнения программы)

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

Конфликты конвейера

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

Виды конфликтов:
Структурные конфликты (Structural Hazards)
Конфликты данных (Data Hazards)
Конфликты управления (Control Hazards)

Структурные конфликты

Конвейерная архитектура, image #3

Инструкция I1 на четвертом такте обратилась к памяти, но в то же время происходит выборка инструкции I4. Порт доступа к памяти один, поэтому происходит структурный конфликт.

Конвейерная архитектура, image #4

Перед выборкой инструкцией I4 вставляется задержка, замедляя конвейер.

Конфликты данных

Текущий шаг конвейера не может быть выполнен, так как зависит от результатов выполнения предыдущего шага.

Read after Write (RAW):
i1: A = B + C
i2: D = A + G

Write after Read (WAR):
i1: A = B + C
i2: C = G + M

Write after Write (WAW):
i1: A = B + C
i2: A = G + M

Способы разрешения конфликта:
1) Применение PRF (регистры)
2) Out-of-order исполнение
3) Forwarding

С регистрами всё просто. Можно записывать значение на первой половине такта, а на второй — чтение.

Конвейерная архитектура, image #5

Out-of-order исполнение также помогает избежать конфликта данных. Внеочередное исполнение примечательно тем, что инструкция, чьи операнды стали доступны раньше, будет и выполняться раньше. Иными словами, в порядке готовности к выполнению. Инструкция записывает данные в регистр, только после того как более старые инструкции сохранили свои результаты.

Техника Forwarding подразумевает передачу значений от одной инструкции к другой минуя регистры.

Конвейерная архитектура, image #6

Конфликты управления

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

Конвейерная архитектура, image #7

Длины конвейера

Нет определенной закономерности о длине конвейере. Больше — лучше, меньше — лучше. Так это не работает. Оптимальная длина конвейера также зависит от микроархитектуры процессора в целом. На длинном конвейере нужно как можно сильнее избегать «конвейерных пузырьков», так как они отразятся на все стадии конвейера, но ни на одной не будет никаких действий. Частичным избежанием данной проблемы является SMT (одновременная многопоточность). На длинный конвейер требований должно быть больше. Требуется увеличивать объем буферов в front-end, чтобы вмещать как можно больше инструкций. При коротком конвейере на каждой стадии процессор выполняет больше работы, однако на прохождение инструкции через каждую стадию требуется больше времени. Для короткого конвейра требуется наращивание исполнительных блоков процессора в таком случае, а для длинного — нужно ускорить конвейер путём увеличения тактовой частоты процессора. В длинном конвейере на различных стадиях конвейера может одновременно выполняться большее количество инструкций.

310 views·5 shares