Dlaczego chip Haswella Intela pozwala na dwukrotne zwiększenie mnożenia FP?

35

Czytałem to bardzo interesujące pytanie na temat przepełnienia stosu:

Czy mnożenie liczb całkowitych rzeczywiście odbywa się z taką samą prędkością jak dodawanie na nowoczesnym procesorze?

Jeden z komentarzy powiedział:

„Nic nie warte jest tego, że w Haswell przepustowość multiplikacji FP jest dwukrotnie większa niż w przypadku dodawania FP. Jest tak, ponieważ oba porty 0 i 1 mogą być używane do mnożenia, ale tylko port 1 może być używany do dodawania. To powiedziawszy, można oszukiwać za pomocą fuzji -multiply dodaje, ponieważ oba porty mogą to zrobić. ”

Dlaczego dopuszczają dwa razy więcej jednoczesnych zwielokrotnień w porównaniu do dodawania?

użytkownik1271772
źródło
3
Dziękuję @DKNguyen! Ale mnożenie wymaga znacznie więcej elektroniki niż dodawania (w rzeczywistości dodawanie jest ostatnim krokiem zwielokrotniania, więc wszelkie obwody potrzebne do zwielokrotnienia obejmują również wszystko, co jest potrzebne do dodawania), więc nie rozumiem, jak może zajmować mniej miejsca na kości!
user1271772,
5
Mnożenie FP jest dodatkiem. Zobacz logarytmy.
Janka
9
@Janka Chociaż mnożenie FP wymaga dodania wykładników, nadal konieczne jest pomnożenie mantysy. Przechowywana mantysa nie jest logarytmem.
Elliot Alderson
6
FWIW w Skylake podwoiła przepustowość „czystego dodatku”, więc jest to ciekawostka z epoki Haswell / Broadwell, a nie jakaś nieodłączna rzecz.
Harold
4
@ user1271772 tak, jednak są to te same porty: dodawanie na portach 0 i 1 oraz mnożenie także na portach 0 i 1. Przed Skylake tylko port 1 mógł obsłużyć czysty dodatek. Dotyczy to również niektórych operacji podobnych do dodawania, mianowicie min / max / porównaj µop konwersji, która dokonuje faktycznej konwersji (często występuje tam przetasowanie lub obciążenie µop)
Harold

Odpowiedzi:

37

Prawdopodobnie odpowiada to na pytanie, jeśli nie na ciało:

Dodawanie zmiennoprzecinkowe wymaga wyrównania dwóch mantys przed ich dodaniem (w zależności od różnicy między dwoma wykładnikami), potencjalnie wymagając dużej zmiennej wartości przesunięcia przed sumatorem. Następnie może być potrzebna renormalizacja wyniku dodawania mantysy, potencjalnie wymagająca innej dużej zmiennej wartości przesunięcia, aby poprawnie sformatować wynik zmiennoprzecinkowy. Dwa manetki beczki mantysy potencjalnie wymagają zatem większych opóźnień bramki, większych opóźnień drutu lub dodatkowych cykli, które przekraczają opóźnienie dobrze zwartego przedniego końca multiplikatora przenoszenia-zapisywania-sumowania-drzewa.

Dodano dla OP: Należy pamiętać, że dodanie długości 2 milimetrów i 2 kilometrów nie jest równe 4 żadnej jednostce. Wynika to z potrzeby konwersji jednego lub drugiego pomiaru na tę samą skalę lub reprezentację jednostki przed dodaniem. Ta konwersja wymaga zasadniczo pomnożenia przez pewną potęgę 10. To samo zwykle musi się zdarzyć podczas dodawania liczb zmiennoprzecinkowych, ponieważ liczby zmiennoprzecinkowe są formą liczb całkowitych o zmiennej skali (np. Istnieje współczynnik jednostki lub skali, wykładnik, związany z każdy numer). Może więc być konieczne skalowanie jednej z liczb o potęgę 2 przed dodaniem surowych bitów mantysy, aby obie reprezentowały te same jednostki lub skalę. To skalowanie jest zasadniczo prostą formą mnożenia przez potęgę 2. Zatem dodawanie zmiennoprzecinkowe wymaga zwielokrotnienia(która jest potęgą 2, można to zrobić za pomocą zmiennego przesunięcia bitów lub dźwigni cylindra, co może wymagać stosunkowo długich drutów w stosunku do rozmiarów tranzystorów, które mogą być względnie wolne w głębokich obwodach submikronowych do litografii). Jeśli dwie liczby w większości się anulują (ponieważ jedna jest prawie ujemna względem drugiej), może zaistnieć potrzeba przeskalowania wyniku dodania, a także odpowiedniego sformatowania wyniku. Tak więc dodawanie może być powolne, jeśli ponadto wymaga 2 mnożenia (przed i po) kroków otaczających binarne dodawanie surowej stałej (skończonej) liczby bitów mantysy reprezentujących równoważne jednostki lub skalę, ze względu na charakter formatu liczb (zmiennoprzecinkowy IEEE ).

