Чому б не зробити одне велике ядро ​​процесора? [зачинено]


25

Я не розумію, чому виробники процесорів роблять багатоядерні чіпи. Масштабування декількох ядер є жахливим, це дуже специфічно для додатків, і я впевнений, що ви можете вказати на певну програму або код, який відмінно працює на багатьох ядрах, але більшість часу масштабування - це сміття. Це витрата простору з кремнієвих штампів і марно витрата енергії.

Наприклад, ігри майже ніколи не використовують більше чотирьох ядер. Наука та інженерні симуляції, такі як Ansys або Fluent, оцінюються залежно від кількості ядер ПК, на яких він працює, тому ви платите більше, тому що у вас більше ядер, але вигода більшої кількості ядер стає поганою за останні 16 ядер, але ви маєте ці 64 ядра робочі станції ... це марна трата грошей та енергії. Краще придбати на зиму обігрівач на 1500 Вт, набагато дешевше.

Чому вони не зроблять процесор лише одним великим ядром?

Я думаю, якби вони зробили одноядерний еквівалент восьмиядерного процесора, це одне ядро ​​призвело б до збільшення IPC на 800%, тож ви отримаєте повну продуктивність у всіх програмах, а не тільки в тих, які оптимізовані для декількох ядер. Більше IPC підвищує продуктивність скрізь, це надійний і простий спосіб підвищення продуктивності. Кілька ядер підвищують продуктивність лише в обмеженій кількості програм, а масштабування є жахливим і недостовірним.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату . Будь-які зроблені висновки слід відредагувати назад у питанні та / або будь-якій відповіді.
Трейд Дейва

Вас може зацікавити ця стаття: gotw.ca/publications/concurrency-ddj.htm
lvella

"але користь від більшої кількості ядер стає по-справжньому поганою за останні 16 ядер" Ви, очевидно, не знаєте, про що говорите. Повірте, я працював над процесами, які працюють на кількох десятках тисяч процесорів. Існує цілий клас проблем, який називається "Збентежуюче паралелізація", де викидання більшої кількості ядер на проблему працює дуже добре.
Арон

Відповіді:


93

Проблема полягає в припущенні, що виробники процесорів можуть просто додати більше транзисторів, щоб зробити одне ядро ​​процесора більш потужним без наслідків.

