Як працює процесор: вибірка, декодування, виконання
Ваш процесор виконує 3–5 мільярдів тактів за секунду. У кожному такті він може одночасно обробляти десятки інструкцій на різних стадіях завершення, передбачати майбутній шлях вашого коду, переупорядковувати операції «на льоту» та діставати дані з ієрархії кешів — і все це щоб подолати фундаментальне обмеження: пам'ять у тисячі разів повільніша за арифметику.
1. Архітектура фон Неймана
Джон фон Нейман (1945) описав архітектуру, якої й досі дотримуються всі магістральні процесори: єдина спільна пам'ять зберігає і програмні інструкції, і дані. Процесор послідовно зчитує інструкції з пам'яті, виконує їх і зберігає результати назад у пам'ять.
Основні компоненти:
- Арифметико-логічний пристрій (ALU): виконує цілочислову арифметику (+, −, ×, ÷), побітові операції, порівняння. Реалізований на транзисторних комбінаційних логічних схемах (суматори, мультиплексори).
- Блок операцій з рухомою комою (FPU): обробляє арифметику з рухомою комою за стандартом IEEE 754. FPU у вашому Core i9 чи Ryzen 9 більший за цілий процесор 1980-х.
- Пристрій керування: зчитує інструкції, декодує їх і керує іншими блоками.
- Файл регістрів: 16–31 регістр загального призначення розрядністю 64 біти (x86-64: RAX, RBX, RCX, ...), 32 SIMD-регістри для векторних операцій.
- Лічильник команд (PC) / вказівник інструкцій: містить адресу наступної інструкції для виконання.
2. Базовий цикл: вибірка → декодування → виконання
- Вибірка (fetch): зчитування байтів наступної інструкції з пам'яті (через кеш інструкцій) до регістра інструкцій. Інкремент PC.
- Декодування (decode): розбір коду операції та операндів. Визначення, яка операція потрібна, які регістри є джерелами/призначеннями, який режим адресації використовується.
- Виконання (execute): передача операндів до ALU/FPU. Виконання операції. Для інструкцій, що звертаються до пам'яті, обчислення ефективної адреси та читання/запис даних.
- Запис результату (write-back): збереження результату назад у регістр призначення.
Неконвеєризований процесор виконує 1 інструкцію за 4 такти. На частоті 1 ГГц: 250 мільйонів інструкцій/с. Сучасні процесори виконують 4–8 інструкцій за такт — поліпшення у 800×, досягнуте завдяки конвеєризації та суперскалярному виконанню.
3. Конвеєризація
Так само як автомобільний конвеєр накладає стадії виробництва, конвеєризація накладає стадії інструкцій. Поки інструкція N виконується, інструкція N+1 декодується, а N+2 одночасно вибирається:
5-стадійний конвеєр може виконувати у 5× більше роботи за такт. Сучасні конвеєри x86 мають глибину 14–19 стадій (Intel Skylake: 14). Глибші конвеєри дозволяють вищі тактові частоти, але збільшують ціну скидання конвеєра через помилкові передбачення переходів.
Конфлікти (hazards), що зупиняють конвеєр:
- Конфлікт за даними: інструкції потрібен результат, який ще не отримано. Розв'язується пересиланням (обхідний шлях від виходу EX назад на вхід EX) або зупинкою.
- Конфлікт за керуванням: інструкція переходу — ми не знаємо, яку інструкцію вибирати далі. Розв'язується передбаченням переходів.
- Структурний конфлікт: двом інструкціям потрібен той самий апаратний блок. Розв'язується дублюванням (кілька ALU у суперскалярних процесорах).
4. Передбачення переходів
~20% інструкцій — це переходи. Без передбачення кожен перехід зупиняє конвеєр на 14+ тактів. Сучасні процесори використовують складні передбачувачі з точністю >99% на типових навантаженнях:
- Статичне передбачення: припускаємо, що зворотні переходи виконуються (цикли), а прямі — ні. Точність ~65%.
- Динамічне — двобітний насичувальний лічильник: кожен перехід має 2-бітний стан (впевнено не виконується / слабко не виконується / слабко виконується / впевнено виконується). Оновлюється за фактичними результатами. ✓ Коректно обробляє цикли.
- Передбачувач TAGE (Intel/AMD): теґована таблиця часткових історій із геометричними довжинами історії. Досягає точності >97% на тестах SPEC.
Коли стається помилкове передбачення, процесор мусить скинути конвеєр — відкинути всі інструкції в обробці після переходу й перевибрати з правильного шляху. Штраф: 14–20 тактів. Для тісних циклів із непередбачуваними умовами помилкове передбачення на кожній ітерації серйозно обмежує IPC.
5. Позачергове виконання
Виконання за порядком зупиняється щоразу, коли інструкція чекає на дані (наприклад, завантаження з пам'яті триває 200 тактів). Позачергове виконання (OOO) дозволяє процесору виконувати готові інструкції, поки інші чекають.
Реалізація використовує буфер переупорядкування (ROB) — кільцевий буфер, що містить інструкції в обробці у програмному порядку. Інструкції входять у ROB за порядком, можуть виконуватися позачергово, коли їхні входи готові, і фіксують результати в архітектурному стані за порядком (зберігаючи семантику винятків).
Сучасне ядро (Intel Core Ultra, AMD Zen 5) може відстежувати 300–500+ інструкцій в обробці у ROB одночасно. Це «вікно» інструкцій дозволяє апаратурі знаходити незалежні операції та виконувати їх паралельно на кількох виконавчих блоках.
6. Ієрархія кешу
Затримка пам'яті: основна DRAM потребує ~60–100 нс (~200 тактів). Без кешів процесор витрачав би 98% часу на очікування. Ієрархія кешу зберігає нещодавно використані дані поблизу процесора:
Штраф за промах кешу: промах L1 → L2: ~10 додаткових тактів. L2 → L3: ~30 тактів. L3 → DRAM: ~170 тактів. Написання дружнього до кешу коду (лінійні шаблони доступу, малі робочі набори, уникання хибного спільного доступу у багатопотоковому коді) часто є найбільшою доступною оптимізацією продуктивності.
Рядки кешу мають розмір 64 байти. Коли звертаються до будь-якого байта, завантажується весь 64-байтний рядок. Послідовна обробка масиву на 1 ГБ дає передбачувані шаблони доступу, які добре опрацьовують апаратні попереджувальні завантажувачі (prefetchers). Випадковий доступ катастрофічний для продуктивності.
7. Сучасні процесори: ядра, потоки та інше
- Кілька ядер: сучасні настільні процесори мають 8–32 фізичних ядра, кожне з власним конвеєром, регістрами та кешем L1/L2. Спільними є лише L3 і контролер пам'яті.
- Гіперпотоковість (Intel SMT): два апаратні потоки спільно використовують одне фізичне ядро. Перемикач потоків чергує виконання, заповнюючи «бульбашки» конвеєра одного потоку інструкціями іншого. Типова вигода: приріст пропускної здатності на 20–30% на серверних навантаженнях.
- SIMD: одна інструкція — багато даних. AVX-512 обробляє 16 значень float32 за одну інструкцію за такт. Одне ядро може досягати 2 × 16 × 3.5 ГГц × 2 (FMA) = 224 GFLOPS пікової продуктивності на 512-бітній математиці.
- Керування живленням: процесори динамічно масштабують напругу та частоту (DVFS). Неактивні ядра повністю відключаються від живлення. Turbo Boost підіймає частоту активних ядер вище номінального TDP, коли дозволяє тепловий запас.
- Техпроцеси: TSMC 3 нм (N3E) використовується в Apple M3, AMD Zen 5. Intel 18A (покоління 1.8 нм) виходить у виробництво 2025 року. Кількість транзисторів: Apple M3 Ultra — 184 мільярди транзисторів.