Хороше запитання чи хоча б одне із цікавою відповіддю. Частина цієї відповіді зображує світ, де процесори могли ефективно масштабувати ширину замість кількох окремих ядер. Ліцензійні / цінові моделі були б різними!
Решта пояснює, чому вони не можуть. Підсумок:
- Вартість декількох ядер масштабу близька до лінійно
- Вартість розширення масштабів надскалярного трубопроводу 1 ядра ~ квадратично Це можливо зробити з достатньою грубою силою, все одно до точки. Однопоточна продуктивність дуже важлива для інтерактивного використання (питання затримки в кінці, а не лише пропускної здатності), тому поточні високоякісні центральні процесори платять цю ціну. наприклад, Skylake (4-широкий), Ryzen (5 або 6-широк) та Apple A12 (7-широкий для великих ядер, 3-широкий для малих енергоефективних ядер)
- Серйозні зменшення IPC повертається від простого розширення трубопроводу за межі 3-х або 4-х ширини, навіть із виконанням поза замовленням для пошуку ILP . Пропуски відділення та кеш-помилки важкі, і все ще затримують весь конвеєр.
Ви не згадали про частоту, просто про IPC, але частоту масштабування теж важко. Більш висока частота вимагає більш високої напруги, тому масштаби потужності мають кубічну частоту : ^1
від частоти безпосередньо та ^2
від напруги. (Енергетичні шкали накопичуються в конденсаторі з V ^ 2, і більша частина динамічної потужності поза струмом витоку відбувається від закачування заряду в ємнісні навантаження воріт FET + дроти.)
Продуктивність = частота разів IPC. (У межах однієї архітектури. Ширший SIMD дозволяє вам виконувати ту саму роботу, виконуючи меншу кількість інструкцій, а деякі ISA щільніше, ніж інші, наприклад, MIPS часто приймає більше інструкцій, щоб виконати ту саму роботу, ніж x86 або AArch64.)
Витрати складаються в зоні штампу (вартість виготовлення) та / або потужності (що побічно обмежує частоту, оскільки охолодження важке). Також менша потужність та продуктивність на Ватт - сама по собі мета, особливо для мобільних пристроїв (акумулятор) та серверів (щільність енергії / витрати на охолодження / витрати на електроенергію).
До того, як багатоядерний на сокет був річчю, у вас були багатопроцесорні системи для високого класу використання, коли ви хотіли більше пропускної здатності, ніж це було досяжно за допомогою одного центрального процесора, який можна було б виготовити, тому це були єдині системи SMP. (Сервери, робочі станції високого класу).
Якщо одне ядро могло б масштабуватись так ефективно, як ви хотіли, ми мали б системи з 1 фізичним ядром на сокет і SMT (наприклад, HyperThreading), щоб вони могли діяти як декілька логічних ядер. Типові настільні / ноутбуки мали б лише одне фізичне ядро, і ми не будемо намагатися паралелізувати речі, які не масштабуються лінійно з більшою кількістю ядер. наприклад, make -j4
скористатися перевагами серверів з декількома сокетами та / або приховати затримку вводу / виводу на робочому столі. (Або, можливо, ми все-таки намагатимемося паралелізувати багато, якщо ширина трубопроводу легко масштабується, але IPC цього не зробила, тому нам довелося використовувати більше потоків SMT.) Вашому ядру ОС все одно потрібно буде працювати через усі логічні ядра, якщо тільки спосіб CPU Представлення SMT для ОС було дуже різним, тому паралельні алгоритми планування та блокування все ще знадобляться там.
Про це Дональд Кнут сказав в інтерв'ю 2008 року
Я міг би також трохи заграти про своє особисте нещастя з нинішньою тенденцією до багатоядерної архітектури. Мені це здається більш-менш схожим на те, що у дизайнерів апаратних засобів не вистачає ідей, і що вони намагаються перекласти провину за майбутнє зменшення Закону Мура на розробників програмного забезпечення , передавши нам машини, які працюють швидше лише на декілька ключові орієнтири!
Так, якби ми могли мати чудо-одноядерні процесори з 8-кратною пропускною спроможністю в реальних програмах , ми, мабуть, ще їх використовуємо. За системи подвійних розеток лише тоді, коли варто було платити набагато більше за більшу пропускну здатність (не однопоточну продуктивність).
Кілька ЦП зменшує витрати на перемикання контексту при запуску декількох програм (дозволяючи їм реально працювати паралельно замість швидкого перемикання між ними); попереджувальна багатозадачність, яка перериває потужну машину, яка не виходить з ладу, потрібна такому процесору, ймовірно, зашкодить навіть більше, ніж зараз.
Фізично це було б одне ядро (для простої ієрархії кешу без взаємозв'язків між ядрами), але підтримувало SMT (наприклад, HyperThreading Intel), щоб програмне забезпечення могло використовувати його як 8 логічних ядер, що динамічно конкурують за пропускну здатність. Або коли запущена / не застопорилася лише 1 нитка, вона отримала б повну користь.
Таким чином, ви б використовували кілька потоків, коли це насправді було легше / природніше (наприклад, окремі процеси, що працюють одразу), або для легко паралельних проблем із ланцюгами залежностей, які б перешкоджали максимізації IPC цього звіра.
Але, на жаль, бажано думати з боку Knuth, що багатоядерні процесори коли-небудь перестануть бути річчю на даний момент.
Масштабування однониткових характеристик
Я думаю, якби вони зробили 1 ядерний еквівалент 8-ядерного процесора, це одне ядро призвело б до збільшення IPC на 800%, щоб ви отримали повну продуктивність у всіх програмах, а не тільки в тих, які оптимізовані для декількох ядер.
Так, це правда. Якби взагалі можна було побудувати такий процесор , це було б дуже дивно. Але я думаю, що це буквально неможливо на одному виробництві напівпровідників (тобто однаковій якості / ефективності транзисторів). Це, звичайно, неможливо з таким же бюджетом живлення та областю відмирання, як 8-ядерний процесор, навіть якщо ви економите на логіці, щоб склеїти ядра разом, і не буде потрібно стільки місця для приватних кешів на ядро.
Навіть якщо ви дозволяєте збільшувати частоту (оскільки справжнім критерієм є робота за секунду, а не робота за такт), зробити навіть у 2 рази швидший процесор буде величезною проблемою.
Якщо б це було можливо в будь-якому місці поруч з тією ж силою і бюджет штампом площі ( при цьому виробничі витрати) , щоб побудувати такий процесор, так виробники CPU вже будуватимуть їх таким чином.
Зокрема, більше ядер чи ширших ядер? розділ, для того, щоб зрозуміти цю відповідь; все починається просто з того, як працюють конвеєрні процесори на замовлення, потім суперскаляр (кілька інструкцій на годинник). Потім пояснюється, як ми потрапили на енергетичну стіну прямо в епоху P4, що призводить до завершення простого масштабування, залишаючи в основному лише IPC і отримуючи більше роботи за інструкцію (наприклад, SIMD) як шлях вперед, навіть з меншими транзисторами.
Розширення трубопроводу ширше (максимум інструкцій на годинник), як правило, збільшує вартість як квадрат по ширині . Ця вартість оцінюється в області штампу та / або потужності для ширшої паралельної перевірки залежності (виявлення небезпеки) та більш широкого планувальника поза замовленнями, щоб знайти готові інструкції до запуску. І більше читати / записувати порти у вашому файлі реєстру та кешу, якщо ви хочете виконувати інші інструкції nop
. Особливо, якщо у вас є 3-вхідні вказівки, такі як FMA або доповнення з собою (2 регістри + прапорці).
Існують також зменшення віддачі IPC для розширення процесорів ; Більшість навантажень мають обмежений ILP невеликого / короткого діапазону (Instruction-Level Parallelism) для використання процесорів, тому розширення ядра не збільшує IPC (інструкції за такт), якщо IPC вже обмежений меншою, ніж ширина ядро ланцюжками залежностей, відгалуженнями філій, помилками кешу чи іншими стійлами. Впевнені, що ви отримаєте прискорення в деяких розкручених циклах з незалежними ітераціями, але це не те, на що більшість часу витрачає код. Інструкції щодо порівняння / розгалуження становлять 20% суміші інструкцій у "типовому" коді, IIRC. (Я думаю, що я читав числа від 15 до 25% для різних наборів даних.)
Крім того, пропуск кеша, який зупиняє всі залежні інструкції (а потім все, коли досягається ємність ROB), коштує дорожче для ширшого процесора. (Можлива вартість залишити більшу кількість одиниць виконання непрацюючою; більше потенційної роботи не закінчиться.) Або пропуск філії аналогічно спричиняє міхур.
Щоб отримати 8-кратну IPC, нам знадобиться принаймні 8-кратне покращення точності прогнозування галузей та частоти показів кешу . Але частота показів кешу недостатньо співпадає з ємністю кешу, яка минула певний момент для більшості навантажень. Попереднє завантаження HW є розумним, але не може бути таким розумним. І при 8-кратному IPC передбачувачі гілок повинні виробляти 8 разів більше прогнозів за цикл, а також робити їх більш точними.
Сучасні методи побудови процесорів, що виконуються поза замовленням, можуть знаходити ILP лише на невеликих діапазонах . Наприклад, розмір ROB Skylake - 224 Uops з плавленим доменом, у планувальника невиконаних Uops - 97 невиконаних доменів. Див. Розділ " Розуміння впливу впливів на цикл з двома довгими ланцюгами залежностей" для збільшення довжини для випадку, коли розмір планувальника є обмежуючим фактором для вилучення ILP з 2 довгих ланцюгів інструкцій, якщо вони занадто довгі. І / або дивіться цю більш загальну та вступну відповідь ).
Тож пошук ILP між двома окремими довгими петлями - це не те, що ми можемо зробити з обладнанням. Динамічна бінарна рекомпіляція для синтезу циклу може бути можливою в деяких випадках, але важко, а не те, що процесори дійсно можуть зробити, якщо вони не пройдуть маршрут Transmeta Crusoe. (шар емуляції x86 поверх іншого внутрішнього ISA; у цьому випадку VLIW). Але стандартні сучасні дизайни x86 із загальними кешами та потужними декодерами не просто перемогти для більшості кодів.
А за межами x86, всі ISA, які все ще використовуються, відносно легко розшифрувати, тому немає ніякої мотивації для динамічної перекомпіляції, крім оптимізації на великі відстані. TL: DR: сподівання на магічні компілятори, які можуть викрити більше ILP на апаратному забезпеченні, не вийшло для Itanium IA-64 , і навряд чи вдасться працювати над супершироким процесором для будь-якого існуючого ISA із серійною моделлю виконання.
Якщо у вас був надширокий процесор, ви, безумовно, хочете, щоб він підтримував SMT, щоб ви могли підтримувати його роботою, виконуючи декілька потоків з низьким рівнем ILP.
Оскільки Skylake наразі становить 4 уопи ширше (і досягає реального IPC від 2 до 3 уп на годину, або навіть ближче до 4 у високопропускному коді), гіпотетичний 8x ширший процесор буде 32-ширшим!
Бути в змозі вирізати це назад у 8 або 16 логічних процесорів, які динамічно діляться цими ресурсами виконання, було б фантастичним: нестабільні потоки отримують усю пропускну здатність та пропускну спроможність.
Але з 8 окремими сердечниками, коли нитка застоюється, немає нічого іншого, щоб зберігати одиниці виконання; інші нитки не приносять користі.
Виконання часто буває бурхливим: воно зупиняє очікування пропуску кеш-завантаження, тоді, коли паралельно надходить багато інструкцій, можна використовувати цей результат. Завдяки надширокому процесору цей вибух може пройти швидше, і це може допомогти SMT.
Але ми не можемо мати магічних надшироких процесорів
Отже, щоб отримати пропускну здатність, нам замість цього потрібно викласти паралелізм на апаратне забезпечення у вигляді паралелізму на рівні потоку . Як правило, компілятори не чудово знають, коли / як використовувати нитки, крім тих простих випадків, як дуже великі петлі. (OpenMP або gcc -ftree-parallelize-loops
). Все ще потрібно людська кмітливість для переробки коду, щоб ефективно виконувати корисну роботу паралельно, оскільки міжпотокове спілкування є дорогим, а також запуском потоків.
TLP - це крупнозернистий паралелізм, на відміну від дрібнозернистого ILP в межах однієї нитки виконання, яку HW може використовувати.
Процесори, спрямовані на інтерактивні навантаження (наприклад, Intel / AMD x86 та Apple / ARM AArch64 ядра високого класу), безумовно , підштовхують до зменшення віддачі від масштабування IPC, оскільки однопотокова продуктивність все ще така цінна, коли має значення затримка, а не лише пропускна здатність для масово паралельні проблеми.
Можливість запускати 8 копій гри паралельно зі швидкістю 15 кадрів в секунду набагато менш цінна, ніж можливість запускати одну копію зі швидкістю 45 кадрів в секунду. Постачальники процесорів це знають, і саме тому сучасні процесори використовують виконання поза замовленням, навіть якщо це коштує значної потужності та відмирає площі. (Але GPU це не так, оскільки їх завантаженість вже масово паралельна).
Багатоядерне обладнання Xeon Phi (Knight's Landing / Knight's Mill) від Intel є цікавим на півдорозі: дуже обмежене виконання поза замовленням і SMT для збереження 2-широких ядер, що живляться інструкціями SIMX AVX512 для стискання чисел. Сердечники базуються на архітектурі Silvermont з низькою потужністю Intel. (Exec-order exec, але з невеликим вікном для переупорядкування, набагато меншим, ніж багатоядерне сімейство Sandybridge. І вужчим трубопроводом.)
До речі, все це ортогонально для SIMD. Отримати більше роботи за інструкцію завжди допомагає, якщо це можливо для вашої проблеми.
Цінові моделі
Моделі ціноутворення на програмне забезпечення орієнтовані на сучасний ландшафт обладнання.
Моделі ліцензування на основі ядер набули більшого поширення (і стосуються навіть настільних комп'ютерів з однією розеткою) з появою багатоядерних процесорів. До цього це стосувалося лише серверів та великих робочих станцій.
Якщо програмному забезпеченню не потрібно було декілька ядер для запуску з максимальною швидкістю, насправді не було б способу продати його дешевше людям, які не отримують від нього стільки користі, оскільки вони запускають його на слабшому процесорі. Якщо, можливо, екосистема програмного забезпечення та обладнання не змінила елементи керування на "SMT-каналах", які дозволяють налаштувати максимальну ширину виконання для коду, що працює на цьому логічному ядрі. (Знову уявляємо собі світ, де процесори масштабуються в ширині трубопроводу замість кількох окремих ядер.)