Dodano # 2: Ponadto wiele benchmarków waży FMACS (wielokrotnie się akumuluje) więcej niż gołe sumy. W skondensowanym MAC wyrównanie (przesunięcie) dodatku można często wykonać równolegle z mnożeniem, a dodatek mantysy można często włączyć do drzewa CSA przed ostateczną propagacją przenoszenia.

hotpaw2
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu . Wszelkie wyciągnięte wnioski powinny być ponownie edytowane w pytaniu i / lub każdej odpowiedzi.
Dave Tweed
3
Dzwonię do BS. Z pewnością faktyczne zwielokrotnienie w operacji zwielokrotniania FP nie może być trudniejsze niż dwie zmiany beczki.
user253751,
5
„trudniejsze”, potencjalnie szybsze i warte optymalizacji, biorąc pod uwagę ograniczenia projektu i cele, to 4 różne rzeczy.
hotpaw2
3
@immibis: Przed Haswellem procesory Intel miały 1 jednostkę dodawania SIMD FP (opóźnienie 3 cykli) i 1 jednostkę mnożącą SIMD FP (opóźnienie 5 cykli). Więc dodawanie jest szybsze niż mnożenie. (Dlatego właśnie Haswell zachował osobną jednostkę dodawania FP podczas dodawania 2x jednostek FMA dla fma i mul zamiast uruchamiać ją na jednostce FMA, jak robi to SKL). Również przesunięcia SIMD-int działają z opóźnieniem 1c, w porównaniu do mul SIMD-int z opóźnieniem 5c (niedozwolone na mnożnikach znaczenia i mnożników w jednostce FMA). Tak, zmiana jest znacznie tańsza niż pomnożenie. Zarówno add, jak i mul są w pełni potokowe, więc oba potrzebują osobnego mechanizmu zmiany lufy, aby znormalizować wydajność.
Peter Cordes,
22

W multiplikacji FP przetwarzanie wykładnicze okazuje się prostym dodawaniem (z tego samego powodu, dla którego mnożenie w domenie dziennika jest jedynie dodawaniem). Mam nadzieję, że natknąłeś się na logarytmy.

Zastanówmy się teraz, jak trudno jest dodać dwie liczby w postaci logarytmicznej ...

Punkt zmiennoprzecinkowy zamieszkuje szary obszar między domenami liniową i logarytmiczną, z aspektami obu. Każdy numer FP zawiera mantysę (która jest liniowa) i wykładnik (logarytmiczny). Aby określić znaczenie każdego bitu w mantysie, musisz najpierw spojrzeć na wykładnik potęgi (który jest tylko współczynnikiem skali).

Ponadto FP, przetwarzanie wykładnika w ogólnym przypadku wymaga dwukrotnego przesunięcia mantysy, przy czym każde przesunięcie baryłki jest w rzeczywistości specjalnym przypadkiem nieco uproszczonego zwielokrotnienia.

(Pierwsze przesunięcie wyrównuje oba wejścia do tej samej mocy 2, dzięki czemu bit mantysy ma taki sam ciężar binarny w każdym operandzie.

Wystarczy ułamek dziesiętny (choć oczywiście używany jest plik binarny) ...

(3)103))+(110-1)=(3)103))+(0,0001103))

Drugi przeskalowuje wyjście ...

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

Paradoksalnie więc dodanie FP wiąże się z czymś bardzo podobnym do dwóch multiplikacji, które muszą być wykonane sekwencyjnie, z dodatkiem mantysy między nimi. W tym świetle zgłoszona wydajność nie jest tak zaskakująca.

