Warum ermöglicht der Haswell-Chip von Intel, dass die FP-Multiplikation doppelt so schnell ist wie die Addition?


35

Ich habe diese sehr interessante Frage zu Stack Overflow gelesen:

Wird die ganzzahlige Multiplikation tatsächlich mit der gleichen Geschwindigkeit ausgeführt wie die Addition auf einer modernen CPU?

Einer der Kommentare sagte:

"Es ist nichts wert, dass bei Haswell der FP-Multiplikationsdurchsatz doppelt so hoch ist wie bei FP-Add. Das liegt daran, dass die beiden Ports 0 und 1 für die Multiplikation verwendet werden können, aber nur Port 1 für die Addition. Das heißt, Sie können mit Fused cheaten -mehrfach fügt hinzu, da beide Ports dies können. "

Warum erlauben sie im Vergleich zur Addition doppelt so viele gleichzeitige Multiplikationen?


3
Vielen Dank, dass Sie @ DKNguyen! Die Multiplikation erfordert jedoch weitaus mehr Elektronik als Addition (Addition ist der letzte Schritt der Multiplikation, sodass die für die Multiplikation erforderlichen Schaltkreise auch die für die Addition erforderlichen Schaltkreise enthalten).
User1271772

5
FP-Multiplikation ist Addition. Siehe Logarithmen.
Janka

9
@Janka Während die FP-Multiplikation die Addition der Exponenten erfordert, müssen die Mantissen tatsächlich multipliziert werden. Die gespeicherte Mantisse ist kein Logarithmus.
Elliot Alderson

6
FWIW in Skylake hat sich der Durchsatz für "reine Addition" verdoppelt. Dies ist eine Kuriosität aus der Haswell / Broadwell-Ära und keine inhärente Sache.
Harold

4
@ user1271772 Ja, es sind jedoch die gleichen Ports: Addition an Port 0 und 1 und Multiplikation auch an Port 0 und 1. Vor Skylake konnte nur Port 1 die reine Addition verarbeiten. Dies erstreckt sich auch auf einige additionsähnliche Operationen, nämlich min / max / compare des µops einer Konvertierung, die die eigentliche Konvertierung durchführt (häufig ist auch ein Shuffle- oder Load-µop enthalten)
harold

Antworten:


37

Dies beantwortet möglicherweise den Titel der Frage, wenn nicht den Körper:

Beim Hinzufügen von Gleitkommazahlen müssen die beiden Mantissen vor dem Hinzufügen ausgerichtet werden (abhängig von der Differenz zwischen den beiden Exponenten), was möglicherweise eine große variable Verschiebung vor dem Addierer erfordert. Dann kann eine Renormierung des Ergebnisses der Mantissenaddition erforderlich sein, die möglicherweise einen anderen großen variablen Verschiebungsbetrag erfordert, um das Gleitkommaergebnis richtig zu formatieren. Die beiden Mantissen-Barrel-Shifter erfordern daher möglicherweise mehr Gate-Verzögerungen, größere Drahtverzögerungen oder zusätzliche Zyklen, die die Verzögerung eines gut komprimierten Carry-Save-Adder-Tree-Multiplikator-Frontends überschreiten.

