Конспект лекции: Технологии повышения производительности процессоров

Дисциплина: ОП.02 Архитектура аппаратных средств

Раздел 3 программы (§2.2 с.8): Технологии повышения производительности процессоров

Целевая аудитория: Студенты ММКЦТ «Академия TOP»

Фундаментальное уравнение производительности (Iron Law of Processor Performance):
Время_исполнения = N × CPI × T_clk = (N × CPI) / Частота

Быстродействие микропроцессора опирается на баланс трех компонентов:

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

Идея конвейера аналогична автомобильному сборочному конвейеру Генри Форда: выполнение команды разделяется на серию последовательных микростадий, каждая из которых обслуживается отдельным физическим блоком процессора.

Классический 5-ступенчатый конвейер RISC (DLX / MIPS):

  1. IF (Instruction Fetch — Выборка команды): получение 32/64-битного кода команды из кэша команд (L1i) по адресу, хранящемуся в регистре счетчика команд PC. Инкремент PC ← PC + 4.
  2. ID (Instruction Decode / Register Read — Декодирование и чтение РОН): дешифрация опкода и параллельное аппаратное считывание операндов из регистрационного файла общего назначения (РОН).
  3. EX (Execute / Address Calculation — Выполнение): математическая или логическая операция в арифметико-логическом устройстве (ALU), либо расчет эффективного адреса памяти для инструкций загрузки/сохранения.
  4. MEM (Memory Access — Обращение к памяти): чтение или запись слова данных в кэш данных (L1d). Инструкции типа Register-Register на этой стадии простаивают без обращения к памяти.
  5. WB (Write-Back — Обратная запись): сохранение вычисленного результата из межстадийного регистра в целевой регистр РОН.

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

В идеальных условиях конвейер выпускает одну инструкцию каждый такт (CPI = 1). Однако в реальных программах возникают конфликты, вызывающие задержки и требующие вставки «пузырей» (Bubbles / NOP stalls):

Диаграмма конвейерных пузырей vs Аппаратный форвардинг (Bypassing):

А) Исполнение без форвардинга: 2 пузыря (Stall) при RAW зависимости Команда I2 ждет записи R1 в регистровый файл на стадии WB команды I1 T1 T2 T3 T4 T5 T6 T7 I1: ADD R1, R2, R3 IF ID EX MEM WB I2: SUB R4, R1, R5 IF STALL STALL ID EX MEM WB Б) Исполнение с аппаратным форвардингом (Bypassing): 0 задержек! Результат со стадии EX (T3) передается напрямую на вход ALU стадии EX (T4) T1 T2 T3 T4 T5 T6 I1: ADD R1, R2, R3 IF ID EX MEM WB I2: SUB R4, R1, R5 IF ID EX MEM WB Data Forwarding (T3 → T4) IF: Выборка ID: Декодирование EX: Исполнение MEM: Память WB: Запись Stall: Пузырь

2. Суперскалярность и внеочередное исполнение (Out-of-Order Core)

Процессор называется суперскалярным, если его аппаратный конвейер содержит параллельные исполнительные тракты и может декодировать, отправлять на исполнение и завершать более одной инструкции за один машинный такт (IPC > 1, например IPC = 3–6).

Однако последовательный (In-Order) запуск команд упирается в то, что команда, застрявшая в ожидании данных из оперативной памяти, блокирует все последующие независимые команды. Решением стало динамическое внеочередное исполнение (Out-of-Order Execution — OoO), базирующееся на алгоритме Роберта Томасуло.

Блок-схема современного Out-of-Order ядра процессора:

1. IN-ORDER FRONTEND (Упорядоченный выбор и декодирование) Выборка команд (IF) L1i кэш + Предсказатель переходов (BTB/TAGE) Декодер команд (μops Decoder) Расщепление CISC x86 → RISC-подобные μops Переименование регистров (RAT) Устранение WAR/WAW → Физические регистры PRF 2. OUT-OF-ORDER EXECUTION ENGINE (Планирование по готовности данных) Станции резервирования / Планировщик инструкций (Reservation Stations / Unified Scheduler) Инструкции ждут готовности операндов. Как только данные поступили — пуск на свободный порт! ALU 0 (Целые) Базовая арифметика ALU 1 / Branch Проверка ветвлений Vector FPU / FMA AVX2 / AVX-512 Vector FPU 1 AVX / Преобразования AGU (Load/Store) Доступ к памяти Common Data Bus (CDB) — широковещательная рассылка готовых результатов в Станции Резервирования и ROB 3. IN-ORDER RETIRE / COMMIT (Буфер переупорядочивания ROB) Буфер переупорядочивания (Reorder Buffer — ROB) Хранит команды в строгом исходном порядке программы. Фиксация результатов (Commit). Регистры РОН / Память Окончательное состояние ЦПУ

Ключевые принципы архитектуры Томасуло:

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

В типичном машинном коде инструкции условного перехода (JNZ, BEQ, BGT) встречаются каждые 5–7 команд. Если бы процессор останавливал конвейер до фактического вычисления флагов в ALU, производительность упала бы более чем вдвое.

Спекулятивное исполнение (Speculative Execution): процессор делает обоснованную догадку о том, куда пойдет ветвление, и начинает немедленно выбирать и выполнять команды по предсказанному адресу. Если догадка верна — задержек нет вовсе. Если догадка ошибочна — происходит сброс конвейера (Pipeline Flush).

Эволюция алгоритмов предсказания переходов:

Тип предсказателя Принцип работы Типичная точность Применение
Статическое предсказание Переходы назад (циклы) считаются выполняемыми (Taken); переходы вперед (условия if) — невыполняемыми (Not Taken). 65–70% Ранние RISC, простые микроконтроллеры
1-битный динамический Запоминает результат последнего выполнения перехода (0 — Not Taken, 1 — Taken). ~80% Неустойчив к смене направления (в циклах дает 2 ошибки за итерацию)
2-битный насыщающийся счетчик Конечный автомат с 4 состояниями: 00 (Сильно не взят), 01 (Слабо не взят), 10 (Слабо взят), 11 (Сильно взят). Требует двух ошибок подряд для смены прогноза. 85–90% Классические процессоры Pentium, Cortex-A8
Корреляционный (gshare) Использует глобальный регистр истории переходов (Global History Register — GHR), смешивая биты истории и адрес команды через XOR. 92–95% Процессоры 2000-х годов (Core 2 Duo, Athlon 64)
TAGE-предсказатель (TAgged GEometric) Множество таблиц с геометрически растущей длиной истории ветвлений (от коротких до сверхдлинных контекстов в сотни переходов). 97–99% Современные микроархитектуры AMD Zen, Intel Golden Cove / Raptor Lake, Apple M-серии
Расчет штрафа за ошибку предсказания (Branch Misprediction Penalty):
CPI_eff = CPI_base + f_branch × (1 - Accuracy) × N_penalty
Где f_branch — доля условных переходов (~20%), Accuracy — точность предсказателя, N_penalty — глубина конвейера до стадии подтверждения (15–20 тактов).

4. Векторные инструкции SIMD (AVX2 / AVX-512)

Классический скалярный процессор (SISD — Single Instruction, Single Data) за одну команду складывает два числа. Векторные расширения парадигмы SIMD (Single Instruction, Multiple Data) позволяют одной инструкцией параллельно обработать пачку однотипных данных.

Эволюция SIMD расширений архитектуры x86:

Пиковая теоретическая производительность FPU (GFLOPS):
Peak_FLOPS = Число_ядер × Тактовая_частота × Число_FMA_портов × Элементов_в_векторе × 2

Аппаратное ограничение AVX Offset: активация широких 512-битных исполнительных матриц вызывает колоссальную мгновенную плотность тока ($dI/dt$) и локальный нагрев кристалла. Процессор автоматически активирует динамическое снижение тактовой частоты (AVX Frequency Offset / Throttle) на 100–300 МГц для сохранения стабильности питания.

5. Физические и математические пределы: Закон Амдала и предел Деннарда

Закон Джина Амдала (1967 г.):

Закон формулирует теоретический предел ускорения вычислительной системы при увеличении числа параллельных вычислительных ядер:

S(N) = 1 / [ (1 - p) + (p / N) ]
Предел ускорения при N → ∞: S_max = 1 / (1 - p)

где p — доля времени работы алгоритма, поддающаяся идеальному распараллеливанию, (1 - p) — строго последовательная часть (инициализация, ввод/вывод, синхронизация потоков, семафоры).

5× 10× 15× 20× 1 4 8 16 32 64 Ускорение S(N) Число ядер N → p = 95% (Предел 20×) p = 90% (Предел 10×) p = 75% (Предел 4×) p = 50% (Предел 2×)

Предел масштабирования Деннарда и Термический барьер (Power Wall):

Динамическая мощность, рассеиваемая КМОП-транзисторами, описывается физическим выражением:

P_dyn = C × V^2 × f

где $C$ — емкость затвора, $V$ — напряжение питания, $f$ — тактовая частота. Роберт Деннард доказал, что при уменьшении линейных размеров транзистора в $k$ раз, напряжение $V$ можно снизить в $k$ раз, что сохраняло удельную плотность тепла константной.

Однако около 2005 года напряжение уперлось в фундаментальный порог 0.7–1.0 Вольт: при дальнейшем снижении напряжения термические флуктуации электронов вызывают самопроизвольное переключение транзисторов, а статические токи утечки (Static Leakage Power) растут экспоненциально. Масштабирование Деннарда нарушилось. Отводить более 150–250 Вт тепла с кремниевого кристалла площадью 1–2 см² стандартными воздушными кулерами стало невозможно. Это заставило полупроводниковую индустрию прекратить гонку мегагерц и перейти к параллельным микроархитектурам (многоядерность, SIMD, глубокий OoO).

6. Контрольные вопросы для самопроверки

1. В чем разница между конвейерным пузырем (Stall) и аппаратным форвардингом данных?
Пузырь замораживает стадии конвейера, вставляя пустые такты ожидания NOP, пока результат не запишется в регистровый файл. Форвардинг же перехватывает вычисленные операнды прямо на выходе комбинационной логики (EX/MEM) и подает их по служебным шинам в мультиплексор следующей стадии без единого такта задержки.
2. Почему при внеочередном исполнении (OoO) завершение инструкций (Commit/Retire) обязано быть строго последовательным?
Строго упорядоченное завершение в буфере переупорядочивания (ROB) обеспечивает точную модель исключений (Precise Exceptions). Если команда на спекулятивной ветви вызовет фатальную ошибку (деление на ноль или Page Fault), процессор сможет легко отменить ее без искажения состояния системы.
3. Каков физический смысл предела закона Амдала $S_{\max} = \frac{1}{1 - p}$?
Даже если параллельная часть задачи будет выполнена за бесконечно малое мгновение на бесконечном числе процессоров, время работы программы все равно не может быть меньше времени выполнения ее строго последовательной части $(1 - p)$.
4. Что происходит с конвейером при неверном предсказании перехода (Branch Misprediction)?
Происходит сброс конвейера (Pipeline Flush). Все спекулятивно загруженные и выполненные команды в станциях резервирования и буфере переупорядочивания признаются недействительными и стираются, а блок выборки перезагружает PC правильным целевым адресом, теряя 15–20 машинных тактов.