Brian Drummond
źródło
8
„Zastanów się, jak trudno jest dodać dwie liczby w postaci logarytmicznej” było dość pouczające.
Peter - Przywróć Monikę
1
choć na szczęście wykładniki zmiennoprzecinkowe są tylko liczbami całkowitymi, więc nie musisz dodawać niczego takiego jak 1,3 + 2,3 = 2,34, to tylko przesunięcie mantysy.
ilkkachu
1
Powodem, dla którego możesz wykonać dwa mnożenia na cykl, jest to, że istnieją dwie jednostki mnożenia, a nie dlatego, że jednostka mnożenia jest szybsza niż jednostka dodatkowa (patrz diagram w odpowiedzi pjc50). Nie możesz odpowiedzieć na to pytanie, wyjaśniając, dlaczego uważasz, że jednostka dodatkowa jest wolniejsza niż jednostka mnożenia. Poza tym, jak dotąd inne odpowiedzi mówią, że jednostka dodawania ma mniejsze opóźnienie, co sugeruje, że dodawanie jest prostszą operacją.
user253751,
2
@immibis: Twoja obserwacja jest poprawna. Ale pytanie brzmi: „dlaczego tak jest? Dlaczego nie ma dwóch jednostek dodawania, biorąc pod uwagę, że dodawanie jest o wiele prostsze / tańsze niż mpy?” Część odpowiedzi brzmi: „w FP to naprawdę nie jest prostsze”. Reszta sprowadza się do ekonomii: biorąc pod uwagę faktyczny koszt i wiele badań dotyczących oczekiwanego obciążenia pracą, drugi sumator nie uzasadnił swojego miejsca w krzem. Pozostałe odpowiedzi pozostawię do rozwinięcia w tej części.
Brian Drummond,
Niektórzy informatycy (np. Kahan (architekt IEEE754 FP) i Knuth) twierdzą, że „mantysa” to niewłaściwe słowo, ponieważ jest liniowe (nie logarytmiczne). Preferowany nowoczesny termin ma znaczenie. en.wikipedia.org/wiki/Sinentand#Use_of_%22mantissa%22 . „mantysa” to chłodniejsze słowo z mniejszą liczbą sylab.
Peter Cordes
16

TL: DR : ponieważ Intel uważał, że opóźnienie dodawania SSE / AVX FP jest ważniejsze niż przepustowość, postanowili nie uruchamiać go na urządzeniach FMA w Haswell / Broadwell.


Haswell uruchamia (SIMD) FP mnożąc się na tych samych jednostkach wykonawczych co FMA ( Fused Multiply-Add ), z których ma dwa, ponieważ niektóre intensywnie wykorzystujące FP kody mogą używać głównie FMA do wykonania 2 FLOP na instrukcję. mulpsTyle samo opóźnień 5 cykli, co FMA, i jak we wcześniejszych procesorach (Sandybridge / IvyBridge). Haswell chciał 2 jednostek FMA i nie ma żadnej wady pozwalającej na mnożenie na obu, ponieważ mają one takie samo opóźnienie jak dedykowana jednostka mnożąca we wcześniejszych procesorach.

Ale utrzymuje dedykowaną jednostkę dodającą SIMD FP z wcześniejszych procesorów, aby nadal działać addps/ addpdz 3 opóźnieniami cyklu. Czytałem, że możliwym powodem może być ten kod, który dodaje wiele FP, ma tendencję do wąskiego gardła pod względem opóźnienia, a nie przepustowości. Z pewnością dotyczy to naiwnej sumy tablicy z jednym akumulatorem (wektorowym), jak to często bywa z automatycznym wektoryzowaniem GCC. Ale nie wiem, czy Intel publicznie potwierdził, że takie było ich rozumowanie.

Broadwell jest taki sam ( ale przyspieszył mulps/mulpd opóźnienie do 3c, podczas gdy FMA pozostał na poziomie 5c). Być może udało im się skrócić jednostkę FMA i uzyskać wynik mnożenia przed dodaniem fałszywego dodatku 0.0, a może coś zupełnie innego i to jest zbyt uproszczone. BDW jest głównie kurczeniem się HSW, przy czym większość zmian jest niewielka.

