Чому чіп Haswell від Intel дозволяє множині FP бути вдвічі швидшим за додавання?


35

Я читав це дуже цікаве запитання на темі Stack Overflow:

Чи дійсно множинне множення дійсно робиться з тією ж швидкістю, що і додавання в сучасному процесорі?

В одному з коментарів сказано:

"Нічого не варто, що на Haswell пропускна здатність множення FP вдвічі перевищує FP-додавання. Це тому, що обидва порти 0 і 1 можна використовувати для множення, але для додавання можна використовувати лише порт 1. - багаторазово додає, оскільки обидва порти можуть це робити. "

Чому саме вони дозволяли б удвічі більше одночасних множень порівняно з додаванням?


3
Дякую @DKNguyen! Але множення передбачає набагато більше електроніки, ніж додавання (насправді додавання - це останній крок множення, тому будь-яка схема, необхідна для множення, також буде включати все, що потрібно для додавання), тож я не бачу, як це може зайняти меншу площу відмирання!
користувач1271772

5
Множення ФП - це додавання. Дивіться логарифми.
Янка

9
@Janka Хоча множення FP вимагає додавання покажчиків, мантіс все ще потрібно насправді множити. Зберігається мантіса - це не логарифм.
Елліот Олдерсон

6
FWIW у Skylake пропускну здатність «чистого доповнення» було подвоєно, тому це цікавість з епохи Хасвелла / Бродвелл, а не якась притаманна річ.
Гарольд

4
@ user1271772 так, вони однакові порти: додавання в порти 0 і 1, а також множення також на порти 0 і 1. До Skylake тільки порт 1 міг обробляти чисте додавання. Це також поширюється на деякі допоміжні операції, а саме min / max / порівняння µop перетворення, що робить фактичне перетворення (там також часто відбувається перетасування або завантаження µop)
harold

Відповіді:


37

Це, можливо, відповідає заголовку питання, якщо не органу:

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

