Раздел 3. Технологии повышения производительности процессоров

1. Железный закон производительности процессора

Время выполнения любой программы процессором описывается фундаментальным физико-математическим равенством:

Время = N (число инструкций) × CPI (тактов на инструкцию) × T_clk (длительность такта)

1. Сокращение N

Векторные инструкции SIMD (AVX2/AVX-512) заменяют десятки скалярных команд одной векторной.

2. Снижение CPI

Суперскалярность и Out-of-Order повышают IPC = 1 / CPI, запуская несколько команд за 1 такт.

3. Сокращение T_clk

Конвейеризация дробит сложные операции на короткие такты, позволяя наращивать тактовую частоту.

2. Конвейеризация команд (Pipelining)

Разбиение исполнения каждой команды на 5 аппаратных стадий, работающих параллельно над разными инструкциями:

  • IF (Instruction Fetch): выборка 32/64-битного кода команды из кэша L1i по адресу PC.
  • ID (Instruction Decode): распознавание опкода и параллельное чтение регистров из файла РОН.
  • EX (Execute): операция в АЛУ либо расчет эффективного адреса памяти.
  • MEM (Memory Access): обращение к кэшу данных L1d (только для Load / Store).
  • WB (Write-Back): фиксация результата в целевой регистр РОН.

Результат: при заполненном конвейере процессор выпускает по одной завершенной команде каждый такт (CPI = 1).

3. Конфликты конвейера (Pipeline Hazards)

1. Структурные

Две инструкции одновременно претендуют на один физический узел (например, память).

Решение: раздельные кэши L1i (команды) и L1d (данные) — гарвардская архитектура.

2. По данным (Data)

RAW (Read After Write): команда пытается прочитать операнд до записи результата предшественником.

WAR / WAW: ложные зависимости по именам регистров.

3. По управлению (Control)

Инструкции условных и безусловных переходов нарушают линейность потока команд.

Конвейер не знает, какую команду выбирать следующей, до вычисления флагов.

4. Аппаратный форвардинг (Data Forwarding / Bypassing)

Как устранить задержки RAW без остановки конвейера?

Без форвардинга (Пузыри NOP)

• Команда I2 ждет, пока I1 дойдет до стадии WB (такт 5).

• Конвейер вставляет 2 такта простоя (Stall/Bubble).

• Падение реальной скорости и утилизации вычислительных блоков.

С форвардингом (Bypassing)

• Схема Forwarding Unit берет результат прямо с выхода регистра EX/MEM (такт 3).

• Данные передаются на вход ALU команды I2 (такт 4).

• 0 тактов задержки! Непрерывный темп работы.

Исключение (Load-Use Hazard): при чтении из памяти (команда LW) данные готовы только в конце стадии MEM, поэтому 1 такт простоя неизбежен.
5. Суперскалярность: преодоление барьера CPI = 1

Суперскалярный процессор содержит несколько параллельных конвейеров и исполнительных портов, выбирая и исполняя несколько инструкций за один такт (IPC > 1):

Параллельные порты исполнения

Современные процессоры (Intel Raptor Lake, AMD Zen 4, Apple M2) имеют 4–6 целочисленных ALU, 2–4 векторных блока FMA, раздельные блоки Load и Store.

Проблема In-Order суперскалярности

Если первая команда в связке заблокирована ожиданием кэша памяти, весь процессор останавливается, блокируя остальные независимые команды!

IPC (Instructions Per Cycle) = 1 / CPI > 1 (в современных ядрах пиковый IPC достигает 4–8)
6. Внеочередное исполнение (Out-of-Order Execution — OoO)

Алгоритм Роберта Томасуло динамически меняет порядок исполнения команд в зависимости от готовности данных:

Переименование регистров (RAT)

Архитектурные регистры (RAX, RBX) проецируются на сотни физических регистров (PRF).

Это полностью ликвидирует ложные зависимости WAR и WAW!

Станции резервирования (Reservation Stations)

Команды ждут в очередях планировщика. Как только оба операнда готовы, команда немедленно стартует на свободный порт.

Общая шина данных (Common Data Bus — CDB)

Готовый результат широковещательно рассылается по процессору: все станции резервирования, ожидавшие этот результат, перехватывают его мгновенно.

7. Буфер переупорядочивания (ROB) и упорядоченный коммит

Хотя команды исполняются в произвольном порядке (Out-of-Order), их завершение (Retire/Commit) обязано быть строго упорядоченным (In-Order)!

Reorder Buffer (ROB)

• Кольцевой буфер FIFO, куда команды поступают строго в исходном порядке программы.

• Фиксация результата в архитектурные регистры происходит строго по очереди головы буфера.

Точная модель прерываний (Precise Interrupts)

• Если команда вызвала ошибку (деление на ноль или Page Fault), все спекулятивные команды за ней просто аннулируются.