W Skylake wszystko FP (łącznie z dodawaniem) działa na jednostce FMA z opóźnieniem 4 cykli i przepustowością 0,5c, z wyjątkiem oczywiście div / sqrt i bitowych booleanów (np. Dla wartości bezwzględnej lub negacji). Intel najwyraźniej zdecydował, że nie warto dodawać krzemu do dodawania FP z mniejszymi opóźnieniami lub że niezrównoważona addpsprzepustowość jest problematyczna. A także standaryzacja opóźnień ułatwia unikanie konfliktów zapisu (gdy 2 wyniki są gotowe w tym samym cyklu) łatwiej uniknąć w harmonogramie UOP. tj. upraszcza porty planowania i / lub zakończenia.

Tak, Intel zmienił to w kolejnej ważnej rewizji mikroarchitektury (Skylake). Zmniejszenie opóźnienia FMA o 1 cykl sprawiło, że korzyść z dedykowanej jednostki dodającej SIMD FP była znacznie mniejsza, dla przypadków, które były związane z opóźnieniem.

Skylake wykazuje również oznaki przygotowywania się Intela do AVX512, w którym rozszerzenie oddzielnego sumatora SIMD-FP do 512 bitów zajęłoby jeszcze więcej miejsca na kości. Skylake-X (z AVX512) podobno ma prawie identyczny rdzeń jak zwykły klient Skylake, z wyjątkiem większej pamięci podręcznej L2 i (w niektórych modelach) dodatkowej 512-bitowej jednostki FMA „przykręconej” do portu 5.

SKX zamyka ALU portu 1 karty SIMD, gdy 512-bitowe przestoje są w locie, ale potrzebuje sposobu na wykonanie vaddps xmm/ymm/zmmw dowolnym momencie. Sprawiło to, że posiadanie dedykowanej jednostki FP ADD na porcie 1 stanowi problem i stanowi osobną motywację do zmiany w stosunku do wydajności istniejącego kodu.

Ciekawostka: wszystko od Skylake, KabyLake, Coffee Lake, a nawet Cascade Lake było mikroarchitektycznie identyczne jak Skylake, z wyjątkiem Cascade Lake dodającego nowe instrukcje AVX512. IPC nie zmieniło się inaczej. Nowsze procesory mają jednak lepsze iGPU. Ice Lake (mikroarchitektura Sunny Cove) po raz pierwszy od kilku lat po raz pierwszy zobaczyliśmy nową mikroarchitekturę (z wyjątkiem nigdy nieopublikowanego powszechnie Cannon Lake).


Argumenty oparte na złożoności jednostki FMUL w porównaniu z jednostką FADD są interesujące, ale w tym przypadku nie mają znaczenia . Jednostka FMA zawiera cały niezbędny sprzęt do zmiany biegów, aby wykonać dodawanie FP jako część FMA 1 .

Uwaga: Nie mam na myśli fmulinstrukcji x87 , mam na myśli multiplikację ALU SSE / AVX SIMD / skalarną FP, która obsługuje 32-bitową pojedynczą precyzję / floati 64-bitową doubleprecyzję (53-bitowe znaczenie i inaczej mantysa). np. instrukcje takie jak mulpslub mulsd. Rzeczywista 80-bitowa x87 fmulto wciąż tylko 1 / zegar na Haswell na porcie 0.

Współczesne procesory mają więcej niż wystarczającą liczbę tranzystorów, aby rzucać się na problemy, kiedy jest to tego warte , i kiedy nie powoduje to problemów z opóźnieniem propagacji na odległość fizyczną. Zwłaszcza dla jednostek wykonawczych, które są aktywne tylko przez pewien czas. Zobacz https://en.wikipedia.org/wiki/Dark_silicon i ten dokument konferencyjny 2011: Dark Silicon and the End of Multicore Scaling. Dzięki temu procesory mają dużą przepustowość FPU i masywną liczbę całkowitą, ale nie obie jednocześnie (ponieważ te różne jednostki wykonawcze są na tych samych portach wysyłających, więc konkurują ze sobą). W wielu starannie dopracowanych kodach, które nie ograniczają przepustowości pamięci, czynnikiem ograniczającym nie są jednostki wykonawcze zaplecza, ale przepustowość instrukcji frontonu. ( szerokie rdzenie są bardzo drogie ). Zobacz także http://www.lighterra.com/papers/modernmicroprocessors/ .


