Архитектура компьютера

Конвейеризация: Сборочная линия CPU

Цели урока

  • Понимать принцип работы конвейера
  • Знать типы hazards: data, control, structural
  • Понимать методы решения: stall, forwarding, branch prediction
  • Уметь оценивать производительность конвейера

Предварительные знания

  • Цикл инструкции
  • 5 стадий выполнения
  • Структура CPU
  • Цикл инструкции
  • Структура 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:

СтадияНазваниеДействие
IFInstruction FetchЗагрузка инструкции, PC += 4
IDInstruction DecodeДекодирование, чтение регистров
EXExecuteАЛУ операция или вычисление адреса
MEMMemory AccessЧтение/запись в память
WBWrite 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 R20005Классический учебный
Intel Pentium5Первый x86 с конвейером
Pentium 431Hyper-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 возникнут и в каком порядке их нужно разрешать?

Связанные уроки

  • os-01-intro
Конвейеризация: Сборочная линия CPU

0

1

Войти