• Внешний наблюдатель видит состояние, как будто процессор работал строго последовательно.

8. Предсказание переходов (Branch Prediction)

Ветвления встречаются каждые 5–7 команд. Чтобы конвейер не простаивал, процессор угадывает направление перехода:

2-битный насыщающийся счетчик

4 состояния: Сильно/Слабо взят, Сильно/Слабо не взят. Требует 2 ошибок подряд для смены решения.

Буфер целевых адресов (BTB)

Кэш целевых адресов переходов. Позволяет выбрать целевую инструкцию уже на стадии IF до декодирования!

TAGE-предсказатель

Использует геометрическую историю сотен предыдущих переходов. Точность превышает 97–99%!

Штраф за ошибку (Branch Misprediction Penalty): сброс конвейера (Flush) обходится в 15–20 потерянных тактов!
9. Спекулятивное исполнение: цена и безопасность

Процессор не просто предсказывает адрес — он спекулятивно вычисляет ветвь кода вперед до подтверждения условия:

Плюсы спекуляции

• Конвейер загружен на 100%, устраняются простои на ветвлениях.

• При точности предсказателя 98% эффективный CPI вплотную приближается к идеальному 1.0.

Побочные эффекты и безопасность

• Spectre / Meltdown: спекулятивные команды оставляют микроархитектурные следы в кэше данных, позволяя читать чужую память через сайд-каналы по времени!

• Аппаратные заплатки требуют частичного отключения агрессивных спекуляций.

10. Векторизация вычислений (SIMD Архитектура)

SIMD (Single Instruction, Multiple Data): одна инструкция обрабатывает целый массив чисел параллельно:

Поколение SIMD Разрядность регистров Чисел float32 за такт Операция FMA
SSE / SSE4.2 128 бит (XMM) 4 числа float32 Нет
AVX / AVX2 256 бит (YMM) 8 чисел float32 Да (2 флопа за такт)
AVX-512 512 бит (ZMM) 16 чисел float32 Да (маски предикатов k0–k7)

AVX Throttle: работа с широкими 512-битными регистрами вызывает скачок тока, из-за чего процессор временно снижает частоту на 100–300 МГц (AVX Frequency Offset).

11. Термический барьер и предел Деннарда (Power Wall)

Почему частоты процессоров перестали расти после 2005 года?

P_динамическая = C × V^2 × f   |   P_статическая = V × I_утечки

Масштабирование Деннарда (до 2005)

Уменьшая транзистор, инженеры снижали напряжение V, сохраняя удельную тепловую мощность постоянной при росте частоты f.

Термический барьер (Power Wall)

При напряжении < 0.8 В токи квантовой утечки растут экспоненциально. Отводить больше 250 Вт тепла с кремния стало невозможно — частоты застыли на 3–5 ГГц.

⇒ Единственный путь дальнейшего роста производительности — архитектурный параллелизм и многоядерность!

12. Предел параллелизма: Закон Амдала

Закон Джина Амдала определяет максимальный выигрыш в скорости от добавления параллельных ядер:

S(N) = 1 / [ (1 - p) + (p / N) ]   ⇒   S_max = 1 / (1 - p)  при N → ∞

p = 75%

Последовательная часть = 25%

Предел ускорения: 4×

1000 ядер дадут не более 4-кратного прироста!

p = 90%

Последовательная часть = 10%

Предел ускорения: 10×

При 64 ядрах ускорение равно 8.77×.

p = 95%

Последовательная часть = 5%

Предел ускорения: 20×

Даже 5% последовательного кода ограничивают потолок ускорения 20 разами!

13. Инженерные мифы о производительности
  • «Частота в ГГц однозначно определяет скорость процессора»: Миф. 3.0 ГГц чип с IPC = 4.0 выполняет 12 млрд инструкций в секунду, опережая 5.0 ГГц чип с IPC = 1.5 (7.5 млрд). Архитектура важнее мегагерц!
  • «Внеочередное исполнение меняет логику работы программы»: Миф. Буфер ROB гарантирует строго последовательный коммит результатов и точную модель системных исключений.
  • «Если купить процессор с 64 ядрами, все программы ускорятся в 64 раза»: Миф. Закон Амдала жестко ограничивает ускорение долей последовательного кода (1 - p).
14. Резюме: параллелизм и реальность компиляции
xkcd #303 Compiling
Мем: «Compiling» (xkcd #303) — Классический комикс о реальной утилизации вычислительных мощностей разработчиками.
Автор: Рэндалл Манро (Randall Munroe), проект xkcd.com.
Лицензия: Creative Commons Attribution-NonCommercial 2.5 Generic (CC BY-NC 2.5).
Атрибуция: Изображение встроено автономно в формате Data URI (data:image/jpeg;base64) без сторонних сетевых запросов.
Слайд 1 из 15