EMZETT.
Войти

Конвейер процессора

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

Подробнее: Вместо того чтобы полностью завершать одну команду перед началом следующей, процессор перекрывает шаги. Пока выполняется команда 1, команда 2 уже декодируется, а команда 3 выбирается. Это повышает пропускную способность и допускает более высокие частоты, потому что у каждой стадии меньше работы.

Подробности

Классические 5 стадий (RISC):

СтадияЗадача
IF (instruction fetch)Выбрать команду из памяти/кэша
ID (instruction decode)Декодировать команду, прочитать регистры
EX (execute)Вычислить в ALU
MEM (memory)Прочитать/записать память
WB (write back)Записать результат в регистр
Такт:      1   2   3   4   5   6   7
Команда 1: IF  ID  EX  MEM WB
Команда 2:     IF  ID  EX  MEM WB
Команда 3:         IF  ID  EX  MEM WB

После разгона, начиная с 5-го такта, каждый такт завершается одна команда.

Проблемы (hazards):

  • Зависимость по данным: команде нужен результат предыдущей. Решение: форвардинг (forwarding) или короткая пауза (stall).
  • Структурный hazard: две стадии одновременно нуждаются в одном и том же блоке.
  • Hazard управления (ветвления): при ветвлении неизвестно, какие команды будут следующими. Предсказание ветвлений угадывает. При неверной догадке неправильно загруженные команды отбрасываются («pipeline flush», теряется 10 – 20 тактов).

Развитие:

  • Суперскалярность: несколько конвейеров параллельно, несколько команд за такт.
  • Внеочередное исполнение (out-of-order): команды переупорядочиваются, как только данные готовы.
  • Глубокие конвейеры: у Intel Pentium 4 было 31 стадия, что дало высокие частоты, но дорогие ошибки предсказания. У современных ядер около 14 – 20.

Почему это важно? Конвейеры объясняют, почему код с множеством непредсказуемых ветвлений медленнее и почему IPC (команд за такт) важнее, чем просто ГГц.

См. также: Внеочередное исполнение (out-of-order execution), Устройство процессора: исполнительные блоки и кэш, x86-64 и ARM64