Конвейер процессора
Коротко: Конвейер процессора делит выполнение команды на несколько стадий, которые, как на сборочной линии, одновременно работают над разными командами. Благодаря этому в идеале за такт завершается одна команда, хотя каждой нужно несколько тактов.
Подробнее: Вместо того чтобы полностью завершать одну команду перед началом следующей, процессор перекрывает шаги. Пока выполняется команда 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