Für das OP hinzugefügt: Beachten Sie, dass das Hinzufügen der Längen von 2 Millimetern und 2 Kilometern nicht 4 von beiden Einheiten ist. Dies liegt daran, dass das eine oder andere Maß vor dem Hinzufügen in dieselbe Skala oder Einheitendarstellung konvertiert werden muss. Diese Umwandlung erfordert im Wesentlichen eine Multiplikation mit einer Potenz von 10. Dasselbe muss normalerweise während der Gleitkommaaddition geschehen, da Gleitkommazahlen eine Form von variabel skalierten ganzen Zahlen sind (z. B. gibt es eine Einheit oder einen Skalierungsfaktor, einen Exponenten, der zugeordnet ist) jede Zahl). Daher müssen Sie möglicherweise eine der Zahlen mit einer Zweierpotenz skalieren, bevor Sie rohe Mantissenbits hinzufügen, damit beide dieselbe Einheit oder Skalierung darstellen. Diese Skalierung ist im Wesentlichen eine einfache Form der Multiplikation mit einer Potenz von 2. Daher erfordert die Gleitkommaaddition eine Multiplikation(Dies ist eine Potenz von 2 und kann mit einer variablen Bitverschiebung oder einem Barrel-Shifter durchgeführt werden. Dies kann relativ lange Drähte im Verhältnis zu den Transistorgrößen erfordern, die in tiefen Submikron-Lithographie-Schaltkreisen relativ langsam sein können.) Wenn sich die beiden Zahlen größtenteils stornieren (weil eine fast das Negative der anderen ist), muss möglicherweise das Ergebnis der Addition neu skaliert und das Ergebnis entsprechend formatiert werden. Die Addition kann daher langsam sein, wenn sie des Weiteren 2 Multiplikationsschritte (vor und nach) erfordert, die die binäre Addition einer rohen festen (endlichen) Anzahl von Mantissenbits, die äquivalente Einheiten oder Skalen darstellen, aufgrund der Natur des Zahlenformats (IEEE-Gleitkomma) umgeben ).

Hinzugefügt # 2: Auch viele Benchmarks wiegen FMACS (Multiplizieren-Akkumulieren) mehr als nackte Adds. In einem verschmolzenen MAC kann die Ausrichtung (Verschiebung) des Addends häufig parallel zur Multiplikation erfolgen, und die Mantissenaddition kann häufig vor der endgültigen Übertragsausbreitung in den CSA-Baum aufgenommen werden.


Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben . Alle Schlussfolgerungen sollten wieder in die Frage und / oder eine Antwort (en) eingearbeitet werden.
Dave Tweed

3
Ich rufe BS an. Sicherlich kann die tatsächliche Multiplikation in einer FP-Multiplikationsoperation unmöglich härter sein als zwei Barrel-Verschiebungen.
user253751

5
"härter", potenziell schneller und angesichts der Projektbeschränkungen und -ziele zu optimieren, sind vier verschiedene Dinge.
hotpaw2

3
@immibis: Vor Haswell hatten Intel-CPUs 1 SIMD-FP-Add-Unit (3-Zyklus-Latenz) und 1 SIMD-FP-Mul-Unit (5-Zyklus-Latenz). Addieren ist also schneller als Multiplizieren. (Aus diesem Grund hat Haswell beim Hinzufügen von 2x FMA-Einheiten für fma und mul eine separate FP-Add-Einheit beibehalten, anstatt sie wie SKL auf der FMA-Einheit auszuführen.) Außerdem laufen SIMD-int-Verschiebungen mit einer Latenz von 1 c im Vergleich zu SIMD-int-Verschiebungen mit einer Latenz von 5 c (Huckepack auf den Signifikantenmultiplikatoren in einer FMA-Einheit). Also ja, Schicht ist viel billiger als multiplizieren. Sowohl add als auch mul sind vollständig pipelined, sodass beide einen separaten Barrel-Shifter benötigen, um die Ausgabe zu normalisieren.
Peter Cordes

22

Bei der FP-Multiplikation erweist sich die Exponentenverarbeitung als einfache Addition (aus genau demselben Grund, aus dem die Multiplikation in der Protokolldomäne lediglich eine Addition ist). Ich hoffe, Sie sind auf Logarithmen gestoßen.

Nun überlegen Sie, wie schwierig es ist, zwei Zahlen in logarithmischer Form zu addieren ...

Gleitkommawerte liegen in einer Grauzone zwischen der linearen und der logarithmischen Domäne, wobei beide Aspekte berücksichtigt werden. Jede FP-Zahl besteht aus einer Mantisse (die linear ist) und einem (logarithmischen) Exponenten. Um die Bedeutung jedes Bits in der Mantisse zu bestimmen, müssen Sie zuerst den Exponenten betrachten (der nur ein Skalierungsfaktor ist).