Додано до ОП: Зауважте, що додавання довжини 2 міліметри та 2 кілометри не є 4 з жодної одиниці. Це через необхідність перетворення того чи іншого вимірювання в ту саму шкалу або представлення одиниці перед додаванням. Це перетворення вимагає, по суті, множення на деяку потужність 10. Те ж саме зазвичай має відбуватися під час додавання плаваючої точки, тому що числа з плаваючою комою є формою цілочисленних змінних масштабів (наприклад, є одиниця або масштабний коефіцієнт, показник, пов'язаний з кожне число). Тому вам може знадобитися масштабувати одне з чисел потужністю 2, перш ніж додавати необроблені біти мантіси, щоб обидва представляли однакові одиниці чи масштаб. Це масштабування по суті є простою формою множення на потужність 2. Таким чином, додавання плаваючої точки вимагає множення(що, маючи потужність 2, може бути виконано зі змінним бітовим зсувом або стовбуровим перемикачем, що може вимагати відносно довгих проводів по відношенню до розмірів транзисторів, що може бути відносно повільним у глибоких субмікронних літографічних схемах). Якщо два числа в основному скасовуються (оскільки одне майже негативне значення іншого), можливо, виникає необхідність змінити масштаб результату додавання, а також відповідного форматування результату. Таким чином, додавання може бути повільним, якщо додатково потрібно 2 етапи множення (до і після) кроків, що оточують двійкове додавання необробленої (кінцевої) кількості бітів мантіси, що представляють еквівалентні одиниці або масштаби, в силу характеру формату числа (плаваюча точка IEEE ).

Додано №2: Крім того, багато контрольних показників мають вагу FMACS (множиться-накопичується) більше, ніж голі. У злитому MAC вирівнювання (зсув) додавання часто може здійснюватися здебільшого паралельно множенням, а додавання мантіси часто може бути включено до дерева CSA перед остаточним розповсюдженням перенесення.


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

3
Я дзвоню BS. Безумовно, дійсне множення в операції множення FP, можливо, не може бути складніше, ніж два зсуви бареля.
користувач253751

5
"важче", потенційно швидше і варто оптимізувати, враховуючи обмеження та цілі проекту, це 4 різні речі.
hotpaw2

3
@immibis: Перед Haswell, процесори Intel мали 1 SIMD FP-модуль (3 циклу затримки) та 1 SIMD FP муль-одиниця (5 циклів затримки). Тож додавання швидше, ніж множення. (Ось чому Haswell зберігав окремий модуль додавання FP при додаванні 2x FMA-одиниць для fma та mul замість того, щоб запускати його на блоці FMA, як це робить SKL). Крім того, зсуви SIMD-int працюють із затримкою 1с порівняно з SIMD-int mul при 5с затримки (піггітування на значущихі множниках у FMA-одиниці). Так що так, зрушення набагато дешевше, ніж примноження. І add, і mul повністю прокладені, тому їм обом потрібен окремий зсув ствола для нормалізації виходу.
Пітер Кордес

22

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

А тепер подумайте, як складно додати два числа в логарифмічній формі ...

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

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

(Перший зсув вирівнює обидва входи з однаковою потужністю 2, так що біт мантіси має однакову бінарну вагу в кожному операнді.

Десяткового прикладу буде достатньо (хоча, очевидно, використовується двійковий) ...

(3103)+(110-1)=(3103)+(0,0001103)

Другий повторно масштабує вихід ...

1100+(-0,999100)=0,001100=110-3

Як не парадоксально, додаток FP передбачає щось дуже схоже на два множення, які повинні бути виконані послідовно, з додаванням мантіси між ними. У такому світлі звітність про діяльність не настільки дивна.


8
«Поміркуйте, як важко додати два числа в логарифмічній формі» було досить освічуючим.
Пітер - Відновіть Моніку

1
хоча на щастя, експоненти з плаваючою точкою є лише цілими числами, тому вам не доведеться додавати нічого, як 1,3 + 2,3 = 2,34, це лише зміщення мантіс.
ilkkachu

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

2
@immibis: ваше спостереження правильне. Але питання йде так: "чому це так? Чому немає двох одиниць додавання, враховуючи, що додавання набагато простіше / дешевше, ніж mpy?" Частина відповіді полягає в тому, що "на ПП це справді не простіше". Решта зводиться до економіки: враховуючи фактичні витрати та багато вивчення очікуваного навантаження, другий додаток не виправдав своє місце в кремній. Залишаю інші відповіді, щоб розширити цю частину.
Брайан Драммонд

Деякі комп'ютерні вчені (наприклад, Кахан (архітектор IEEE754 FP) та Кнут) стверджують, що "мантісса" - це неправильне слово, оскільки воно лінійне (не логарифмічне). Переважним сучасним терміном є значення. en.wikipedia.org/wiki/Significand#Use_of_%22mantissa%22 . "mantissa" - холодніше слово з меншою кількістю складів.
Пітер Кордес

16

TL: DR : оскільки Intel вважає, що затримка додавання SSE / AVX FP важливіша, ніж пропускна здатність, вони вирішили не запускати її на підрозділах FMA в Haswell / Broadwell.


Haswell запускає (SIMD) FP множиться на тих самих одиницях виконання, що і FMA ( Fused Multiply-Add ), з яких їх два, оскільки деякий FP-інтенсивний код може використовувати в основному FMA, щоб зробити 2 FLOP за інструкцію. Затримка 5 циклів як у FMA, так і в mulpsпопередніх процесорах (Sandybridge / IvyBridge). Haswell хотів 2 FMA-одиниці, і немає недоліків дозволити множині працювати, тому що вони однакові затримки, як і присвячений одиниці множення в попередніх процесорах.

Але він зберігає виділений SIMD FP-модуль для додавання з попередніх процесорів, як і раніше, запуск addps/ addpdз 3 циклом затримки. Я читав, що можливим міркуванням може бути той код, який робить багато FP додає тенденцію до вузького місця затримки, а не пропускної здатності. Це, безумовно, справедливо для наївної суми масиву, що має лише один (векторний) акумулятор, як ви часто отримуєте від автоматичної векторизації GCC. Але я не знаю, чи Intel публічно підтвердив, що це було їх міркуванням.

Бродуелл такий же ( алеmulpsmulpd затримка / до 3с затримки, коли FMA залишився на рівні 5с). Можливо, їм вдалося скоротити підрозділ FMA і отримати результат множення, перш ніж робити додавання фіктивних записів 0.0, або, можливо, щось зовсім інше, і це занадто спрощено. BDW здебільшого зменшується на ТВС, більшість змін є незначними.

У Skylake все FP (включаючи додавання) працює на блоці FMA з 4 циклами затримки та 0,5 пропускної здатності, за винятком звичайно div / sqrt та побітових булевих (наприклад, для абсолютного значення чи заперечення). Intel, очевидно, вирішила, що не варто додаткового кремнію для додавання FP з меншою затримкою або що незбалансована addpsпропускна здатність була проблематичною. А також стандартизація затримок дозволяє уникнути конфліктів при записі (коли в одному циклі готові 2 результати) простіше уникнути загального планування. тобто спрощує порти планування та / або завершення.

Так, так, Intel змінила це в наступній важливій редакції мікроархітектури (Skylake). Зменшення затримки FMA на 1 цикл зробило вигоду спеціалізованого модуля SIMD FP, що додає модуль набагато менше, для випадків, які обмежуються затримкою.

Skylake також показує ознаки того, що Intel готується до AVX512, де розширення окремої SIMD-FP-добавки до ширини 512 біт зайняло б ще більшу область відмирання. Як повідомляється, Skylake-X (з AVX512) має майже ідентичне ядро ​​для звичайного клієнта Skylake, за винятком більшого кешу L2 та (у деяких моделях) додаткового 512-бітового модуля FMA, "прикрученого" до порту 5.

SKX відключає порт 1 SIMD ALU, коли 512-бітні Uops знаходяться в польоті, але йому потрібен спосіб виконання vaddps xmm/ymm/zmmв будь-якій точці. Це зробило наявність спеціалізованого модуля ADD ADP на порт 1 проблемою і є окремою мотивацією для зміни від виконання існуючого коду.

Забавний факт: все від Skylake, KabyLake, Coffee Lake і навіть Cascade Lake були мікроархітектурно ідентичними Skylake, за винятком Cascade Lake, який додав нові інструкції AVX512. IPC не змінився інакше. Однак новіші процесори мають кращі iGPU. Крижане озеро (мікроархітектура Сонячного узбережжя) вперше за кілька років ми побачили фактично нову мікроархітектуру (за винятком ніколи широко випущеного озера Кеннон).


Аргументи, що ґрунтуються на складності підрозділу FMUL проти блоку FADD, є цікавими, але не актуальними в даному випадку . Підрозділ FMA включає в себе все необхідне обладнання для переміщення для того, щоб додати FP як частину FMA 1 .

Примітка: я не маю на увазі fmulінструкцію x87 , я маю на увазі SSE / AVX SIMD / скалярний FP, помножуючи ALU, який підтримує 32-бітну одноточність / floatта 64-бітну doubleточність (53-бітне значення aka mantissa). наприклад інструкції, як mulpsабо mulsd. Фактичний 80-бітний x87fmul як і раніше лише 1 / тактова пропускна здатність на Haswell, на порту 0.

Сучасні процесори мають більш ніж достатньо транзисторів для вирішення проблем, коли це того варто , і коли це не спричиняє проблем із затримкою поширення на відстані фізичної відстані. Особливо для виконавчих підрозділів, які працюють лише деякий час. Дивіться https://en.wikipedia.org/wiki/Dark_silicon та цей документ про конференцію 2011 року: Темний кремній та кінець багатоядерного масштабування. Саме це дає можливість процесорам мати величезну пропускну здатність FPU та велику цілочисленну пропускну спроможність, але не обидва одночасно (адже ці різні одиниці виконання знаходяться в одних і тих же портах диспетчеризації, тому вони конкурують між собою). У великій кількості ретельно налаштованого коду, який не обмежує пропускну здатність пам’яті, обмежуючим фактором є не резервні блоки виконання, а натомість пропускна здатність інструкцій. ( широкі сердечники дуже дорогі ). Дивіться також http://www.lighterra.com/papers/modernmicroprocessors/ .


До Хасвелла

До HSW такі процесори Intel, як Nehalem та Sandybridge, мультиплікацію SIMD FP на порт 0 та додавання SIMD FP на порт 1. Отже, були окремі одиниці виконання та пропускна здатність була збалансована. ( https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle

Haswell представив підтримку FMA в процесори Intel (через пару років після того, як AMD представила FMA4 в Bulldozer, після того, як Intel підробила їх , чекаючи, як тільки вони зможуть оприлюднити, що вони збираються впровадити 3-операндний FMA, а не 4-операндовий -деструктивне призначення FMA4). Веселий факт: AMD Piledriver все ще був першим процесором x86 з FMA3, близько року до Haswell в червні 2013 року

Це вимагало деяких великих злому внутрішніх служб, щоб навіть підтримати єдиний генерал з 3 входами. Але в будь-якому випадку, Intel ввімкнула все-таки і скористалася незмінними транзисторами, щоб поставити два 256-бітні SIMD-модулі FMA, зробивши Haswell (та його наступники) звірами для математики FP.

Ціль продуктивності, на яку Intel, можливо, пам’ятав, що це продукт BLAS з щільним математичним та векторним точковим продуктом. Обидва з них в основному можуть використовувати FMA і не потрібно просто додавати.

Як я вже згадував раніше, деякі робочі навантаження, які роблять здебільшого або лише додавання ПП, обмежуються затримкою додавання (в основному) не пропускною здатністю.


Виноска 1 : І з множником 1.0FMA буквально можна використовувати для додавання, але з гіршою затримкою, ніж addpsінструкція. Це потенційно корисно для робочих навантажень, таких як підсумовування масиву, який є гарячим в кеш-пам'яті L1d, де FP додає пропускну здатність більше, ніж затримка. Це допомагає лише, якщо ви використовуєте декілька векторних акумуляторів, щоб приховати затримку, звичайно, і тримати 10 FMA операцій під час польоту в блоках виконання FP (5c затримка / 0,5c пропускна здатність = 10 операцій затримка * пропускна здатність продукту). Це потрібно зробити і під час використання FMA для векторного крапкового продукту .

Дивіться, як написано Девід Кантер про мікроархітектуру Сендібридж, яка має блок-схему того, які ЄС є, на якому порту для NHM, SnB та AMD Bulldozer-сім'ї. (Дивіться також таблиці інструкцій Agner Fog та посібник з мікроарха оптимізації Asm, а також https://uops.info/, який також має експериментальне тестування Uops, портів та затримки / пропускної здатності майже кожної інструкції для багатьох поколінь мікроархітектур Intel.)

Також пов'язано: https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle


1
У разі , якщо Ви ставите питанням про те , щоб взяти моє слово для цього: на переповнення стека, у мене є золоті значки в тому числі [cpu-architecture], [performance], [x86-64], [assembly], і [sse]. Я написав відповідь на код C ++ для тестування гіпотези Collatz швидше, ніж рукописний збір - чому? що багато людей думають, що це добре. Також це стосується виконання OoO конвеєрами.
Пітер Кордес

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

2
@jpaugh: Див. en.wikipedia.org/wiki/Tick%E2%80%93tock_model - План Intel приблизно з 2006 року (поки вони не потрапили на блок-перешкод на 10 нм) був зменшений під час нового процесу з незначними іншими змінами, а потім новою архітектурою про вже перевірений процес. Пам’ятайте, що розробка розробляється роками з кількома майбутніми проектами в польоті: вони не закінчують одну перед початком наступного. Бродуелл завжди мав бути лише "галочкою" перед "таккою" Skylake, яка повністю скористалася їхнім 14-нм виробничим процесом і не повинна турбуватися про налагодження процесу, лише дизайн
Пітер Кордес

Я ціную посилання. Ви, по суті, повторили мої настрої, хоча і з набагато більшою точністю, ніж я міг зібрати.
jpaugh

8

Я буду дивитись на цю частину:
"Чому це вони дозволять " ...
TL; DR - тому що вони спроектували це саме так. Це рішення управління. Звичайно, є відповіді мантіси та перемикачів, але це речі, які входять у рішення управління.

Чому вони спроектували саме так? Відповідь полягає в тому, що специфікації зроблені для досягнення певних цілей. Ці цілі включають ефективність та вартість. Продуктивність орієнтована не на операції, а на еталон, як FLOPS або FPS в Crysis.
Ці орієнтири матимуть сукупність функцій, деякі з них можна обробити одночасно.
Якщо дизайнери вважають, що наявність двох функцій віджета A робить це набагато швидше, а не дві функції віджета B, то вони йтимуть із віджетом А. Реалізація двох A та двох B буде коштувати дорожче.

Озираючись назад, коли суперскалярні та надпровідні трубопроводи (раніше багатоядерні) вперше стали поширеними на комерційних мікросхемах, вони були там, щоб підвищити продуктивність. Пентій має дві труби, і жоден вектор не об'єднує. У Haswell є більше труб, векторних одиниць, більш глибока труба, виділені функції тощо. Чому немає всього всього? Тому що вони спроектували саме так.


Більш релевантною ціллю ефективності може бути BLAS щільний матмул та векторний крапковий продукт. Обидва з них в основному можуть використовувати FMA і не потрібно просто додавати.
Пітер Кордес

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

1
Я бачив огляди процесора, які включають такі еталони, як Linpack. Але як би там не було, як ви кажете (теоретичний макс) FLOPS рекламується, і це, в основному, проксі для продуктивності matmul, якщо кеш може продовжувати. Я не впевнений, чи якісь тести SPECfp наближаються до насичення обох одиниць FMA на HSW або SKL, але показники SPEC мають велике значення. Не всі продажі є роздрібними одноразовими продажами; деякі - це складні покупці, такі як покупці кластерних суперкомп'ютерів, які вирішують, коли оновити, або корпоративні ферми серверів. На мою думку, націнки вищі і на цих продажах.
Пітер Кордес

6

Ця діаграма від Intel може допомогти:

Огляд виконавчої частини Haswell

Здається, вони давали кожній одиниці FMA (зрощене множення-додавання), а також множник і єдиний суматор. Вони можуть або не мають спільного використання обладнання.

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

Ви можете, як було зазначено, використовувати обидва порти, щоб зробити додавання за допомогою інструкції FMA, де параметр множення дорівнює 1, обчислюючи (A x 1) + B. Це буде трохи повільніше, ніж голе додавання.


FP множина працює на FMA пристрої. FP додавання працює з меншою затримкою лише на спеціальному блоці додавання SIMD FP лише на порт 1. Можливо, він поділяє деякі транзистори з FMA блоком на цьому порту, але, з того, що я прочитав, у мене склалося враження, що для забезпечення цього потрібна значна додаткова площа.
Пітер Кордес

опублікував відповідь з більш детальною інформацією.
Пітер Кордес

4

Давайте подивимося на трудомісткі кроки:

Додавання: вирівняйте експоненти (можливо, це велика операція зсуву). Один 53-бітний суматор. Нормалізація (до 53 біт).

Множення: Одна масивна суматорна мережа для зменшення 53 х 53 однорозрядних продуктів до суми двох 106-бітних чисел. Один 106-бітний суматор. Нормалізація. Я б сказав, зменшення бітових продуктів до двох чисел можна зробити так само швидко, як і кінцевий суматор.

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

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

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


Процесорні процесори Intel насправді обробляють субнормальне множення (вхід чи вихід) за допомогою мікрокодування; тобто звичайний FPU сигналізує про виняток замість того, щоб мати додатковий етап конвеєра для цього випадку. Agner Fog каже повторно: Sandybridge У моїх тестах випадки підливу та деннормальних чисел розглядалися так само швидко, як і звичайні числа з плаваючою комою для додавання, але не для множення. Ось чому для компіляції з -ffast-mathнаборами FTZ / DAZ (змити деннормали до нуля), щоб зробити це замість того, щоб скористатися допомогою FP.
Пітер Кордес

У посібнику з мікроарха Agner він каже, що завжди існує штраф, коли операції зі звичайними входами дають субнормальний вихід. Але додавання нормального + субнормального не має штрафу. Таким чином, підсумковий огляд може бути неточним, або керівництво uarch є неточним. Агнер каже, що у «Найт Ландінг» (Xeon Phi) не передбачено жодного субнормального коду на mul / add, а лише поділ. Але KNL має більшу затримку додавання / mul / FMA (6c), ніж основний Haswell (5c) / SKL (4c). Цікаво, що AMD Ryzen має штраф в декількох циклах, порівняно з великим штрафом для сім'ї бульдозерів.
Пітер Кордес

За обмеженням, GPU - це пропускна здатність, а не затримка, тому вони, як правило, мають фіксовану затримку для всіх випадків, навіть для субнормальних. Захоплення мікрокодом, мабуть, навіть не є можливим для такого типу трубопроводів з голими кістками.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.