Архитектура компьютера
Суперскалярность: Несколько инструкций за такт
Цели урока
- Понимать принцип суперскалярности и IPC > 1
- Знать роль множественных execution units
- Понимать Out-of-Order execution и Reorder Buffer
- Знать Register Renaming для устранения ложных зависимостей
- Понимать Speculative Execution
Предварительные знания
- Конвейеризация
- Hazards
- Branch Prediction
Современные процессоры выполняют инструкции не в том порядке, как написано в программе. Они переупорядочивают, спекулируют, параллелят - всё ради скорости.
- Понимание производительности многопоточного кода
- Memory barriers в concurrent programming
- Уязвимости Spectre/Meltdown
- Оптимизация под конкретную микроархитектуру
От IPC=1 к IPC>1
**Суперскалярный процессор** - выполняет несколько инструкций за такт, используя несколько исполнительных блоков.
| Процессор | Issue Width | Год |
|---|---|---|
| Intel Pentium | 2 | 1993 |
| PowerPC 970 | 4 | 2002 |
| Intel Core | 4 | 2006 |
| Apple M1 (P-core) | 8 | 2020 |
| Apple M2 (P-core) | 8 | 2022 |
**Issue Width** - сколько инструкций CPU может запустить за такт. M1 имеет issue width = 8, но реальный IPC ~3-4 из-за зависимостей.
Что означает суперскалярность?
Execution Units
Для выполнения 4 инструкций нужно 4 исполнительных блока:
| Execution Unit | Операции | Кол-во |
|---|---|---|
| Integer ALU | ADD, SUB, AND, OR, XOR | 2-4 |
| Load Unit | Чтение из памяти | 2 |
| Store Unit | Запись в память | 1-2 |
| FPU | Floating-point операции | 2 |
| Branch Unit | Переходы | 1-2 |
| SIMD/Vector | AVX/SSE операции | 2 |
**Ограничение:** Даже с 8 ALU, если все инструкции зависят друг от друга, IPC = 1. Параллелизм нужен в самом коде!
Что ограничивает реальный IPC суперскалярного процессора?
Out-of-Order Execution
**Проблема:** Инструкции в программе зависимы. Но в очереди могут быть независимые инструкции дальше!
**Out-of-Order (OoO):** Переупорядочить и выполнить MUL, пока ADD ещё считает!
**Reorder Buffer (ROB):** Хранит инструкции в исходном порядке. Результаты записываются в архитектурные регистры в правильном порядке, даже если выполнение было OoO.
Зачем нужен Reorder Buffer (ROB)?
Register Renaming
**Ложные зависимости:** Иногда зависимость только по имени регистра, не по данным.
**Register Renaming:** Переименовать R1 в разные физические регистры!
| Зависимость | Тип | Решение |
|---|---|---|
| RAW (Read After Write) | Истинная | Forwarding, OoO |
| WAW (Write After Write) | Ложная | Register Renaming |
| WAR (Write After Read) | Ложная | Register Renaming |
**Физические регистры:** x86-64 имеет 16 архитектурных регистров, но ~200 физических для renaming!
Register Renaming устраняет:
Speculative Execution
**Speculation:** Выполнять инструкции «вперёд», не зная, понадобятся ли они.
**Если предсказание верное:** Результаты commit'ятся, всё ок.
**Если предсказание неверное:** Flush спекулятивных результатов, откат.
**Spectre/Meltdown:** Уязвимости основаны на том, что speculation оставляет следы в кэше даже после отката! Это позволяет читать защищённую память.
Суперскалярный CPU всегда быстрее скалярного в N раз
Реальное ускорение ограничено зависимостями в коде. Типичный IPC = 2-4, не 8.
Даже с 8 исполнительными блоками, если код последовательный, параллелизма нет.
Что происходит при неверной спекуляции?
Ключевые идеи
- Суперскалярность: несколько инструкций за такт (IPC > 1)
- Execution Units: несколько ALU, Load, Store, FPU
- Out-of-Order: переупорядочивание для максимального параллелизма
- Register Renaming: устранение WAW/WAR зависимостей
- Speculation: выполнение по предсказанному пути
- Реальный IPC ограничен зависимостями в коде
Связанные темы
Суперскалярность - вершина эволюции CPU.
- RISC vs CISC — RISC легче суперскаляризовать
- Кэш-память — Данные должны быть в кэше для IPC
Вопросы для размышления
- Почему суперскалярность даёт меньший прирост производительности на коде с большим количеством зависимостей?
- Как out-of-order execution помогает скрыть латентность обращений к памяти в суперскалярных процессорах?
- Каков предел параллелизма на уровне инструкций и почему он ограничивает масштабирование через суперскалярность?