Архитектура компьютера
Конвейеризация: Сборочная линия CPU
Цели урока
- Понимать принцип работы конвейера
- Знать типы hazards: data, control, structural
- Понимать методы решения: stall, forwarding, branch prediction
- Уметь оценивать производительность конвейера
Предварительные знания
- Цикл инструкции
- 5 стадий выполнения
- Структура CPU
Генри Форд изобрёл конвейер для автомобилей. Инженеры CPU применили ту же идею: пока одна инструкция выполняется, следующие уже загружаются и декодируются.
- Оптимизация кода для branch prediction
- Понимание why loops are fast
- Профилирование с perf (branch-misses)
- Написание branchless кода
Идея конвейера
**Проблема:** 5-стадийный цикл = 5 тактов на инструкцию. При 4 ГГц это всего 800 миллионов инструкций/сек. Можно лучше!
**Аналогия с автозаводом:** Одна машина собирается 5 часов. Но если на конвейере 5 станций, каждый час с конвейера сходит готовая машина!
**IPC (Instructions Per Cycle):** Без конвейера IPC = 0.2. С конвейером IPC → 1. Это 5× ускорение при той же частоте!
Главное преимущество конвейера:
Стадии конвейера
Классический 5-стадийный конвейер MIPS:
| Стадия | Название | Действие |
|---|---|---|
| IF | Instruction Fetch | Загрузка инструкции, PC += 4 |
| ID | Instruction Decode | Декодирование, чтение регистров |
| EX | Execute | АЛУ операция или вычисление адреса |
| MEM | Memory Access | Чтение/запись в память |
| WB | Write Back | Запись результата в регистр |
**Pipeline Registers:** Между стадиями стоят регистры (IF/ID, ID/EX, ...), которые хранят промежуточные данные. Это позволяет стадиям работать независимо.
**Throughput vs Latency:**
- **Latency:** Время выполнения одной инструкции = 5 тактов (не изменилось!)
- **Throughput:** Инструкций в секунду = увеличился в 5 раз
Сколько инструкций одновременно находится в 5-стадийном конвейере (в установившемся режиме)?
Hazards: Когда конвейер ломается
**Hazard** - ситуация, когда следующая инструкция не может выполняться, пока не завершится предыдущая.
**Три типа hazards:**
| Тип | Причина | Пример |
|---|---|---|
| Data Hazard | Зависимость по данным | ADD R1,R2,R3; SUB R4,R1,R5 (R1 не готов) |
| Control Hazard | Условный переход | BEQ R1,R2,label (не знаем куда идти) |
| Structural Hazard | Конфликт ресурсов | Два обращения к памяти одновременно |
**Цена hazards:** Каждый stall - потерянный такт. При 30% переходов IPC падает с 1.0 до ~0.7. Миллиарды потерянных операций!
Что такое stall (bubble) в конвейере?
Data Hazards и Forwarding
**Data Hazard** - следующая инструкция использует результат, который ещё не записан.
**Решение 1: Stall** - остановить конвейер на 2 такта. Просто, но медленно.
**Решение 2: Forwarding (Bypassing)** - передать результат напрямую из EX в EX, минуя регистр!
**Forwarding Unit:** Специальный блок, который обнаруживает зависимости и направляет данные напрямую. Ускоряет на 2 такта!
**Load-Use Hazard:** LOAD R1,[addr]; ADD R4,R1,R5 - forwarding не помогает! Данные из памяти появляются только после MEM. Нужен 1 stall.
Что делает Forwarding (Bypassing)?
Control Hazards и Branch Prediction
**Control Hazard** - при BEQ/JMP мы не знаем следующий адрес, пока не выполнится переход.
**Решения:**
| Метод | Описание | Потери |
|---|---|---|
| Stall | Ждать результат перехода | 3 такта каждый раз |
| Assume not taken | Загружать следующую инструкцию | Flush если угадали неверно |
| Branch Prediction | Предсказывать направление | ~5% ошибок = ~5% потерь |
**Branch Target Buffer (BTB)** - кэш адресов переходов:
**2-bit saturating counter:** Предсказание меняется только после 2 ошибок подряд. Точность ~93% для циклов!
Что происходит при неверном предсказании перехода?
Производительность конвейера
**Идеальный IPC = 1.0**, но hazards снижают его. Реальный IPC:
| Архитектура | Глубина конвейера | Примечания |
|---|---|---|
| MIPS R2000 | 5 | Классический учебный |
| Intel Pentium | 5 | Первый x86 с конвейером |
| Pentium 4 | 31 | Hyper-pipelining, высокие частоты |
| Apple M1 | ~16 | Баланс глубины и эффективности |
| Intel Alder Lake | ~20 | Гибридная архитектура |
**Paradox глубокого конвейера:** Больше стадий → выше частота, но выше penalty за misprediction. Pentium 4 (31 стадия) проигрывал Core 2 (14 стадий) по IPC.
Конвейер ускоряет каждую инструкцию
Конвейер увеличивает throughput (инструкций/сек), но latency одной инструкции не меняется.
Одна инструкция всё ещё проходит все 5 стадий за 5 тактов. Но конвейер позволяет начинать новую инструкцию каждый такт.
Почему очень глубокий конвейер (30+ стадий) может быть неэффективен?
Ключевые идеи
- Конвейер: разные стадии разных инструкций параллельно
- IPC идеальный = 1, реальный < 1 из-за hazards
- Data Hazard → Forwarding (результат напрямую в EX)
- Control Hazard → Branch Prediction (угадываем переход)
- Misprediction penalty = глубина конвейера
- Баланс: глубже конвейер = выше частота, но больше penalty
Связанные темы
Конвейер - основа для суперскалярности.
- Суперскалярность — Несколько конвейеров параллельно
- Out-of-Order — Переупорядочивание инструкций
Вопросы для размышления
- Pipeline позволяет нескольким инструкциям выполняться одновременно на разных стадиях. Hazards (data, control, structural) мешают идеальному заполнению конвейера. Процессор работает с кодом, содержащим цикл с условным ветвлением внутри, обращающийся к результату предыдущей инструкции. Какие именно типы hazards возникнут и в каком порядке их нужно разрешать?