📌 Кратко

Branch predictor — логический блок в CPU, предсказывающий направление условных переходов (ветвлений) для предотвращения простаивания Pipeline.

🧠 Как работает

Во время исполнения условного перехода (if, loop, jmp) CPU не знает, какой путь будет выбран. Branch predictor пытается предсказать исход заранее, чтобы загрузить нужную инструкцию в Pipeline.

Если предсказание верно → конвейер продолжается без пауз.
Если неверно → происходит pipeline flush (очистка) и перезапуск → потеря тактов.

Основные типы предсказателей:

ТипОписание
StaticПростое правило (например, всегда «вниз»)
DynamicОснован на истории поведения
Bimodal1-битовая история (выполнялся/нет)
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)