Щоб змусити центральний процесор робити більше, ви повинні спланувати, що означає, що робити більше. Дійсно три варіанти:

  1. Зробіть основний запуск на більш високій тактовій частоті - Проблема в тому, що ми вже стикаємося з обмеженнями того, що можемо зробити.

    Споживання енергії, а отже, і теплове розсіювання збільшується з частотою - якщо подвоїти частоту, ви номінально подвоюєте розсіювання потужності. Якщо ви збільшуєте напругу, то ваші розсіювання потужності збільшаться з площею напруги.

    Міжз'єднання та транзистори також мають затримки розповсюдження через неідеальну природу світу. Ви не можете просто збільшити кількість транзисторів і розраховувати, що зможете працювати на одній тактовій частоті.

    Нас також обмежує зовнішнє обладнання - головним чином оперативна пам'ять. Щоб зробити процесор швидшим, вам потрібно збільшити пропускну здатність пам’яті, або запустивши його швидше, або збільшивши ширину шини даних.


  1. Додайте більш складні інструкції - Замість запуску швидше ми можемо додати більш багатий набір інструкцій - загальні завдання, такі як шифрування тощо, можуть бути посилені в кремній. Замість того, щоб брати багато циклів тактових годин для обчислення у програмному забезпеченні, ми натомість маємо апаратне прискорення.

    Це вже робиться на процесорах комплексу інструкцій (CISC). Дивіться такі речі, як SSE2, SSE3. Сьогодні одне ядро ​​процесора набагато потужніше, ніж ядро ​​процесора ще 10 років тому, навіть якщо він працює на одній тактовій частоті.

    Проблема полягає в тому, що ви додаєте більш складні інструкції, ви додаєте більше складності і зробите чіп більше. Як прямий результат, процесор стає повільніше - помітні тактові частоти падають із збільшенням затримок розповсюдження.

    Ці складні інструкції також не допоможуть вам у виконанні простих завдань. Ви не можете загартувати кожен можливий випадок використання, тому неминуче великі частини програмного забезпечення, яке ви працюєте, не отримають користі від нових інструкцій, і насправді це буде завдано шкоди в результаті зменшення тактової частоти.

    Ви також можете збільшити ширину шини даних, щоб опрацювати більше даних одразу, однак, знову ж таки, це збільшує процесор і ви отримуєте компроміс між пропускною здатністю, отриманою за допомогою більшої шини даних, і зменшенням тактової частоти. Якщо у вас є лише невеликі дані (наприклад, 32-бітні цілі числа), наявність 256-бітного процесора не дуже допоможе вам.


  1. Зробіть процесор більш паралельним - замість того, щоб намагатися робити одну справу швидше, замість цього робити кілька речей одночасно. Якщо завдання, яке ви виконуєте, піддається функціонуванню декількох речей одночасно, то вам потрібно або один центральний процесор, який може виконувати кілька обчислень за інструкцію (Single Instruction Multiple Data (SIMD)), або має декілька процесорів, які можуть виконувати один розрахунок.

    Це один з ключових драйверів для багатоядерних процесорів. Якщо у вас працює кілька програм або ви можете розділити вашу одну програму на кілька завдань, то наявність декількох ядер процесора дозволяє робити більше справ одночасно.

    Оскільки окремі ядра процесора є ефективно відокремленими блоками (бар-кеші та інтерфейси пам'яті), кожне окреме ядро менше, ніж еквівалентне одне монолітне ядро. Оскільки ядро ​​більш компактне, затримки розповсюдження зменшуються, і ви можете запустити кожне ядро ​​швидше.

    Що стосується того, чи може одна програма отримати вигоду від наявності декількох ядер, це повністю залежить від того, що ця програма робить, і як вона була написана.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату . Будь-які зроблені висновки слід відредагувати назад у питанні та / або будь-якій відповіді.
Трейд Дейва

Одним із пунктів, зауважених у коментарях, досі не звертався до уваги, є те, що процесори можуть бути паралельними, виконуючи декілька інструкцій на годинник (Superscalar). Це ортогональне для SIMD та частоти; Інструкції на такт (IPC) - третій фактор фактичної пропускної здатності за час. Усі сучасні процесори для робочих навантажень з інтерактивним навантаженням принаймні 2-ширкі.
Пітер Кордес

1
Для більш точної відповіді читайте sciencedirect.com/topics/computer-science/…
Тоні Стюарт Сунніскігуй EE75

37

Окрім інших відповідей, є ще один елемент: вихід фішок . У сучасному процесорі є кілька мільярдів транзисторів, і кожен з цих транзисторів повинен працювати бездоганно, щоб ціла мікросхема працювала належним чином.

Роблячи багатоядерні процесори, ви можете чисто розділити групи транзисторів. Якщо в одному з ядер є дефект, ви можете відключити це ядро та продати чіп за зниженою ціною відповідно до кількості функціонуючих ядер. Так само ви можете також збирати системи з перевірених компонентів, як у системі SMP.

Практично для кожного процесора, який ви купуєте, він почав перетворюватися на найвищий рівень преміум-моделі для цієї лінійки процесорів. Що ви закінчите, залежить від того, які частини цього чіпа працюють неправильно та відключені. Intel не робить жодних i3-процесорів: усі вони несправні i7, а всі функції, які відокремлюють продуктові лінії, відключені через те, що вони не пройшли тестування. Однак порції, які все ще працюють, як і раніше корисні і можуть бути продані набагато дешевше. Все гірше стає брелоками для брелоків.

І дефекти - не рідкість. Ідеально створити ці мільярди транзисторів - непросте завдання. Якщо у вас немає можливостей вибірково використовувати частини даного чіпа, ціна результату буде швидко зростати.

За допомогою всього лише одного процесора über виробництво - це все або нічого, що призводить до набагато більш марного процесу. Для деяких пристроїв, як-от датчиків зображень для наукових чи військових цілей, де вам потрібен величезний датчик, і він повинен працювати, витрати на ці пристрої такі величезні, що лише державні бюджети можуть собі це дозволити.


4
Якщо / коли врожайність поліпшується і виробляють більш повноцінні робочі чіпи, ніж вимагає ринок, то постачальники зазвичай починають зливати частину ядер / кеш-пам'яті та / або бінінгувати їх на низькій частоті SKU, замість того, щоб коригувати структуру цін, щоб зробити високу - кінцеві чіпи порівняно дешевше. За допомогою графічних процесорів / графічних карт ви мали змогу розблокувати відключені шейдерні одиниці на деяких картах із хакерською програмою, щоб побачити, чи пощастило та отримали карту, де їх відключили лише для сегментації ринку, а не фактичних дефектів.
Пітер Кордес

4
Intel виготовила двоядерні штампи для деяких своїх мікросхем. Оскільки всі мобільні накопичувачі ULV (наднизької напруги) є двоядерними, не вистачає несправних чотирьохядерних ядер, а менша площа штампування (особливо з відключеним iGPU) дає більше працюючих двоядерних чіпів на вафель ніж сплавлення чотирьохядерних штампів. en.wikichip.org/wiki/intel/microarchitectures/… має штрихові знімки Sandybridge 131 мм² штампу розміром з двоядерною графікою + графікою GT1, проти 149 мм² двоядерної + графіки GT2 + 216 мм² квадратичного + GT2. Є ще місця для дефектів кешу тощо.
Пітер Кордес,

І (деякі) дефекти частини блоку FMA, ймовірно, можуть бути усунені шляхом їх вимикання та продажу у вигляді мікросхеми Celeron або Pentium (без AVX, тому лише 128-бітні вектори.) Навіть сучасним мікросхемам Skylake або Coffee Lake Pentium не вистачає AVX . Блоки SIMD FMA складають пристойну частку ядра (і запускають багато операцій SIMD, окрім математики FP, включаючи цілочисельні муль та цілочисельний зсув), тому я не здивуюся, якщо 2x 256-бітові одиниці FMA можна відобразити на 2х 128-розрядні за допомогою 2-х фрагментів все ще працюють. У Skylake Xeon є навіть SKU із зниженою пропускною здатністю AVX512 FMA (лише 1 робочий 512-бітний FMA)
Пітер Кордес,

@PeterCordes Якщо врожайність буде такою доброю, то виробники виводять більш високу щільність та / або більш швидку тактову частоту (і, отже, більш високий показник дефектів), поки показники дефектів не повернуться туди, де вони можуть відключити ядра та / або недоїдати чіпи. продати зі знижкою ..
Monty Harder

@MontyHarder: Це правда, але валідація коштує грошей і часу, а існуючі виробничі лінії будуть деякий час робити існуючі конструкції. Але так, деякі приклади Intel, про які ви говорите, - Haswell Refresh і різні доопрацювання Skylake, в основному без архітектурних змін та незначних поліпшень їх 14nm-процесу. (Іноді з новим iGPU). наприклад, Кабі Лейк, потім Кавове озеро тощо, як "оптимізація" кроків у нормальній каденції тик-такків від Intel.
Пітер Кордес

26

Залежність даних

Додавати більше інструкцій за годинник досить легко, зробивши чіп «ширшим» - таким був підхід «SIMD». Проблема полягає в тому, що це не допомагає більшості випадків використання.

Приблизно два види навантаження: незалежна та залежна. Прикладом незалежного навантаження може бути "задано дві послідовності чисел A1, A2, A3 ... і B1, B2, ... тощо, обчислити (A1 + B1) і (A2 + B2) і т.д." Цей вид навантаження спостерігається в комп'ютерній графіці, аудіообробці, машинному навчанні тощо. Досить багато цього було надано графічним процесорам, які призначені спеціально для роботи.

Залежним навантаженням може бути "Дано А, додайте до нього 5 і подивіться, що це в таблиці. Візьміть результат і додайте до нього 16. Подивіться, що це в іншій таблиці".

Перевага незалежного навантаження полягає в тому, що його можна розділити на безліч різних частин, тому в цьому допомагає більше транзисторів. Для залежних навантажень це зовсім не допомагає - більше транзисторів може зробити це лише повільніше . Якщо вам доведеться отримати значення з пам'яті, це швидкість для катастрофи. Сигнал повинен бути відправлений через материнську плату, подорожуючи підсвітлом, DRAM повинен зарядити рядок і дочекатися результату, а потім відправити його весь шлях назад. Це займає десятки наносекунд. Потім, зробивши простий розрахунок, вам доведеться відправити наступний.

Управління живленням

Запасні сердечники відключаються більшу частину часу. Насправді на досить багато процесорів ви не можете запускати всі ядра весь час без того, як річ запалиться, тому система вимкне їх або відключить їх замість вас.

Перезапис програмного забезпечення - єдиний шлях вперед

Обладнання не може автоматично перетворювати залежні робочі навантаження в незалежні. Ні програмне забезпечення не може. Але програміст, який готовий переробити свою систему, щоб просто скористатися великою кількістю ядер.


2
Цитування, необхідне для "не може запускати всі ядра одночасно". Якщо ви не вважаєте одноядерну максимальну тактову частоту тактової частоти "справжньою" тактовою частотою процесора. У класичному розумінні (до того, як ми вдарили про енергетичну стіну, і швидкість тактової частоти була обмежена критичними затримками поширення шляху), так, але це правда, але в сучасному світі є більш розумним дивитись на базову тактову частоту, як на те, що можна підтримувати з усіма сердечники, активні під час великого навантаження. Все, що вище, ніж підтяжка, ви можете умовно використати, коли це дозволяють обмеження потужності / теплових температур. (наприклад, Intel Turbo).
Пітер Кордес

1
Але з точки зору потужності навіть максимальний тактовий час на одній ядрі обмежений терміками більше, ніж затримки розповсюдження (хоча, ймовірно, межі стадії трубопроводу вибрані, тому ви близькі до цієї межі на цільовому максимальному турбо). І напруга теж мінлива: гірша потужність, але коротша затримка воріт. Так що все одно, не має сенсу розглядати одноядерний max turbo як те, що ви "повинні" мати можливість запускати всі ядра, тому що ця межа вже виходить від потужності.
Пітер Кордес

Контекст оригінального запитання, безумовно, ставив питання про одноядерну максимальну швидкість, і для багатьох практичних цілей, які (і його пропуск у кеші) є реальним обмежуючим фактором для сприйнятої швидкості для користувача.
pjc50

Так, ми б усі взяли 8-кратну одноточну ефективність замість 8-ядерного процесора, якби могли. (З SMT, щоб він міг працювати природними окремими навантаженнями без накладних переключень контексту. Дивіться мою відповідь.) Гіпотетичне надшироке ядро, ймовірно, зможе швидше працювати, коли навантаження спричинить багато затримок, замість того, щоб утримувати всі транзистори в SIMD-модулях FMA включаються і перемикаються кожен годинник. (Встановлення живлення в одному ядрі також є ключовим для того, щоб не плавитись у високих годин; en.wikipedia.org/wiki/Dark_silicon ). Тож наявність єдиного широкого ядра не відрізнятиме цього.
Пітер Кордес

Хоча у вас є думка, що однопоточна продуктивність, яку ми бачимо на поточних процесорах, краща, ніж якби вони були обмежені тактовою швидкістю, яку вони могли підтримувати на всіх ядрах одночасно навіть з найгіршим навантаженням. тобто Turbo є ключовим, особливо для деталей з низьким вмістом TDP, таких як мікросхеми ноутбука ( чому мій процесор не може підтримувати пікові показники в HPC ): зазвичай велике співвідношення між базовою та максимальною частотою turbo, на відміну від високої потужності, але з низьким числом основних ядер настільних ПК , наприклад, i7-6700k Skylake - 4 ГГц, одноядерний турбо 4,2 ГГц (без розгону; вище можливий при 95 Вт TDP).
Пітер Кордес

20

Повертаючись у часі, процесори не змогли запустити так швидко. Як результат, якщо ви хочете більше обробити, тоді вам потрібно було більше процесорів. Це може бути з математичним співпроцесором, а може бути просто з більшою кількістю одного і того ж процесора. Найкращим прикладом цього є переносник Inmos з 80-х років, який був спеціально розроблений для масової паралельної обробки з декількома підключеними процесорами. Вся концепція залежала від припущення, що немає кращого способу збільшення потужності обробки, ніж додавання процесорів.

Проблема в тому, що припущення було (тимчасово) неправильним. Ви також можете отримати більше процесорної потужності, змусивши один процесор зробити більше обчислень. Intel та AMD знайшли способи підняти тактову швидкість все вище, і, як ви кажете, все простіше тримати все на одному процесорі. Результатом було те, що до середини 2000-х ринок володів швидким одноядерним процесором. Інмос загинув на смерть на початку 90-х, і весь їхній досвід помер з ними.

Хоча добрі часи мали закінчитися. Як тільки тактові швидкості досягли ГГц, насправді не було можливості просуватися далі. І назад ми знову вирушили до декількох ядер. Якщо ви справді не можете отримати швидше, більше ядер - це відповідь. Як ви кажете, хоча не завжди ефективно використовувати ці ядра ефективно. Ми набагато кращі в наші дні, але ми все ще можемо зробити це так само просто, як це зробив Трансп'ютер.

Звичайно, є й інші варіанти вдосконалення - натомість ви можете бути ефективнішими. SIMD та подібні набори інструкцій покращують обробку для тієї самої кількості годинників. DDR швидше отримує ваші дані в процесор і виходить з нього. Все це допомагає. Але коли мова йде про обробку, ми знову повертаємося до 80-х та декількох ядер.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату . Будь-які зроблені висновки слід відредагувати назад у питанні та / або будь-якій відповіді.
Трейд Дейв

20

Хороше запитання чи хоча б одне із цікавою відповіддю. Частина цієї відповіді зображує світ, де процесори могли ефективно масштабувати ширину замість кількох окремих ядер. Ліцензійні / цінові моделі були б різними!

Решта пояснює, чому вони не можуть. Підсумок:

  • Вартість декількох ядер масштабу близька до лінійно
  • Вартість розширення масштабів надскалярного трубопроводу 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 вже будуватимуть їх таким чином.

Дивіться сучасні мікропроцесори 90-хвилинну інструкцію!

Зокрема, більше ядер чи ширших ядер? розділ, для того, щоб зрозуміти цю відповідь; все починається просто з того, як працюють конвеєрні процесори на замовлення, потім суперскаляр (кілька інструкцій на годинник). Потім пояснюється, як ми потрапили на енергетичну стіну прямо в епоху 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-каналах", які дозволяють налаштувати максимальну ширину виконання для коду, що працює на цьому логічному ядрі. (Знову уявляємо собі світ, де процесори масштабуються в ширині трубопроводу замість кількох окремих ядер.)


2
"запуск потоку дорого" - це не важкий факт; це артефакт загальних сучасних операційних систем.
MSalters

1
@MSalters І справді, деякі дослідницькі проекти досліджували, як приголомшливо було б відмовитися від цього підходу. Те ж саме з "розумністю людини переробляти код" - існують способи написання коду, які, природно, простіше паралелізувати, вони просто не були дуже популярні в останні кілька десятиліть. Там , де вони будуть використовуватися, як правило , ви можете побачити масивне горизонтальне масштабування при дуже низькій вартості; насправді, до того, що горизонтальне масштабування починає набагато дешевше, ніж вертикальне у багатьох програмах. Це просто означає, що ви не повинні давати розробникам вибір - якщо обставини змушують це, воно працює добре: D
Luaan

11

Дозвольте провести аналогію:

Якщо у вас є мавпа, яка набирає машинку, і ви хочете більше набирати текст, ви можете дати мавпі каву, уроки набору тексту, і, можливо, погрожуйте, щоб вона швидше працювала, але настає момент, коли мавпа буде набирати на максимальній потужності.

Тож якщо ви хочете більше набирати текст, вам доведеться отримати більше мавп.


Щоб продовжити аналогію, вам потрібна окрема друкарська машинка для кожної мавпи (що представляє шину даних, яка знадобиться кожному ядру), вам потрібен спосіб дістати банани до кожної мавпи і щось підбирати їх випадок (аналогічно розподілу енергії та тепла. розсіювання), і вам потрібен спосіб переконатися, що мавпи не всі намагаються набрати один і той же прохід у Дванадцяту ніч (аналогічно правильному розподілу навантаження між процесорами). Але все це менше роботи для отримання більшої вигоди, ніж намагання отримати більше набравши тексту однієї мавпи.


7

Ви вказуєте, що багато програмного забезпечення не використовують більше (x) ядер. Але це цілком обмеження, яке поставили дизайнери цього програмного забезпечення. Домашні ПК, що мають декілька ядер, все ще є новим (ish), а розробити багатопотокове програмне забезпечення також складніше з традиційними API та мовами.

Ваш ПК також не просто запускає цю 1 програму. Це робиться ціла купа інших речей, які можна поставити на менш активні ядра, щоб ваше основне програмне забезпечення не перебивалося ними настільки сильно.

Наразі неможливо просто збільшити швидкість одного ядра, щоб відповідати пропускній здатності 8 ядер. Більше швидкості, ймовірно, доведеться виходити з нової архітектури.

Оскільки більше ядер зазвичай доступні і API розроблені з таким припущенням, програмісти почнуть зазвичай використовувати більше ядер. Продовжуються зусилля, щоб зробити багатопоточні конструкції простішими. Якщо ви задали це питання через кілька років, ви, ймовірно, сказали б "Мої ігри зазвичай використовують лише 32 ядра, то чому мій процесор має 256?".


3
Різниця між 1 та кількома ядрами величезна в плані отримання програмного забезпечення для переваги. Більшість алгоритмів і програм є серійними. наприклад, Дональд Кнут сказав, що багатоядерні процесори виглядають так, як дизайнери HW " намагаються перекласти провину за майбутнє зменшення Закону Мура на розробників програмного забезпечення, надаючи нам машини, які працюють швидше лише за кількома ключовими орієнтирами! "
Пітер Кордес

На жаль, ще ніхто не придумав способу зробити єдине широке / швидке ядро ​​запустити однопоточну програму в будь-якому місці так швидко, як ми зможемо отримати ефективно-паралельний код для запуску через декілька ядер. Але, на щастя, дизайнери процесорів усвідомлюють, що однопоточна продуктивність все ще є критичною і робить кожне окреме ядро ​​набагато більшим і потужнішим, ніж це було б, якби вони збиралися для чистої пропускної здатності для паралельних проблем. (Порівняйте Skylake (4-широкий) або Ryzen (5-широкий) та серцевину Xeon Phi (Посадка лицаря / Рицарська млина на основі Silvermont + AVX512) (2-широкий та обмежений виконавець OoO)
Пітер Кордес,

2
У будь-якому випадку так, наявність принаймні 2 ядер часто корисна для багатозадачної ОС, але переважна багатозадачність на одному ядрі, яка була в 4 рази або 8 разів швидшою, ніж поточний процесор, була б досить хорошою. Для багатьох інтерактивних випадків використання, що було б набагато краще, якби взагалі можна було побудувати / з однаковим енергетичним бюджетом. (Подвійне ядро ​​допомагає зменшити витрати на переключення контексту, коли кілька завдань вимагають часу процесора.)
Пітер Кордес,

1
Все правда, але історично багатоядерне було дорожчим. Не було багато причин для розробки паралельних алгоритмів поза науковими програмами. Існує багато місця для паралелізації, навіть в алгоритмах, які вимагають переважно послідовного виконання. Але IPC поточного покоління не є великим і його легко зіпсувати. Що, як правило, призводить до помилок, яких важко знайти та виправити. Звичайно, в 4 рази швидший процесор буде дивовижним (але ви все одно хочете кілька ядер).
hekete

2
@PeterCordes Ну, більшість алгоритмів і програм не є серійними, тому що вони повинні бути, але в основному тому, що це робиться так, як це робилося завжди (з посипанням "це було гарним компромісом"). Найбільш кричущі випадки, коли ви можете просто запустити одну і ту ж програму чотири рази на чотирьох окремих робочих навантаженнях і змусити їх працювати паралельно без жодних проблем. Але це викликає ще одну проблему - процесор не є вузьким місцем, що часто, і зазвичай шлях до нього - використовувати кращі алгоритми, а не більше процесорів. Іноді вони допомагають і з іншими вузькими місцями (пам'ять, диск, мережа ...).
Луаан

3

Найбільш переконливою причиною з історичної точки зору є розсіювання влади .

Після Pentium IV Intel намагалася переробити процесор наступного покоління з кодовою назвою Tejas, який повинен був працювати в діапазоні від 4 ГГц до 12 ГГц. Проблема полягала в тому, що біг із такою швидкістю генерував занадто багато тепла, щоб бути життєздатним.

Після того, як Tejas був скасований, Intel зайняв ще 10 - 15 років, перш ніж вони нарешті мали ядра на 4 ГГц з прийнятним рівнем тепла.

Дивіться Теяс і Джейхаук .

Паралельно з Tejas у Intel був ще один проект, який включав використання декількох ядер. Цей проект мав прийнятні рівні тепла, тож таким шляхом вони йшли. Це дозволило їм збільшити продуктивність зараз, а не чекати ще 10 років на 10 нм процесах виготовлення.

Якщо припустити, що ядра не голодують ресурсом, то для отримання однакової кількості інструкцій в секунду з одного ядра замість N ядер вам знадобиться швидкість введення цього одного ядра в N рази швидше. Динамічне розсіювання потужності ядра ЦП лінійно пропорційно робочій частоті. Він також пропорційний площі робочої напруги. Біг на нижчих частотах дозволяє використовувати менші робочі напруги. Використання менших напруг на нижчих частотах означає, що практично кажучи вироблене тепло знижується разом з кубом робочої частоти.

Крайнім прикладом цього є людський мозок, який може виконувати еквівалент 2 ^ 18 операцій в секунду, використовуючи лише 20 Вт потужності. Це досягається, використовуючи мільярди нейронів, що працюють паралельно зі швидкістю лише кілька сотень Гц.

Також пам’ятайте, що на ПК зазвичай працюють одразу сотні чи тисячі потоків. Операційна система обробляє виділення часу на серцевину для кожної нитки. Тож навіть якщо окрема програма не користується всіма ядрами, вона все одно виграє, оскільки інші програми забирають менше її часу на процесор, якщо вони працюють на іншому ядрі.

Якщо що-небудь, ринок високої продуктивності переходить до більш паралельної обробки у вигляді FPGA. Нещодавно Intel придбала Altera (другий за величиною виробник FPGA) і зараз продає плати з апаратним прискорювачем FPGA. Програмне забезпечення може завантажувати FPGA із зображенням під час виконання за допомогою виклику API. Потім процесор подає дані в FPGA і дозволяє виконувати більшу частину роботи. Типи програм - це кодування відео, AI, візуалізація, пошук у базі даних тощо.


Також пам’ятайте, що на ПК зазвичай працюють одразу сотні чи тисячі потоків. Ні, не працює . На сучасних настільних комп’ютерах існує багато потоків, але майже всі вони сплять в очікуванні вводу / виводу або таймера в будь-який момент часу. наприклад, середнє завантаження (за останню хвилину) на моєму робочому столі Linux наразі складає 0,19 завдань, активно готових використовувати час процесора в будь-який момент. Якби я запускав кодування відео, x264 запускав би декілька потоків, щоб ОС планувала розклад на декілька ядер, але лише приблизно стільки, скільки у мене є логічних ядер.
Пітер Кордес

І BTW, OP (чомусь) повністю опустив частоту, і запитав про масштабування IPC (інструкції за тактовим циклом), а не за секунду. Те, що ви говорите, є правдою, але вони пропонували зробити процесори ширшими , а не накрученими вище. Я вже це вирішив у своїй відповіді, тому ваша відповідь, що пояснює масштабування потужності частотою, є приємним доповненням, +1.
Пітер Кордес

@PeterCordes Це правильно, я не мав на увазі, що всі потоки виконуються відразу, але, звичайно, по черзі. Дякуємо за уточнення.
user4574

Ну не стільки "по черзі", скільки вони зовсім не готові до запуску. Вони в основному всі сплять, як правило, лише прокидаючись для короткого сплеску обчислень, наприклад, після того, як ОС доставить рівне натискання клавіші або зчитування мережі, або прокидається через те, що минув таймер. Більш ніж 2 прокидаються рідко, коли ви насправді робите щось обчислювально інтенсивне. І якщо ви є, ви не запускаєте сотні ниток, ви запускаєте кількість потоків ~ = кількість доступних ядер.
Пітер Кордес

2

Просто, щоб округлити картину, куди все це йде ...

Нейронні мережі та AI - це надзвичайно гарячі теми на даний момент. Однією з причин є те, що можна ефективно використовувати велику кількість простих ядер паралельно і так витягувати близькі до максимальної продуктивності. Ця вимога за своєю суттю є масовою паралельністю і досить легко відображається на масиві процесорів, не вимагаючи особливого зв'язку між ядрами. Ось чому GPU були першою гото-технологією для прискорення ШІ. Зараз ми бачимо мікросхеми, оптимізовані навіть краще, ніж відео графічні процесори для мереж, що виходять на ринок. Наступним, або, можливо, завершальним кроком є ​​створення НМ за допомогою аналогічних технологій, таких як мемрістори.

І в сторону, в чомусь подібному до ігрового ПК на графічній карті набагато більшу продуктивність, ніж у багатоядерного процесора Intel або AMD


2
Re "... властиво масово паралельне" : Навіть бентежно паралельне ?
Пітер Мортенсен

1

По суті, втрати CMOS пропорційно частоті (^ 1,5) пропорційні частоті, а паралельна продуктивність процесора дещо менша, ніж лінійна пропорційна кількості процесорів.

Таким чином, співвідношення обчислювальної потужності до розсіювання потужності покращується для додатків з декількома процесорами з різними тактовими частотами при порівнянні швидкості та кількості процесорів для фіксованого розсіювання потужності.

Це складніше, ніж це, але це основи, чому паралельні процесори краще вдаряться за Втт в динамічних програмах. Завжди будуть винятки, коли оптимізовано під один сценарій.

Це не розмір більшого процесора, що робить його швидшим для типових програм для ПК ПК Intel / AMD, а саме зменшений розмір від літографічної роздільної здатності та меншої ємності затвора, що зменшує потужність разом зі зниженим рівнем нижнього порогового значення та напругою в ядрі.

Поліпшення не є лінійним і не означає, що 8 ядер в 4 рази краще, ніж 2, але мета, якщо його буде досягнуто, - це мати більше динамічний діапазон обробки з придушенням розсіювання потужності, швидкості та напруги, щоб покращити як продуктивність, так і ефективність та пікову потужність на вимогу без надмірне підвищення температури.

Для отримання більш наукової відповіді читайте https://www.sciencedirect.com/topics/computer-science/dynamic-power-consumption


-2

Багатокольори зазвичай не є багатомасштабними. І багатоскалярні ядра не є багатоядерними.

Це було б досконалим знаходженням багатоскалярної архітектури, що працює на декількох мегагерцах, але в цілому її мости були б не задіяними споживачами, але дорогими, тому тенденція полягає в багатоядерному програмуванні на більш низькій частоті, а не в коротких інструкціях з високою тактовою частотою.

Кілька інструкційних ядер дешевше і простіше керувати, і тому погана ідея мати багатосказальну архітектуру в декількох гігагерцах.


1
Ви маєте на увазі "суперскаляр", кілька інструкцій на годинник? Більшість багатоядерних процесорів - це суперскаляр. наприклад, Ryzen 5-ти широкий. Мікросхема AArch64 високого класу Apple має ширину 6 або 8. Для 2-широкого процесора, який можна використовувати в більшості кодів, існує багато низько висячих фруктів, тому варто зробити кожне ядро ​​принаймні 2-ширше, перш ніж масштабувати декілька ядер, для кожного з яких потрібен власний кеш-пам'ять та взаємозв'язок між ядрами ( наприклад, багатоядерні обчислювальні карти Xeon Phi від Intel мають багато ядер подвійного випуску). Те ж саме для ядер смартфона: маленькі сердечники розміром принаймні 2-х ширини. Однопоточна продуктивність має значення!
Пітер Кордес

1
Або ви мали на увазі dl.acm.org/citation.cfm?id=224451 - дослідницький документ про те, що вони називають ядрами "багатоскалярні", які шукають ILP за більшими діапазонами в графіку контрольного потоку програми високого рівня, використовуючи комбінація HW та SW. Основні процесори, які ми використовуємо в настільних комп'ютерах та смартфонах, не такі, вони просто звичайний суперскаляр із виконанням поза замовленням, реалізуючи послідовний ISA, який прикидається виконувати інструкції по черзі.
Пітер Кордес

Спасибі. afaik, ідея скалярної арки - це вимірюваність тепла за відомими або заздалегідь заданими наборами інструкцій (справа AVX). <br/> Розрахунок поточних архітектур проти тепла вважається не обчислимо передбачуваним. це підвищує неймовірність, коли багатоядерні можуть працювати на великих частотах, оскільки їх здатність виконувати в ідеалі час / тепло не піддається обчисленню. це все, що я знаю поки що. Я копаю векторні машини для того, щоб зрозуміти фізику "багатосказалів". випадок - ксеон / фій слідують ідеальній тепловій кривій, як це робив стародавній чіп підвищення досвіду клієнтів
Machtur

Набори інструкцій SIMD на зразок AVX - це спосіб отримати більшу роботу через конвеєр без необхідності розширювати весь конвеєр, просто одиниці виконання. Наприклад, Skylake може виконувати 3 vpaddd ymm0, ymm1, ymm2інструкції за годинник, кожна з яких виконує 8 упакованих 32-бітних цілих чисел. Таким чином, 24 цілих додавання за годинник, але техніка для виконання поза замовленням "лише" повинна відслідковувати 3 інструкції під час польоту. Це набагато дешевше побудувати, ніж процесор, який міг би виконувати 24 add eax, edxінструкції на добу. SIMD - це в основному ортогональна ширина трубопроводу.
Пітер Кордес

Skylake - хороший випадок оптимізації за тактовий цикл. Варіантів безліч, я не в них, що цікаві випадки внутрішньої оптимізації шини, оскільки skylakes таким чином інтегрує Xeon оригінальне завантаження в трубопровід SIMD. Я припускаю, що одне велике ядро ​​інтегрує розвантаження та обчислення за кілька циклів, як це (наприклад, феномен) для AVX. це шлях, яким обчислення інтегровано вперед, порівняно з потужністю, необхідною для внутрішніх блокових операцій. на відміну від декількох коротких інструкцій, як у Gpu-подібних, з декількома "віртуальними" ядрами, подібними до доповнень до Nehalem
machtur
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.