Конспект лекции: Технологии повышения производительности процессоров
Дисциплина: ОП.02 Архитектура аппаратных средств
Раздел 3 программы (§2.2 с.8): Технологии повышения производительности процессоров
Целевая аудитория: Студенты ММКЦТ «Академия TOP»
Фундаментальное уравнение производительности (Iron Law of Processor Performance):
Время_исполнения = N × CPI × T_clk = (N × CPI) / Частота
Быстродействие микропроцессора опирается на баланс трех компонентов:
N — количество динамически выполняемых инструкций машинной программы (сокращается компилятором и наборами инструкций SIMD).
CPI (Cycles Per Instruction) — среднее число тактов, необходимых для завершения одной инструкции. Обратная величина: IPC = 1 / CPI — темп выполнения (повышается суперскалярностью и внеочередным исполнением).
T_clk = 1 / Частота — период тактового генератора в наносекундах (сокращается конвейеризацией и технологическими нормами полупроводников).
1. Конвейеризация команд (Instruction Pipelining)
Идея конвейера аналогична автомобильному сборочному конвейеру Генри Форда: выполнение команды разделяется на серию последовательных микростадий, каждая из которых обслуживается отдельным физическим блоком процессора.
IF (Instruction Fetch — Выборка команды): получение 32/64-битного кода команды из кэша команд (L1i) по адресу, хранящемуся в регистре счетчика команд PC. Инкремент PC ← PC + 4.
ID (Instruction Decode / Register Read — Декодирование и чтение РОН): дешифрация опкода и параллельное аппаратное считывание операндов из регистрационного файла общего назначения (РОН).
EX (Execute / Address Calculation — Выполнение): математическая или логическая операция в арифметико-логическом устройстве (ALU), либо расчет эффективного адреса памяти для инструкций загрузки/сохранения.
MEM (Memory Access — Обращение к памяти): чтение или запись слова данных в кэш данных (L1d). Инструкции типа Register-Register на этой стадии простаивают без обращения к памяти.
WB (Write-Back — Обратная запись): сохранение вычисленного результата из межстадийного регистра в целевой регистр РОН.
Конфликты конвейера (Pipeline Hazards):
В идеальных условиях конвейер выпускает одну инструкцию каждый такт (CPI = 1). Однако в реальных программах возникают конфликты, вызывающие задержки и требующие вставки «пузырей» (Bubbles / NOP stalls):
1. Структурные конфликты (Structural Hazards): возникают при одновременной попытке двух инструкций обратиться к одному аппаратному ресурсу (например, к единому порту оперативной памяти). Парируются разделением кэша первого уровня на L1i (инструкции) и L1d (данные) по гарвардскому принципу.
2. Конфликты по данным (Data Hazards):
RAW (Read After Write — истинная зависимость): последующая команда пытается прочитать регистр до того, как предшествующая запишет в него обновленные данные.
WAR (Write After Read — антизависимость) и WAW (Write After Write — зависимость по выводу): ложные зависимости по именам регистров, порождаемые ограниченностью регистрового файла компилятора.
3. Конфликты по управлению (Control Hazards): вызываются инструкциями условных и безусловных переходов, нарушающими линейный поток выборки инструкций.
Диаграмма конвейерных пузырей vs Аппаратный форвардинг (Bypassing):
2. Суперскалярность и внеочередное исполнение (Out-of-Order Core)
Процессор называется суперскалярным, если его аппаратный конвейер содержит параллельные исполнительные тракты и может декодировать, отправлять на исполнение и завершать более одной инструкции за один машинный такт (IPC > 1, например IPC = 3–6).
Однако последовательный (In-Order) запуск команд упирается в то, что команда, застрявшая в ожидании данных из оперативной памяти, блокирует все последующие независимые команды. Решением стало динамическое внеочередное исполнение (Out-of-Order Execution — OoO), базирующееся на алгоритме Роберта Томасуло.
Блок-схема современного Out-of-Order ядра процессора:
Ключевые принципы архитектуры Томасуло:
Переименование регистров (Register Renaming): устраняет антизависимости (WAR) и зависимости по выводу (WAW). Логические имена регистров (например, EAX) динамически сопоставляются с физическими ячейками буфера переименования или расширенного файла физических регистров (Physical Register File — PRF, размер которого достигает 180–280 записей).
Станции резервирования (Reservation Stations): хранят инструкции, ожидающие появления данных. При вычислении результата он выставляется на общую шину данных (Common Data Bus — CDB), и все станции, ожидающие этот тег, мгновенно захватывают его.
Буфер переупорядочивания (Reorder Buffer — ROB): является циклическим списком (FIFO). Инструкции заносятся в него строго последовательно на этапе Dispatch, исполняются параллельно и асинхронно в ALU, а окончательно записываются в регистры (Retire / Commit) снова строго упорядоченно. Если спекулятивная ветвь оказалась ошибочной или инструкция вызвала ошибку (деление на ноль), спекулятивные результаты в ROB просто аннулируются без изменения глобального состояния процессора.
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:
MMX (1997 г.): 64-битные регистры, только целочисленные типы данных (байты, слова).
SSE / SSE2 / SSE4.2 (1999–2008 гг.): 128-битные регистры XMM0–XMM15. Позволяют одновременно складывать 4 числа формата float32 или 2 числа формата double64.
AVX / AVX2 (2011–2013 гг.): 256-битные регистры YMM0–YMM15. Обрабатывают 8 чисел float32 или 4 числа double64 за такт. Поддержка трехоперандной формы (vaddps ymm0, ymm1, ymm2) и операции FMA (Fused Multiply-Add, выполнение $a \times b + c$ с одним округлением).
AVX-512 (2016–н.в.): 512-битные регистры ZMM0–ZMM31 (32 регистра). Обрабатывают 16 чисел float32 или 8 чисел double64 одновременно! Введены регистры предикатных масок k0–k7 для векторизации ветвлений.
Аппаратное ограничение AVX Offset: активация широких 512-битных исполнительных матриц вызывает колоссальную мгновенную плотность тока ($dI/dt$) и локальный нагрев кристалла. Процессор автоматически активирует динамическое снижение тактовой частоты (AVX Frequency Offset / Throttle) на 100–300 МГц для сохранения стабильности питания.
5. Физические и математические пределы: Закон Амдала и предел Деннарда
Закон Джина Амдала (1967 г.):
Закон формулирует теоретический предел ускорения вычислительной системы при увеличении числа параллельных вычислительных ядер:
где p — доля времени работы алгоритма, поддающаяся идеальному распараллеливанию, (1 - p) — строго последовательная часть (инициализация, ввод/вывод, синхронизация потоков, семафоры).
Предел масштабирования Деннарда и Термический барьер (Power Wall):
где $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), процессор сможет легко отменить ее без искажения состояния системы.
Даже если параллельная часть задачи будет выполнена за бесконечно малое мгновение на бесконечном числе процессоров, время работы программы все равно не может быть меньше времени выполнения ее строго последовательной части $(1 - p)$.
4. Что происходит с конвейером при неверном предсказании перехода (Branch Misprediction)?
Происходит сброс конвейера (Pipeline Flush). Все спекулятивно загруженные и выполненные команды в станциях резервирования и буфере переупорядочивания признаются недействительными и стираются, а блок выборки перезагружает PC правильным целевым адресом, теряя 15–20 машинных тактов.