2015-03-04 31 views
5

Diese Frage ist für gepackte, single-prec Floating-Ops mit XMM/YMM-Registern auf Haswell.Für XMM/YMM FP-Betrieb auf Intel Haswell, kann FMA anstelle von ADD verwendet werden?

So nach den ehrfürchtigen, ehrfürchtigentable zusammengestellt von Agner Nebel, ich weiß, dass MUL entweder p0 Port getan werden kann und p1 (mit recp Durchsatz von 0,5), während nur auf nur getan wird ADD Port p1 (mit Recp-Durchsatz von 1). Ich kann diese Einschränkung, aber ich weiß auch, dass FMA kann entweder auf Port p0 oder p1 (mit Recp thruput von 0,5) getan werden. Daher ist es verwirrend für mich, warum ein einfaches ADD nur auf p1 beschränkt ist, wenn FMA entweder p0 oder p1 und sowohl ADD als auch MUL verwenden kann. Verkenne ich den Tisch falsch? Oder kann jemand erklären, warum das wäre?

Das ist, wenn mein Lesen korrekt ist, warum würde Intel nicht nur FMA op als Grundlage für beide einfache MUL und einfache ADD verwenden, und dadurch den Durchsatz von ADD sowie MUL erhöhen. Alternativ, was würde mich davon abhalten, zwei simultane, unabhängige FMA-Ops zu verwenden, um zwei gleichzeitige, unabhängige ADD-Ops zu emulieren? Wie hoch sind die Strafen für ADD-by-FMA? Offensichtlich gibt es eine größere Anzahl von Registern (2 reg für ADD vs. 3 reg für ADD-by-FMA), aber anders als das?

+2

reine Spekulation zu bekommen: Die FPU auf Port-0 für Haswell nur 5-Zyklus Anweisungen verarbeiten kann. Es verfügt nicht über eine "frühzeitige" Logik, mit der es sowohl 3- als auch 5-Zyklen-Befehle verarbeiten kann. FP-add ist eine 3-Zyklus-Anweisung, daher kann es nicht in Port-0 gehen. – Mysticial

+0

Als überfälliges Update: Intel hat am Ende auch die FMA für ADDs benutzt - auf Skylake also. Skylake reduziert die FMA-Latenz auf 4 Zyklen. Das scheint ein ausreichender Kompromiss für sie gewesen zu sein, um das dedizierte 3-Zyklus-FP-ADD zu beseitigen und es in die 4-Zyklus-FMA-Hardware zu schieben. Jetzt haben wir auch Dual-Problem FP-ADD. – Mysticial

Antwort

5

Sie sind nicht der einzige, der darüber verwirrt ist, warum Intel dies getan hat. Agner Fog in seinem micro-architecture Handbuch schreibt für Haswell:

Es ist seltsam, dass es nur ein Port für Gleitkommaaddition ist, aber zwei Ports für Gleitkomma-Multiplikation.

Auf Agner die Nachricht von Bord he also writes

Es gibt zwei Ausführungseinheiten für Punktmultiplikation Schwimm- und für verschmolzenen Multiplikations- und hinzufügen, aber nur eine Ausführungseinheit für Punkt hinaus schwimmen. Dieser Entwurf scheint suboptimal zu sein, da Fließkomma-Code typischerweise mehr Additionen als Multiplikationen enthält.

Dieser Thread wird fortgesetzt mit mehr Informationen zu dem Thema, das ich schlage vor, Sie lesen, aber ich werde hier nicht angeben.

Er bespricht auch es in dieser Antwort hier flops-per-cycle-for-sandy-bridge-and-haswell-sse2-avx-avx2

Die Latenz der FMA Anweisungen auf Haswell ist 5 und der Durchsatz beträgt 2 pro Takt. Dies bedeutet, dass Sie 10 parallele Operationen ausführen müssen, um den maximalen Durchsatz zu erhalten. Wenn Sie zum Beispiel eine sehr lange Liste von f.p. Zahlen, müssten Sie es in zehn Teile teilen und zehn Akkumulatorregister verwenden.

Dies ist in der Tat möglich, aber wer würde so eine seltsame Optimierung für einen bestimmten Prozessor machen?

Seine Antwort dort beantwortet im Grunde Ihre Frage. Sie können FMA verwenden, um den Durchsatz der Addition zu verdoppeln. Tatsächlich tue ich dies in meinen Durchsatztests zur Addition und sehe tatsächlich, dass es sich verdoppelt.

Zusammenfassend, für Addition, wenn Ihre Berechnung Latenz gebunden ist dann verwenden Sie nicht FMA ADD verwenden. Aber wenn der Durchsatz begrenzt ist, können Sie versuchen, FMA zu verwenden (indem Sie den Multiplikator auf 1.0 setzen), aber Sie werden wahrscheinlich dazu viele AVX-Register verwenden müssen.

entrollte ich 10-mal hier maximal Teiledurch loop-unrolling-to-achieve-maximum-throughput-with-ivy-bridge-and-haswell

+0

"Wer würde so eine seltsame Optimierung für einen bestimmten Prozessor machen?" - Prime95 macht es. Und ich habe es auch getan. Es ist überhaupt nicht schwierig, wenn alle Ihre Eigenarten benutzerdefinierte Makros durchlaufen. – Mysticial

+0

@Mysticial, ja, ich habe es auch für meine Durchsatztests gemacht. Aber ich habe es noch nie für etwas Nützliches getan. Ich denke für meinen GEMM-Code, aber dann habe ich schon 8x sowieso abgerollt und der Wechsel von 8x auf 10x macht kaum einen Unterschied. –

+0

Danke für die Rückmeldung. Ich habe Agners Kommentar zu diesem Thema nicht gesehen. Ich habe nur seinen Tisch studiert. Ich werde mir seine anderen Notizen ansehen. Ich verstehe den Punkt über Latenz/Abwägung, obwohl ich immer noch die schöne Kunst lerne, die die beiden verwaltet. Was ich unsicherer war, war, ob es einen nicht intuitiven Portkonflikt oder Präzisionsfehler geben würde. – codechimp