Проектування процесора для забезпечення високої продуктивності набагато більше, ніж просто збільшення тактової частоти. Існує чимало інших способів підвищення продуктивності, що використовуються в законі Мура та допомагають розробці сучасних процесорів.
Тарифи на годинник не можуть збільшуватися нескінченно.
На перший погляд може здатися, що процесор просто виконує потік інструкцій один за одним, при цьому підвищення продуктивності досягається за рахунок більшої тактової частоти. Однак тільки збільшення тактової частоти недостатньо. Споживання енергії та тепловіддача зростають із збільшенням тактових частот.
З дуже високою тактовою частотою стає необхідним значне збільшення напруги в ядрі процесора . Оскільки TDP збільшується з площею V- сердечника , ми зрештою досягаємо точки, коли надмірне споживання енергії, тепловіддача та охолодження запобігають подальшому збільшенню тактової частоти. Ця межа була досягнута в 2004 році, в часи Пентіума 4 Прескотта . Хоча останні покращення енергоефективності допомогли, значне збільшення тактової частоти вже неможливо. Дивіться: Чому виробники процесорів припинили збільшувати тактову швидкість своїх процесорів?
Графік швидкості запасів тактових частот на передових ПК-ентузіастах протягом багатьох років. Джерело зображення
- Через закон Мура , спостереження, в якому йдеться про те, що кількість транзисторів на інтегральній схемі подвоюється кожні 18 - 24 місяці, в основному внаслідок зменшення штампів , були застосовані різні методи підвищення продуктивності. Ці методи були удосконалені та вдосконалені протягом багатьох років, що дозволяє виконувати більше інструкцій протягом певного періоду часу. Ці методи обговорюються нижче.
Здається, послідовні потоки інструкцій часто можуть бути паралельними.
- Хоча програма може просто складатися з серії інструкцій для виконання одна за одною, ці вказівки або їх частини дуже часто можуть виконуватися одночасно. Це називається паралелізмом рівня інструкцій (ILP) . Експлуатація ILP життєво важлива для досягнення високої продуктивності, а сучасні процесори використовують численні методи для цього.
Трубопроводи розбивають інструкції на більш дрібні шматки, які можна виконувати паралельно.
Кожна інструкція може бути розбита на послідовність етапів, кожен з яких виконується окремою частиною процесора. Інструктаж на конвеєрі дозволяє безліч інструкцій проходити ці кроки один за одним без необхідності чекати, коли кожна інструкція закінчиться повністю. Трубопровід забезпечує більш високу тактову частоту: якщо на кожному циклі тактового циклу буде виконано один крок кожної інструкції, потрібно буде менше часу для кожного циклу, ніж якби цілі інструкції мали виконуватися по черзі.
Класичний трубопровід RISC містить п'ять етапів: FETCH інструкції, інструкція декодування, виконання інструкцій, доступ до пам'яті і зворотного запис. Сучасні процесори розбивають виконання на набагато більше кроків, створюючи більш глибокий конвеєр з більшою кількістю ступенів (і збільшуючи досяжну тактову частоту, оскільки кожна стадія менша і потрібно менше часу на завершення), але ця модель повинна забезпечити базове розуміння того, як працює конвеєр.
Джерело зображення
Однак трубопровід може спричинити небезпеку, яку необхідно вирішити для забезпечення правильного виконання програми.
Оскільки різні частини кожної інструкції виконуються одночасно, можливі конфлікти, які заважають правильному виконанню. Вони називаються небезпеками . Існує три типи небезпек: дані, структурні та контрольні.
Небезпеки даних виникають, коли інструкції читають і змінюють одні й ті самі дані одночасно або в неправильному порядку, що може призвести до неправильних результатів. Небезпеки в структурі виникають, коли необхідно використовувати декілька інструкцій одночасно для певної частини процесора. Небезпеки управління виникають, коли зустрічається умовна інструкція гілки.
Ці небезпеки можуть бути усунені різними способами. Найпростіше рішення - просто затримати трубопровід, тимчасово перестаючи виконувати один або інструкції в трубопроводі, щоб забезпечити правильні результати. Цього уникати, коли це можливо, оскільки це знижує продуктивність. Для небезпеки даних такі методи, як переадресація операндів , використовуються для зменшення зупинок. Небезпеки контролю подолані шляхом прогнозування галузей , що потребує спеціального лікування та висвітлено в наступному розділі.
Прогнозування гілки використовується для усунення небезпек управління, які можуть порушити весь трубопровід.
Небезпеки контролю, які виникають при дотриманні умовної гілки , є особливо серйозними. Гілки запроваджують можливість того, що виконання буде продовжено в іншому місці програми, а не просто наступна інструкція в потоці інструкцій, виходячи з того, чи є певна умова істинною чи помилковою.
Оскільки наступну інструкцію для виконання не можна визначити, поки не буде оцінено стан гілки, неможливо вставити будь-які вказівки в трубопровід після гілки за відсутності. Тому трубопровід спорожняється ( змивається ), що може витратити майже стільки годинних циклів, скільки є етапи в трубопроводі. Гілки, як правило, трапляються дуже часто в програмах, тому небезпеки управління можуть сильно вплинути на продуктивність процесора.
Прогнозування гілки вирішує це питання, здогадуючись, чи буде взято гілку. Найпростіший спосіб зробити це просто припустити, що гілки завжди беруть або ніколи не беруть. Однак сучасні процесори використовують набагато складніші методи для підвищення точності прогнозування. По суті, процесор відстежує попередні гілки і використовує цю інформацію будь-яким із кількох способів, щоб передбачити наступну інструкцію для виконання. Потім трубопровід може подаватися з інструкціями з правильного місця на основі прогнозу.
Звичайно, якщо прогноз невірний, будь-які вказівки будуть винесені через трубопровід після відгалуження гілки, тим самим промивши трубопровід. В результаті точність гілки прогнозування стає все більш критичною, оскільки трубопроводи стають все довші та довші. Конкретні методи прогнозування галузей виходять за рамки цієї відповіді.
Кеші використовуються для прискорення доступу до пам'яті.
Сучасні процесори можуть виконувати інструкції та обробляти дані набагато швидше, ніж до них можна отримати доступ в основній пам'яті. Коли процесор повинен отримати доступ до оперативної пам’яті, виконання може затримуватися протягом тривалих періодів часу, поки дані не стануть доступними. Для пом'якшення цього ефекту в процесор входять невеликі швидкодіючі пам'яті, які називаються кешами .
Через обмежений простір, доступний на штампі процесора, кеші мають дуже обмежений розмір. Щоб максимально використати цю обмежену ємність, кеші зберігають лише останні або часто доступні дані ( часова локальність ). Оскільки доступ до пам’яті, як правило, кластеризується в певних областях ( просторова локалізація ), блоки даних, що знаходяться поблизу недавно отриманого доступу, також зберігаються в кеші. Див.: Місцевість довідки
Кеші також організовані в кілька рівнів різного розміру для оптимізації продуктивності, оскільки більші кеші, як правило, повільніше, ніж менші кеші. Наприклад, процесор може мати кеш рівня 1 (L1), який має розмір лише 32 КБ, тоді як кеш рівня 3 (L3) може бути великим на кілька мегабайт. Розмір кешу, а також асоціативність кешу, що впливає на те, як процесор управляє заміною даних на повний кеш, суттєво впливають на підвищення продуктивності, які отримуються за допомогою кешу.
Виконання поза замовленням зменшує зупинки через небезпеку, дозволяючи першим виконувати незалежні інструкції.
Не кожна інструкція в потоці інструкцій залежить одна від одної. Наприклад, хоча a + b = c
повинно бути виконано до того c + d = e
, a + b = c
і d + e = f
є незалежними і можуть бути виконані одночасно.
Виконання поза замовленнями використовує цей факт, щоб дозволити виконувати інші незалежні інструкції, коли одна інструкція зупиняється. Замість того, щоб вимагати інструкцій виконувати одну за одною в режимі блокування,додається обладнання для планування , що дозволяє виконувати незалежні інструкції в будь-якому порядку. Інструкції надсилаються до черги інструкцій та видаються у відповідну частину процесора, коли потрібні дані стануть доступними. Таким чином, інструкції, які застрягли в очікуванні даних з попередньої інструкції, не пов'язують більш пізні інструкції, які не є незалежними.
Джерело зображення
- Для виконання позамовного виконання потрібно кілька нових та розширених структур даних. Вищезазначена черга інструкцій, станція бронювання , використовується для зберігання інструкцій, поки дані, необхідні для виконання, не стануть доступними. Буфер повторного замовлення (БОР) використовуються для відстеження стану команд в прогресі, в тому порядку , в якому вони були отримані, так що інструкції будуть завершені в правильному порядку. Для перейменування реєстру потрібен файл реєстру, який виходить за рамки кількості реєстрів, наданих самою архітектурою , що допомагає запобігти незалежним інструкціям в іншому випадку через необхідність спільного використання обмеженого набору реєстрів, що надаються архітектурою.
Надскалярні архітектури дозволяють виконувати одночасно декілька інструкцій в потоці інструкцій.
Обговорені вище методи лише підвищують продуктивність інструкції. Ці методики не дозволяють виконати більше однієї інструкції за тактовий цикл. Однак часто можна виконувати окремі інструкції в потоці інструкцій паралельно, наприклад, коли вони не залежать один від одного (про що йдеться у розділі виконання поза замовленням вище).
Надскалярні архітектури користуються цим паралелізмом на рівні інструкцій, дозволяючи надсилати інструкції відразу декільком функціональним підрозділам. Процесор може мати кілька функціональних одиниць певного типу (таких як цілі ALU) та / або різні типи функціональних одиниць (наприклад, одиниці з плаваючою комою та цілі числа), до яких можуть одночасно надсилатися інструкції.
У суперскалярному процесорі інструкції заплановані, як у дизайні поза замовленням, але зараз є порти декількох випусків , що дозволяють видавати та виконувати різні інструкції одночасно. Розширена схема декодування інструкцій дозволяє процесору читати кілька інструкцій одночасно у кожному тактовому циклі та визначати взаємозв'язки між ними. Сучасний високопродуктивний процесор може запланувати до восьми інструкцій за тактовий цикл, залежно від того, що робить кожна інструкція. Ось так процесори можуть виконати кілька інструкцій за тактовий цикл. Дивіться: Двигун виконання Haswell на AnandTech
Джерело зображення
- Однак надскалярні архітектури дуже важко спроектувати та оптимізувати. Перевірка залежностей серед інструкцій вимагає дуже складної логіки, розмір якої може масштабуватися експоненціально, оскільки кількість одночасних інструкцій збільшується. Крім того, залежно від програми, існує лише обмежена кількість інструкцій у кожному потоці інструкцій, які можуть бути виконані одночасно, тому зусилля щодо використання більшої переваги ILP страждають від зменшення віддачі.
Додаються більш вдосконалені інструкції, які виконують складні операції за менший час.
Зі збільшенням транзисторних бюджетів стає можливою реалізація більш досконалих інструкцій, які дозволять виконувати складні операції за частину часу, який вони б зайняли в іншому випадку. Приклади включають векторні набори інструкцій, такі як SSE і AVX, які виконують обчислення на декількох фрагментах даних одночасно, і набір інструкцій AES, який прискорює шифрування даних і дешифрування.
Для виконання цих складних операцій сучасні процесори використовують мікрооперації (μops) . Складні інструкції розшифровуються в послідовності мкоп, які зберігаються всередині виділеного буфера і плануються для виконання окремо (настільки, наскільки це дозволяє залежність від даних). Це забезпечує більше місця для процесора для використання ILP. Для подальшого підвищення продуктивності спеціальний кеш-пам'ять μop може бути використаний для зберігання нещодавно декодованих мкоп, так що мкоп для нещодавно виконаних інструкцій можна швидко шукати.
Однак додавання цих інструкцій не збільшує продуктивність автоматично. Нові інструкції можуть підвищити продуктивність лише в тому випадку, якщо програма написана для їх використання. Прийняття цих інструкцій перешкоджає тому, що програми, що використовують їх, не працюватимуть на старих процесорах, які не підтримують їх.
То як ці методи покращують продуктивність процесора з часом?
З роками трубопроводи стали довші, скорочуючи кількість часу, необхідний для завершення кожного етапу, і, отже, забезпечуючи більш високу тактову частоту. Однак, серед іншого, довші трубопроводи збільшують штраф за неправильне прогнозування гілки, тому трубопровід не може бути занадто довгим. Намагаючись досягти дуже високих тактових частот, процесор Pentium 4 використовував дуже довгі трубопроводи, до 31 етапу в Прескотті . Щоб зменшити дефіцит продуктивності, процесор намагатиметься виконувати інструкції, навіть якщо вони можуть вийти з ладу, і продовжуватиме намагатися, поки їм це не вдасться . Це призвело до дуже високого споживання електроенергії та знизило продуктивність, отриману від гіпер-різьблення . Нові процесори більше не використовують трубопроводи так довго, тим більше, що масштабування тактової частоти досягло стіни;Haswell використовує трубопровід, який варіюється між 14 та 19 етапами, а архітектури з меншою потужністю використовують більш короткі трубопроводи (Intel Atom Silvermont має від 12 до 14 ступенів).
Точність прогнозування галузей покращилася з більш досконалими архітектурами, зменшивши частоту промивів трубопроводу, викликаних помилковим прогнозуванням, і дозволяючи одночасно виконувати більше інструкцій. Враховуючи довжину трубопроводів у сучасних процесорах, це важливо для підтримки високої продуктивності.
Зі збільшенням транзисторних бюджетів у процесор можна вбудовувати більші та ефективніші кеші, зменшуючи стійкість через доступ до пам'яті. Доступ до пам'яті може вимагати більше 200 циклів для завершення в сучасних системах, тому важливо максимально зменшити необхідність доступу до основної пам'яті.
Новіші процесори краще використовувати переваги ILP за допомогою більш досконалої логіки виконання суперскаліру та «ширших» конструкцій, що дозволяють дешифрувати та виконувати більше інструкцій одночасно. Архітектура Haswell може декодувати чотири інструкції та відправляти 8 мікрооперацій за цикл годин. Збільшення бюджетів транзисторів дозволяє включити до ядра процесора більше функціональних одиниць, таких як цілі ALU. Ключові структури даних, що використовуються у виконанні поза замовлення та надскалярного виконання, такі як станція резервування, буфер замовлення та файл реєстру, розширені в нових конструкціях, що дозволяє процесору шукати більш широке вікно інструкцій щодо використання їх ILP. Це головна рушійна сила підвищення продуктивності в сучасних процесорах.
Більш складні інструкції включені в новіші процесори, і все більша кількість додатків використовує ці інструкції для підвищення продуктивності. Удосконалення технології компілятора, включаючи вдосконалення вибору інструкцій та автоматичної векторизації , дозволяють ефективніше використовувати ці інструкції.
На додаток до вищезазначеного, більша інтеграція деталей, які раніше були зовнішніми для процесора, таких як північний міст, контролер пам'яті та смуги PCIe, зменшують затримку вводу / виводу та пам'яті. Це збільшує пропускну здатність за рахунок зменшення затримок, викликаних затримкою доступу до даних з інших пристроїв.