Przed Haswell

Przed HSW procesory Intel, takie jak Nehalem i Sandybridge, miały SIMD FP zwielokrotnione na porcie 0, a SIMD FP dodane na porcie 1. Więc były osobne jednostki wykonawcze i przepustowość była zrównoważona. ( https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle

Haswell wprowadził obsługę procesorów FMA w procesorach Intela (kilka lat po tym, jak AMD wprowadził FMA4 w Bulldozerze, po tym, jak Intel sfałszował je , czekając tak późno, jak to możliwe, aby upublicznić, że zamierzają wdrożyć 3-operand FMA, a nie 4-operand non -destructive-destination FMA4). Ciekawostka: AMD Piledriver był nadal pierwszym procesorem x86 z FMA3, około rok przed Haswell w czerwcu 2013 r.

Wymagało to poważnego zhakowania elementów wewnętrznych, aby nawet obsługiwać pojedynczy UOP z 3 wejściami. Ale w każdym razie Intel wszedł all-in i wykorzystał stale kurczące się tranzystory, aby zainstalować dwie 256-bitowe jednostki SIMD FMA, dzięki czemu Haswell (i jego następcy) są bestiami dla matematyki FP.

Cel wydajnościowy, jaki Intel mógł mieć na myśli, to gęsty matmuł BLAS i iloczyn wektorowy. Oba mogą w większości korzystać z FMA i nie muszą po prostu dodawać.

Jak wspomniałem wcześniej, niektóre obciążenia, które w większości lub po prostu dodają FP, są wąskie z powodu opóźnień w dodawaniu (głównie) nie przepustowości.


Przypis 1 : Z mnożnikiem 1.0FMA można dosłownie wykorzystać do dodania, ale z gorszym opóźnieniem niż addpsinstrukcja. Jest to potencjalnie przydatne w przypadku obciążeń, takich jak sumowanie tablicy, która jest gorąca w pamięci podręcznej L1d, gdzie FP dodaje przepustowość ma większe znaczenie niż opóźnienie. Pomaga to tylko wtedy, gdy używasz wielu akumulatorów wektorowych do ukrycia opóźnienia i utrzymujesz 10 operacji FMA w locie w jednostkach wykonawczych FP (opóźnienie 5c / przepustowość 0,5c = 10 opóźnień operacji * iloczyn przepustowości). Musisz to zrobić, gdy używasz FMA również w przypadku produktu z kropkami wektorowymi .

Zobacz, jak David Kanter napisał o mikroarchitekturze Sandybridge, która zawiera schemat blokowy, w których krajach UE znajduje się port dla NHM, SnB i AMD Bulldozer-family. (Zobacz także tabele instrukcji Agner Fog i przewodnik po mikroarchizmie optymalizacji asm, a także https://uops.info/, który zawiera również eksperymentalne testy uops, portów oraz opóźnienia / przepustowości niemal każdej instrukcji na wielu generacjach mikroarchitektur Intel).

Powiązane również: https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle

Peter Cordes
źródło
1
W przypadku, gdy zastanawiasz się, czy warto mi na słowo to: na przepełnienie stosu, mam złote odznaki tym [cpu-architecture], [performance], [x86-64], [assembly], i [sse]. Napisałem odpowiedź na temat kodu C ++, aby przetestować hipotezę Collatza szybciej niż zestaw odręczny - dlaczego? że wiele osób uważa za dobre. Także to dotyczy wykonywania potokowego OoO.
Peter Cordes,
„BDW jest głównie kurczeniem się HSW, przy czym większość zmian jest niewielka”. Brzmi to tak, jakby celowo pozostawiono pewne optymalizacje cofnięte przy pierwszym przejściu, być może z powodów finansowych.
jpaugh
2
@jpaugh: Zobacz en.wikipedia.org/wiki/Tick%E2%80%93tock_model - plan Intela z około 2006 roku (aż do momentu, gdy pojawił się blokada na 10 nm) zmarł w wyniku nowego procesu z drobnymi innymi zmianami, a następnie nowej architektury na już przetestowanym procesie. Pamiętaj, że prace nad rozwojem trwają od lat, a wiele przyszłych projektów jest w trakcie lotu: nie kończą jednego przed rozpoczęciem następnego. Broadwell zawsze miał być tylko „tyknięciem” przed „tockiem” Skylake, który w pełni wykorzystał proces produkcji 14 nm i nie musiał się martwić o debugowanie tego procesu, sam projekt
Peter Cordes
Doceniam link. Zasadniczo powtórzyłeś moje sentymenty, choć z dużo większą precyzją, niż mogłem zebrać.
jpaugh
8

Spojrzę na tę część:
„Dlaczego to na to pozwalają ” ...
TL; DR - ponieważ zaprojektowali to w ten sposób. To decyzja zarządcza. Pewnie, że są odpowiedzi mantysy i zmiennokształtnych, ale są to rzeczy, które należy do decyzji zarządczej.

Dlaczego tak to zaprojektowali? Odpowiedź jest taka, że ​​specyfikacje zostały stworzone, aby osiągnąć określone cele. Cele te obejmują wydajność i koszty. Wydajność nie jest ukierunkowana na operacje, a raczej na test porównawczy, taki jak FLOPS lub FPS w Crysis.
Te testy porównawcze będą miały wiele funkcji, niektóre z nich mogą być przetwarzane jednocześnie.
Jeśli projektanci stwierdzą, że posiadanie dwóch funkcji widżetu A sprawia, że ​​jest to znacznie szybsze, niż dwóch funkcji widżetu B, to pójdą z widżetem A. Wdrożenie dwóch A i dwóch B będzie kosztować więcej.

Patrząc wstecz, kiedy superskalarne i super-rurociągi (przed wielordzeniowym) po raz pierwszy stały się powszechne w komercyjnych układach scalonych, miały one na celu zwiększenie wydajności. Pentium ma dwie rury i żaden wektor się nie łączy. Haswell ma więcej rur, jednostek wektorowych, głębszą rurę, dedykowane funkcje i wiele innych. Dlaczego nie ma wszystkiego wszystkiego? Ponieważ tak to zaprojektowali.

MikeP
źródło
Bardziej odpowiednim celem wydajności może być gęsty matmuł BLAS i iloczyn wektorowy. Oba mogą w większości korzystać z FMA i nie muszą po prostu dodawać.
Peter Cordes,
Nigdy nie widziałem gęstej matmuli i kropki wektorowej BLAS na pudełku produktu. Nie widziałem ich w reklamach. Nie widziałem ich w recenzji produktu. (Pewnie, że są ważni, ale inżynieria podąża za zarządzaniem, zarządzanie podąża za marketingiem, marketing podąża za sprzedażą. Sprzedaż kupują zwykli ludzie.
MikeP
1
Widziałem recenzje procesorów zawierające takie testy jak Linpack. Ale tak czy inaczej, jak mówisz (teoretyczne maksimum), FLOPS się reklamuje, i jest to w zasadzie proxy dla wydajności matmula, jeśli pamięć podręczna może nadążyć. Nie jestem pewien, czy jakieś testy porównawcze SPECfp zbliżają się do nasycenia obu jednostek FMA na HSW lub SKL, ale testy porównawcze SPEC mają duże znaczenie. Nie wszystkie transakcje sprzedaży detalicznej są jednorazowe; niektórzy są wyrafinowanymi nabywcami, takimi jak kupujący klastry superkomputerów, decydujący o tym, kiedy przeprowadzić aktualizację lub korporacyjne farmy serwerów. Sądzę, że marże są również wyższe na tej sprzedaży.
Peter Cordes
6

Ten schemat od Intela może pomóc:

Omówienie jednostki wykonawczej Haswell

Wygląda na to, że dali każdej jednostce FMA (stopione dodawanie wielokrotne), a także mnożenie i pojedynczy sumator. Mogą lub nie mogą dzielić sprzęt pod spodem.

Pytanie, dlaczego dużo trudniej jest odpowiedzieć bez wewnętrznych uzasadnień projektowych, ale tekst w fioletowym polu daje nam wskazówkę dotyczącą „podwójnych szczytowych poziomów FLOP”: procesor będzie celował w zestaw testów porównawczych, pochodzących z rzeczywistych przypadków użycia. FMA jest w nich bardzo popularny, ponieważ jest podstawową jednostką mnożenia macierzy. Nagi dodatek jest mniej popularny.

Jak już wspomniano, można dodawać oba porty za pomocą instrukcji FMA, w której parametr zwielokrotnienia wynosi 1, obliczając (A x 1) + B. Będzie to nieco wolniejsze niż zwykłe dodawanie.

pjc50
źródło
FP Multiply działa na urządzeniu FMA. FP add działa z mniejszym opóźnieniem na dedykowanym module SIMD FP add only tylko na porcie 1. Możliwe, że dzieli niektóre tranzystory z jednostką FMA na tym porcie, ale z tego, co przeczytałem, mam wrażenie, że zajmuje to znacznie więcej miejsca.
Peter Cordes,
opublikował odpowiedź z większą ilością szczegółów.
Peter Cordes,
4

Rzućmy okiem na czasochłonne kroki:

Dodatek: Wyrównaj wykładniki (może to być operacja masowej zmiany). Jeden 53-bitowy sumator. Normalizacja (do 53 bitów).

Mnożenie: Jedna ogromna sieć sumatorów redukująca 53 x 53 produkty jednobitowe do sumy dwóch liczb 106-bitowych. Jeden 106-bitowy sumator. Normalizacja. Powiedziałbym, że zmniejszenie produktów bitowych do dwóch liczb może być wykonane tak szybko, jak ostatni sumator.

Jeśli możesz zrobić mnożenie zmiennej zmiennej czasowej, masz tę przewagę, że normalizacja przesunie się tylko o jeden bit przez większość czasu, i możesz bardzo szybko wykryć inne przypadki (zdenormalizowane dane wejściowe lub suma wykładników jest zbyt mała).

Ponadto bardzo często wymagane są kroki normalizacyjne (dodawanie liczb, które nie są równej wielkości, odejmowanie liczb, które są bliskie). Tak więc dla zwielokrotnienia możesz pozwolić sobie na szybką ścieżkę i wykonać ogromne uderzenie na wolną ścieżkę; na dodatek nie możesz.

PS. Czytanie komentarzy: Sensowne jest, że dodawanie liczb zdenormalizowanych nie powoduje kary: oznacza tylko, że spośród bitów przesuniętych w celu wyrównania wykładników wiele jest zerami. A wynik zdormalizowany oznacza, że ​​przestajesz się przesuwać, aby usunąć zera wiodące, jeśli spowodowałoby to, że wykładnik byłby zbyt mały.

gnasher729
źródło
Procesory Intela rzeczywiście obsługują mnożenie nienormalne (wejście lub wyjście) przez wspomaganie mikrokodu; tzn. zwykły FPU sygnalizuje wyjątek zamiast dodatkowego etapu potoku dla tego przypadku. Agner Fog mówi: Sandybridge W moich testach przypadki niedomiaru i liczb normalnych były obsługiwane tak szybko, jak normalne liczby zmiennoprzecinkowe w celu dodania, ale nie pomnożenia. Dlatego kompilacja z -ffast-mathzestawami FTZ / DAZ (odmiana koloru do zera), aby to zrobić, zamiast wziąć asysty FP.
Peter Cordes
W przewodniku Agarcha dotyczącym mikroarchy mówi, że zawsze jest kara, gdy operacje z normalnymi danymi wejściowymi wytwarzają wyniki nienormalne. Ale dodanie normalnego + podnormalnego nie ma kary. Tak więc przegląd podsumowania może być niedokładny lub przewodnik uarch jest niedokładny. Agner mówi, że Knight's Landing (Xeon Phi) nie ma kary za żadne podnormalne wartości w mul / add, tylko dzielenie. Ale KNL ma większe opóźnienie add / mul / FMA (6c) niż główny nurt Haswell (5c) / SKL (4c). Co ciekawe, AMD Ryzen ma karę zaledwie kilku cykli w porównaniu z dużą karą za rodzinę buldożerów.
Peter Cordes
W przeciwieństwie do tego, w procesorach graficznych chodzi o przepustowość, a nie opóźnienie, więc zazwyczaj mają ustalone opóźnienie we wszystkich przypadkach, nawet w przypadku nieprawidłowości. Pułapka na mikrokod prawdopodobnie nie jest nawet opcją dla takiego potoku.
Peter Cordes