In der FP-Addition erfordert die Exponentenverarbeitung im allgemeinen Fall eine zweimalige Verschiebung der Mantisse, wobei jede Verschiebung effektiv ein Sonderfall einer leicht vereinfachten Multiplikation ist.

(Die erste Verschiebung richtet beide Eingänge auf die gleiche Potenz von 2 aus, so dass ein Mantissenbit in jedem Operanden dieselbe Binärgewichtung hat.

Ein dezimales Beispiel wird ausreichen (obwohl offensichtlich binär verwendet wird) ...

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

Die zweite skaliert die Ausgabe neu ...

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

Paradoxerweise handelt es sich bei einer FP-Addition um zwei Multiplikationen, die nacheinander ausgeführt werden müssen, wobei die Mantissenaddition dazwischen liegt. In diesem Licht ist die berichtete Leistung nicht so überraschend.


8
Das "Überlegen, wie schwierig es ist, zwei Zahlen in logarithmischer Form zu addieren" war ziemlich aufschlussreich.
Peter - Setzen Sie Monica

1
Obwohl Gleitkommaexponenten glücklicherweise nur ganze Zahlen sind, müssen Sie nichts wie 1,3 + 2,3 = 2,34 hinzufügen, es ist nur die Verschiebung der Mantissen.
ilkkachu

1
Der Grund, warum Sie zwei Multiplikationen pro Zyklus durchführen können, ist, dass es zwei Multiplikationseinheiten gibt, und nicht, dass die Multiplikationseinheit schneller ist als die Additionseinheit (siehe Diagramm in der Antwort von pjc50). Sie können diese Frage nicht beantworten, indem Sie erklären, warum eine Additionseinheit langsamer ist als eine Multiplikationseinheit. Abgesehen davon sagen andere Antworten bisher, dass die Additionseinheit eine geringere Latenz aufweist, was nahelegt, dass die Addition die einfachere Operation ist.
user253751

2
@immibis: Deine Beobachtung ist richtig. Aber die Frage lautet: "Warum ist das so? Warum gibt es keine zwei Additionseinheiten, da die Addition so viel einfacher / billiger als mpy ist?" Ein Teil der Antwort lautet: "In FP ist es wirklich nicht einfacher". Der Rest hängt von der Wirtschaftlichkeit ab: Angesichts der tatsächlichen Kosten und der vielen Studien zur erwarteten Arbeitsbelastung hat der zweite Addierer seinen Platz in nicht gerechtfertigt Silizium. Ich lasse die anderen Antworten, um diesen Teil zu erweitern.
Brian Drummond

Einige Informatiker (z. B. Kahan (Architekt von IEEE754 FP) und Knuth) argumentieren, dass "Mantisse" das falsche Wort ist, weil es linear (nicht logarithmisch) ist. Der bevorzugte moderne Begriff ist significand. en.wikipedia.org/wiki/Significand#Use_of_%22mantissa%22 . "mantissa" ist jedoch ein kühler aussehendes Wort mit weniger Silben.
Peter Cordes

16

TL: DR : Da Intel der Meinung war, dass die SSE / AVX-FP-Add-Latenz wichtiger ist als der Durchsatz, hat Intel beschlossen, sie nicht auf den FMA-Einheiten in Haswell / Broadwell auszuführen.


Haswell führt (SIMD) FP-Multiplikation auf den gleichen Ausführungseinheiten aus wie FMA ( Fused Multiply-Add ), von denen es zwei hat, da einige FP-intensive Codes meistens FMAs verwenden können, um 2 FLOPs pro Befehl auszuführen. mulpsDieselbe Latenz von 5 Zyklen wie bei FMA und wie bei früheren CPUs (Sandybridge / IvyBridge). Haswell wollte 2 FMA-Einheiten, und es gibt auch keinen Nachteil, die Multiplikation weiterlaufen zu lassen, da sie dieselbe Latenz haben wie die dedizierte Multiplikationseinheit in früheren CPUs.

Aber es hält die dedizierte SIMD FP Add - Einheit aus früheren CPUs noch laufen addps/ addpdmit 3 Zyklen Latenz. Ich habe gelesen, dass der mögliche Grund der sein könnte, dass Code, der viele FP-Adds ausführt, dazu neigt, die Latenz und nicht den Durchsatz zu beeinträchtigen. Dies gilt mit Sicherheit für eine naive Summe eines Arrays mit nur einem (Vektor-) Akkumulator, wie Sie es häufig bei der automatischen Vektorisierung von GCC erhalten. Aber ich weiß nicht, ob Intel dies öffentlich bestätigt hat.

Broadwell ist derselbe ( aber beschleunigte mulps/mulpd bis zu 3c Latenz, während FMA bei 5c blieb). Vielleicht konnten sie die FMA-Einheit verkürzen und das Multiplikationsergebnis herausholen, bevor sie eine Dummy-Addition machten 0.0, oder vielleicht etwas völlig anderes, und das ist viel zu simpel. BDW ist größtenteils ein Schrumpfen von HSW, wobei die meisten Änderungen geringfügig sind.

In Skylake läuft alles FP (einschließlich Addition) auf der FMA-Einheit mit 4 Zyklen Latenz und 0,5 c Durchsatz, außer natürlich div / sqrt und bitweisen Booleans (z. B. für Absolutwert oder Negation). Intel hat anscheinend entschieden, dass es sich nicht um zusätzliches Silizium für das Hinzufügen von FP mit geringerer Latenz handelt oder dass der unausgeglichene addpsDurchsatz problematisch ist. Durch die Standardisierung der Latenzzeiten wird die Vermeidung von Rückschreibkonflikten (wenn zwei Ergebnisse im selben Zyklus vorliegen) bei der UOP-Planung vereinfacht. dh vereinfacht die Planung und / oder Fertigstellung von Ports.

Also ja, Intel hat es in seiner nächsten größeren Revision der Mikroarchitektur (Skylake) geändert. Durch die Reduzierung der FMA-Latenz um einen Zyklus wurde der Nutzen einer dedizierten SIMD-FP-Add-Einheit für Fälle, die an die Latenz gebunden waren, erheblich verringert.

Skylake zeigt auch Anzeichen dafür, dass Intel sich auf AVX512 vorbereitet, wo die Erweiterung eines separaten SIMD-FP-Addierers auf 512 Bit noch mehr Chipfläche in Anspruch genommen hätte. Skylake-X (mit AVX512) hat angeblich einen fast identischen Kern wie der normale Skylake-Client, abgesehen von einem größeren L2-Cache und (in einigen Modellen) einer zusätzlichen 512-Bit-FMA-Einheit, die an Port 5 "angeschraubt" ist.

SKX fährt die SIMD-ALUs für Port 1 herunter, wenn 512-Bit-Uops im Flug sind, benötigt jedoch eine Möglichkeit zur Ausführung vaddps xmm/ymm/zmmzu jedem Zeitpunkt. Dies machte es zu einem Problem, eine dedizierte FP-ADD-Einheit an Port 1 zu haben, und ist eine separate Motivation für die Änderung der Leistung des vorhandenen Codes.

Unterhaltsame Tatsache: Alles von Skylake, KabyLake, Coffee Lake und sogar Cascade Lake war mikroarchitektonisch identisch mit Skylake, außer dass Cascade Lake einige neue AVX512-Anweisungen hinzufügte. IPC hat sich ansonsten nicht geändert. Neuere CPUs haben jedoch bessere iGPUs. Ice Lake (Sunny Cove Mikroarchitektur) ist das erste Mal seit einigen Jahren, dass wir eine neue Mikroarchitektur sehen (mit Ausnahme des nie weit verbreiteten Cannon Lake).


Argumente, die auf der Komplexität einer FMUL-Einheit gegenüber einer FADD-Einheit beruhen, sind in diesem Fall interessant, aber nicht relevant . Eine FMA-Einheit enthält die gesamte erforderliche Schalthardware, um die FP-Addition als Teil einer FMA 1 durchzuführen .

Hinweis: Ich meine nicht den x87- fmulBefehl, sondern eine SSE / AVX-SIMD / Scalar-FP-Multiplikations-ALU, die 32-Bit-Single-Precision / floatund 64-Bit- doublePrecision (53-Bit-Hochkomma oder Mantisse) unterstützt. zB Anweisungen wie mulpsoder mulsd. Das tatsächliche 80-Bit-x87-Format fmulist bei Haswell auf Port 0 immer noch nur 1 / Takt-Durchsatz.

Moderne CPUs haben mehr als genug Transistoren, um Probleme zu lösen, wenn es sich lohnt und wenn es keine Probleme mit der Laufzeitverzögerung für physische Entfernungen verursacht. Insbesondere für Ausführungseinheiten, die nur zeitweise aktiv sind. Siehe https://en.wikipedia.org/wiki/Dark_silicon und dieses Konferenzpapier von 2011: Dark Silicon und das Ende der Multicore-Skalierung. Dies macht es möglich, dass CPUs einen massiven FPU-Durchsatz und einen massiven Integer-Durchsatz haben, jedoch nicht beide gleichzeitig (weil sich diese verschiedenen Ausführungseinheiten an denselben Dispatch-Ports befinden, sodass sie miteinander konkurrieren). In vielen sorgfältig abgestimmten Codes, die keine Engpässe bei der Speicherbandbreite aufweisen, sind nicht die Back-End-Ausführungseinheiten der limitierende Faktor, sondern der Front-End-Befehlsdurchsatz. ( breite Kerne sind sehr teuer .). Siehe auch http://www.lighterra.com/papers/modernmicroprocessors/


Vor Haswell

Vor HSW hatten Intel-CPUs wie Nehalem und Sandybridge SIMD FP auf Port 0 multipliziert und SIMD FP auf Port 1 hinzugefügt. Daher gab es separate Ausführungseinheiten und der Durchsatz war ausgeglichen. ( https://stackoverflow.com/questions/8389648/how-do-ich-das-theoretische-Maximum-von-4-Flops-pro- Zyklus

Haswell führte die FMA-Unterstützung in Intel-CPUs ein (ein paar Jahre, nachdem AMD FMA4 in Bulldozer eingeführt hatte, nachdem Intel darauf gewartet hatte, dass FMA mit drei und nicht mit vier Operanden implementiert wurde, so spät wie möglich) -zerstörendes-Ziel FMA4). Unterhaltsame Tatsache: AMD Piledriver war noch immer die erste x86-CPU mit FMA3, etwa ein Jahr vor Haswell im Juni 2013

Dies erforderte einiges an Hacken der Interna, um sogar ein einzelnes UOP mit 3 Eingängen zu unterstützen. Trotzdem ging Intel All-in und nutzte die Vorteile immer kleiner werdender Transistoren, um zwei 256-Bit-SIMD-FMA-Einheiten einzubauen, was Haswell (und seine Nachfolger) zu wahren Biestern für die FP-Mathematik machte.

Ein Leistungsziel, an das Intel möglicherweise gedacht hatte, war das BLAS-Dense-Matmul- und Vector-Dot-Produkt. Beide können meistens FMA verwenden und müssen nicht nur hinzugefügt werden.

Wie ich bereits erwähnt habe, sind einige Workloads, die meistens oder nur mit FP-Addition arbeiten, aufgrund der zusätzlichen Latenz (meistens) und nicht aufgrund des Durchsatzes eingeschränkt.


Fußnote 1 : Und mit einem Multiplikator von 1.0kann FMA buchstäblich als Addition verwendet werden, jedoch mit einer schlechteren Latenz als ein addpsBefehl. Dies ist möglicherweise nützlich für Workloads wie das Aufsummieren eines Arrays, das sich im L1d-Cache befindet und bei dem der FP-Zusatzdurchsatz mehr zählt als die Latenz. Dies hilft natürlich nur, wenn Sie mehrere Vektorakkumulatoren verwenden, um die Latenz auszublenden und 10 FMA-Operationen in den FP-Ausführungseinheiten im Flug zu halten (5 c Latenz / 0,5 c Durchsatz = 10 Operationen Latenz * Bandbreite-Produkt). Dies müssen Sie auch tun, wenn Sie FMA für ein Vektorpunktprodukt verwenden .

Sehen Sie sich David Kanters Beschreibung der Sandybridge-Mikroarchitektur an, die ein Blockdiagramm enthält, welche EUs an welchem ​​Port für die NHM-, SnB- und AMD-Bulldozer-Familie liegen. (Siehe auch die Anweisungstabellen von Agner Fog und den Leitfaden zur ASM-Optimierung sowie https://uops.info/ zur Asm- dem auch experimentelle Tests von Uops, Ports und Latenz / Durchsatz nahezu aller Anweisungen für viele Generationen von Intel-Mikroarchitekturen durchgeführt werden.)

Siehe auch: https://stackoverflow.com/questions/8389648/how-do-i-achieve-theoretical-maximum-of-4-flops-per-cycle


1
Im Fall über Sie mich fragen , ob mein Wort dafür nehmen: auf Stack - Überlauf, habe ich Gold Abzeichen einschließlich [cpu-architecture], [performance], [x86-64], [assembly], und [sse]. Ich habe eine Antwort auf C ++ - Code geschrieben, um die Collatz-Vermutung schneller zu testen als eine handgeschriebene Assemblierung - warum? dass viele Leute denken, ist gut. Auch dies über die OoO-Pipeline-Ausführung.
Peter Cordes

"BDW ist größtenteils ein Schrumpfen von HSW, wobei die meisten Änderungen geringfügig sind." Hört sich an, als hätten sie absichtlich einige Optimierungen auf Anhieb rückgängig gemacht, möglicherweise aus finanziellen Gründen.
Jpaugh

2
@jpaugh: Siehe en.wikipedia.org/wiki/Tick%E2%80%93tock_model - Intels Plan von etwa 2006 (bis sie eine Straßensperre von 10nm erreichten) war auf einen neuen Prozess mit geringfügigen anderen Änderungen und einer neuen Architektur beschränkt auf den bereits getesteten Prozess. Denken Sie daran, dass die Entwicklung jahrelang mit mehreren zukünftigen Designs im Flug geplant ist: Sie beenden eines nicht, bevor sie mit dem nächsten beginnen. Broadwell sollte immer nur ein "Häkchen" vor dem Skylake "Token" sein, das den 14-nm-Herstellungsprozess voll ausnutzte und sich nicht um das Debuggen des Prozesses kümmern musste, sondern nur um das Design
Peter Cordes,

Ich schätze den Link. Sie haben im Wesentlichen mein Gefühl wiedergegeben, wenn auch mit viel mehr Präzision, als ich aufbringen konnte.
Jpaugh

8

Ich werde mir diesen Teil anschauen:
"Warum erlauben sie es " ...
TL; DR - weil sie es so entworfen haben. Es ist eine Managemententscheidung. Sicher gibt es Antworten von Mantisse und Bit-Shiftern, aber dies sind Dinge, die in die Managemententscheidung einfließen.

Warum haben sie das so gestaltet? Die Antwort ist, dass die Spezifikationen dazu gemacht sind, bestimmte Ziele zu erreichen. Diese Ziele umfassen Leistung und Kosten. Die Leistung richtet sich nicht nach den Betriebsabläufen, sondern nach einem Benchmark wie FLOPS oder FPS in Crysis.
Diese Benchmarks verfügen über eine Reihe von Funktionen, von denen einige gleichzeitig verarbeitet werden können.
Wenn die Designer der Ansicht sind, dass zwei Funktionen von Widget A den Vorgang viel schneller machen als zwei Funktionen von Widget B. Dann entscheiden sie sich für Widget A. Die Implementierung von zwei von A und zwei von B kostet mehr.

Wenn man zurückblickt, als Superskalar- und Super-Pipelines (vor Multi-Core-Pipelines) erstmals auf kommerziellen Chips zum Einsatz kamen, waren diese dazu da, die Leistung zu steigern. Der Pentium hat zwei Pipes, und kein Vektor verbindet sich. Haswell verfügt über mehr Pipes, Vektoreinheiten, eine tiefere Pipe, dedizierte Funktionen und mehr. Warum gibt es nicht zwei von allem? Weil sie es so gestaltet haben.


Ein relevanteres Leistungsziel könnte das BLAS-Density-Matmul- und Vector-Dot-Produkt sein. Beide können meistens FMA verwenden und müssen nicht nur hinzugefügt werden.
Peter Cordes

Ich habe noch nie BLAS Densed Matmul und Vector Dot Produkt auf einer Produktverpackung gesehen. Nicht gesehen in Werbespots. Nicht gesehen in einer Produktbewertung. (Sicher sind sie wichtig, aber das Engineering folgt dem Management, das Management folgt dem Marketing, das Marketing folgt dem Verkauf. Der Verkauf wird von normalen Leuten gekauft.
MikeP

1
Ich habe CPU-Tests mit Benchmarks wie Linpack gesehen. Aber wie auch immer, wie Sie sagen (theoretisch maximal), FLOPS wird angekündigt, und das ist im Grunde ein Proxy für die Matmul-Leistung, wenn der Cache mithalten kann. Ich bin nicht sicher, ob die SPECfp-Benchmarks der Sättigung beider FMA-Einheiten auf HSW oder SKL nahe kommen, aber SPEC-Benchmarks sind von großer Bedeutung. Nicht alle Verkäufe sind Einzelhandelsverkäufe. Einige sind anspruchsvolle Käufer wie Käufer von Supercomputer-Clustern, die sich für ein Upgrade entscheiden, oder Unternehmensserverfarmen. Auch bei diesen Verkäufen sind die Margen höher, denke ich.
Peter Cordes

6

Dieses Diagramm von Intel kann helfen:

Haswell Execution Unit Übersicht

Es scheint, dass sie jeder Einheit eine FMA (Fused Multiply-Add) sowie eine Multiplikation und einen einzelnen Addierer gegeben haben. Sie können Hardware darunter teilen oder nicht.

Die Frage, warum ist viel schwieriger zu beantworten, ohne interne Design-Gründe, aber der Text in der violetten Box gibt uns einen Hinweis mit "Double Peak FLOPs": Der Prozessor zielt auf eine Reihe von Benchmarks, die von tatsächlichen Anwendungsfällen abgeleitet sind. FMA ist bei diesen sehr beliebt, da es die Grundeinheit der Matrixmultiplikation ist. Bloße Hinzufügung ist weniger populär.

Wie bereits erwähnt, können Sie beide Ports für die Addition mit einem FMA-Befehl verwenden, bei dem der Multiplikationsparameter 1 ist und (A x 1) + B berechnet. Dies ist etwas langsamer als eine Addition ohne Daten.


FP Multiply läuft auf der FMA-Einheit. FP-Add wird nur auf dem dedizierten SIMD-FP-Add-Gerät an Port 1 mit geringerer Latenz ausgeführt. Es ist möglich, dass es einige Transistoren mit der FMA-Einheit an diesem Port teilt, aber von dem, was ich gelesen habe, habe ich den Eindruck, dass es einen erheblichen zusätzlichen Bereich benötigt, um dies bereitzustellen.
Peter Cordes

hat eine Antwort mit mehr Details gepostet .
Peter Cordes

4

Werfen wir einen Blick auf die zeitaufwändigen Schritte:

Zusatz: Exponenten ausrichten (kann eine massive Verschiebung sein). Ein 53-Bit-Addierer. Normalisierung (um bis zu 53 Bit).

Multiplikation: Ein massives Addierernetzwerk, um 53 x 53 Ein-Bit-Produkte auf die Summe von zwei 106-Bit-Zahlen zu reduzieren. Ein 106-Bit-Addierer. Normalisierung. Ich würde sagen, dass das Reduzieren der Bitprodukte auf zwei Zahlen ungefähr so ​​schnell wie der endgültige Addierer durchgeführt werden kann.

Wenn Sie die Multiplikationszeit variabel machen können, haben Sie den Vorteil, dass sich die Normalisierung die meiste Zeit nur um ein Bit verschiebt und Sie die anderen Fälle sehr schnell erkennen können (denormalisierte Eingaben oder die Summe der Exponenten ist zu klein).

Normalisierungsschritte sind häufig erforderlich (Hinzufügen von Zahlen, die nicht gleich groß sind, Subtrahieren von Zahlen, die nahe beieinander liegen). Für die Multiplikation können Sie es sich also leisten, einen schnellen Pfad zu haben und einen massiven Treffer für den langsamen Pfad zu erzielen. dazu kannst du nicht.

PS. Lesen der Kommentare: Es ist sinnvoll, denormalisierte Zahlen hinzuzufügen, ohne dass dies einen Nachteil darstellt: Es bedeutet nur, dass viele der Bits, die verschoben werden, um die Exponenten auszurichten, Nullen sind. Ein denormalisiertes Ergebnis bedeutet, dass Sie die Verschiebung anhalten, um führende Nullen zu entfernen, wenn der Exponent dadurch zu klein wird.


Intel-CPUs verarbeiten die subnormale Multiplikation (Eingabe oder Ausgabe) über einen Mikrocode-Assistenten. dh die reguläre FPU signalisiert eine Ausnahme, anstatt für diesen Fall eine zusätzliche Pipeline-Stufe zu haben. Agner Fog sagt zu: Sandybridge In meinen Tests wurden Unterlauf- und Denormalzahlen genauso schnell behandelt wie normale Gleitkommazahlen für die Addition, aber nicht für die Multiplikation. Dies ist der Grund, warum Sie das Kompilieren mit den -ffast-mathSätzen FTZ / DAZ (Flush Denormals to Zero) durchführen müssen, anstatt eine FP-Unterstützung zu benötigen.
Peter Cordes

In Agners Mikroarchitektur-Leitfaden sagt er, dass es immer eine Strafe gibt, wenn Operationen mit normalen Eingaben eine subnormale Ausgabe erzeugen. Das Hinzufügen eines Normalen + Subnormalen hat jedoch keine Nachteile. Daher ist die zusammenfassende Überprüfung möglicherweise ungenau oder der Leitfaden für Uarch ist ungenau. Agner sagt, dass Knight's Landing (Xeon Phi) keine Strafe für Subnormale auf mul / add hat, sondern nur dividiert. Aber KNL hat eine höhere Latenzzeit für Add / Mul / FMA (6c) als Mainstream-Haswell (5c) / SKL (4c). Interessanterweise hat AMD Ryzen eine Strafe von nur wenigen Zyklen gegen die Bulldozer-Familie.
Peter Cordes

Allerdings dreht sich bei GPUs alles um den Durchsatz und nicht um die Latenz, sodass die Latenz selbst für Subnormale in der Regel in allen Fällen feststeht. Das Überfüllen mit Mikrocode ist wahrscheinlich nicht einmal eine Option für eine solche Bare-Bones-Pipeline.
Peter Cordes
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.