📌 Кратко
Branch predictor — логический блок в CPU, предсказывающий направление условных переходов (ветвлений) для предотвращения простаивания Pipeline.
🧠 Как работает
Во время исполнения условного перехода (if
, loop
, jmp
) CPU не знает, какой путь будет выбран. Branch predictor пытается предсказать исход заранее, чтобы загрузить нужную инструкцию в Pipeline.
Если предсказание верно → конвейер продолжается без пауз.
Если неверно → происходит pipeline flush (очистка) и перезапуск → потеря тактов.
Основные типы предсказателей:
Тип | Описание |
---|---|
Static | Простое правило (например, всегда «вниз») |
Dynamic | Основан на истории поведения |
Bimodal | 1-битовая история (выполнялся/нет) |
Two-level Adaptive | Таблица + история, более точное поведение |
Tournament | Комбинирует несколько стратегий |
BTB (Branch Target Buffer) | Кэш адресов целей переходов |
⚙️ Где применяется
Архитектура | Использование |
---|---|
Superscalar CPU | Предсказывает десятки переходов заранее |
Out-of-order execution | Снижает количество ошибок в переупорядочивании |
RISC | Позволяет не терять такты на if/loop |
x86_64 | Использует BTB + BHT + RSB в комбинации |
💻 Пример (на ассемблере)
cmp eax, 0
je label_true ; ← условный переход, будет предсказываться
📐 Схема работы предсказания
+----------------------+
| Branch Instruction |
+----------+-----------+
↓
+---------------+
| Branch History|
| Table (BHT) |
+---------------+
↓
+---------------------+
| Target Buffer (BTB) |
+---------------------+
↓
Предсказанный адрес перехода
✅ Преимущества
-
Снижает задержки при условных инструкциях
-
Повышает эффективность Pipeline
-
Критично для высокой IPC в современных CPU
❌ Недостатки
-
Ошибки → pipeline flush и потеря производительности
-
Усложнение архитектуры и логики управления
-
Уязвимость к атакам (например, Spectre)