2014-10-09 11 views
7

Ich bemerke, dass Compiler Code erzeugen, der jedes Mal auf SIMD-Register zielt, wenn double Arithmetik verwendet wird. Dies gilt sowohl für nicht optimierten als auch für optimierten Code. Bedeutet das, dass die x87 FP-Einheit als veraltet angesehen werden kann und nur aus Gründen der Abwärtskompatibilität vorhanden ist?Ist x87 FP Stack noch relevant?

Ich merke auch, dass andere "populäre" Plattformen auch auf ihre jeweiligen SIMD-Implementierungen verlassen, anstatt FP als Stapel ausgelegt.

auch SIMD-Implementierungen sind in der Regel mindestens 128 Bit breit sein, so frage ich mich nicht, dass die (interne) Präzision Tätigkeitsort, ist höher als für die x87-FP-Einheit?

Ich frage mich auch über die Leistung, Durchsatz und Latenz, wenn man bedenkt, dass SIMD mit Vektor-Ausführung konzipiert wurde, im Auge, so dass ich frage mich, wie sie mit Skalare tun.

+0

Eigentlich kann FPU genauer sein, weil SIMD mehrere Werte in diesen Bits speichert, unterstützt es derzeit 64-Bit-Doppel und 32-Bit-Floats. Es gibt SSE-Skalaranweisungen auch. FPU hat jedoch einige Funktionen, die SSE nicht hat. – Jester

+0

@Jester - Implizieren Sie, dass SIMD-Einheiten nicht die vollen 128 Bits verwenden, um den einzelnen Wert zu speichern? Und das stattdessen wird es als ein gepacktes 'doppeltes 'behandelt und ist nur 64 Bits? –

+0

Es steht fest auf der Liste der gefährdeten Arten. Jeder nahm die bahnbrechende Änderung in ihren 64-Bit-Code-Generatoren. Die großen 3 sind alle geschaltet. Es gibt ein paar Nachzügler, den 32-Bit-.NET-Jitter zum Beispiel. Höchste Zeit können wir die 80-Bit-FPU-Katastrophe einen entfernten schlechten Speicher nennen. –

Antwort

11

Auch SIMD-Implementierungen neigen dazu, mindestens 128bit breit zu sein, also frage ich mich, bedeutet das, dass die (interne) Präzision der Operationen höher ist als für die x87 FP-Einheit?

Die Breite eines SIMD-Registers ist nicht die Breite einer einzelnen Komponente des Vektors, den es darstellt. Weithin verfügbare SIMD-Befehlssätze bieten höchstens das IEEE 754-Binär-64-Format (64 Bit breit). Dies ist nicht annähernd so gut wie das historische 80-Bit-Format für Präzision oder Reichweite.

Viele C-Compiler stellen das 80-Bit-Format als long double-Typ zur Verfügung. Ich benutze es oft. Es ist gut, es für die meisten Zwischenberechnungen zu verwenden: die Verwendung von es trägt dazu bei, das Endergebnis genauer zu machen, selbst wenn das Endergebnis als binär zurückgegeben werden soll64 double. Ein Beispiel ist die Funktion in this question, für die eine mathematisch intuitive Eigenschaft des Endergebnisses gilt, wenn Zwischenberechnungen mit long double durchgeführt werden, aber nicht, wenn Zwischenberechnungen mit dem gleichen double Typ als die Eingänge und die Ausgabe ausgeführt werden.

ähnlich, unter vielen Einschränkungen, die bei der Auswahl der Parameter für das erweiterten 80-Bit-Format, eine Überlegung ist, ausgeglichen werden mußten, dass es zu compute eine binary64 Funktion pow() durch Zusammen 80-Bit expl() und logl() perfekt ist. Die zusätzliche Genauigkeit ist notwendig, um eine gute Genauigkeit für das Endergebnis zu erhalten.

ich sollte jedoch zu beachten, dass, wenn die „intermediate“ Berechnungen ein einzelner Grund Betrieb sind, ist es besser, nicht durch erweiterte Präzision zu gehen. Mit anderen Worten, wenn x und y vom Typ double sind, ist die Genauigkeit von (double)(x * (long double)y) sehr geringfügig schlechter als die Genauigkeit von x * y. Die beiden Ausdrücke führen fast immer zu denselben Ergebnissen, und in den seltenen Fällen, in denen sie sich unterscheiden, ist x * y sehr geringfügig genauer. Dieses Phänomen wird double-rounding genannt.

+0

Also gibt es keine 128bit Gleitkommadarstellung für den Einsatz in SIMD-Einheiten? –

+0

z.B. das "IEEE 754 Vierfachpräzisions-Binär-Gleitkommaformat" –

+1

@ user3735658 In den meisten 128-Bit-SIMD-Befehlssätzen steht ein "128-Bit-Register" für zwei "binary64" oder vier "binary32" und kann niemals für eins verwendet werden einzelner 'binary128'-Wert. –