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