Ich habe diese sehr interessante Frage zu Stack Overflow gelesen:
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?
cpu
computer-architecture
alu
floating-point
intel
user1271772
quelle
quelle
Antworten:
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.
quelle
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) ...
Die zweite skaliert die Ausgabe neu ...
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.
quelle
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.
mulps
Dieselbe 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
/addpd
mit 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 machten0.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
addps
Durchsatz 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/zmm
zu 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-
fmul
Befehl, sondern eine SSE / AVX-SIMD / Scalar-FP-Multiplikations-ALU, die 32-Bit-Single-Precision /float
und 64-Bit-double
Precision (53-Bit-Hochkomma oder Mantisse) unterstützt. zB Anweisungen wiemulps
odermulsd
. Das tatsächliche 80-Bit-x87-Formatfmul
ist 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.0
kann FMA buchstäblich als Addition verwendet werden, jedoch mit einer schlechteren Latenz als einaddps
Befehl. 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
quelle
[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.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.
quelle
Dieses Diagramm von Intel kann helfen:
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.
quelle
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.
quelle
-ffast-math
Sätzen FTZ / DAZ (Flush Denormals to Zero) durchführen müssen, anstatt eine FP-Unterstützung zu benötigen.