Frage

Ich weiß, dass X87 eine höhere interne Präzision aufweist, was wahrscheinlich der größte Unterschied ist, den die Menschen zwischen ihm und SSE -Operationen sehen. Aber ich muss mich fragen, gibt es einen weiteren Vorteil für die Verwendung von X87? Ich habe die Angewohnheit zu tippen -mfpmath=sse automatisch in jedem Projekt, und ich frage mich, ob mir etwas anderes fehlt, was die X87 -FPU anbietet.

War es hilfreich?

Lösung

Für handgeschriebene ASM hat X87 einige Anweisungen, die im SSE-Befehlssatz nicht vorhanden sind.

Auf meinem Kopf sind alles trigonometrische Dinge wie Fsin, FCOs, Fatan, Fatan2 und einige exponentielle/logarithmus.

Mit gcc -O3 -ffast-math -mfpmath=387, GCC9 Wille Immer noch inline sin(x) als an fsin Anweisungen, unabhängig davon, was die Implementierung in LIBM verwendet hätte. (https://godbolt.org/z/euc5gp).

MSVC -Anrufe __libm_sse2_sin_precise Beim Kompilieren für 32-Bit x86.


Wenn Ihr Code die meiste Zeit mit Trigonometrie verbringt, können Sie möglicherweise einen geringfügigen Leistungsgewinn oder -verlust feststellen, wenn Sie X87 verwenden, je nachdem, ob Ihre Standard-Mathematik-Bibliothek-Implementierung mit SSE1/SSE2 schneller oder langsamer ist als der langsame Mikrocode für Slow Microcode für fsin Auf welcher CPU Sie verwenden.

CPU -Anbieter geben nicht viel Mühe, den Mikrocode für X87 -Anweisungen in den neuesten CPUs zu optimieren, da er allgemein als veraltet und selten angesehen wird. (Schauen Sie sich die UOP -Zählungen und den Durchsatz für komplexe X87 -Anweisungen in an Anweisungstische von Agner Fog In jüngsten Generationen von CPUs: mehr Zyklen als in älteren CPUs). Je neuer die CPU ist, desto wahrscheinlicher ist X87 langsamer als viele SSE- oder AVX -Anweisungen, um Protokoll-, Exp-, POW- oder Trig -Funktionen zu berechnen.

Auch wenn X87 verfügbar ist, verwenden nicht alle mathematischen Bibliotheken komplexe Anweisungen wie fsin Für die Implementierung von Funktionen wie sin(), oder insbesondere Exp/Protokoll, wenn ganzzahlige Tricks zum Manipulieren der logarithmischen FP-Bitmuster nützlich sind.

Einige DSP -Algorithmen verwenden viel Trig viel aus der Auto-Vektorisierung mit SIMD-Mathematikbibliotheken.

Für Math-Code, in dem Sie die meiste Zeit damit verbringen, Ergänzungen, Multiplikationen usw. zu verbringen, ist SSE normalerweise schneller.


Auch verwandt: Intel unterschätzt die Fehlergrenzen um 1,3 Quintillionen - der schlimmste Fall für fsin (katastrophale Stornierung für fsin Eingaben sehr nahe Pi) ist sehr schlecht. Software kann es besser machen, aber nur mit langsamen Techniken für erweiterte Präzision.

Andere Tipps

  1. Es ist auf wirklich alten Maschinen vorhanden.

EOF

FPU -Anweisungen sind kleiner als die SSE

  • Mit dem X87: SSE gibt es eine beträchtliche Vermächtnis und kleine Systemkompatibilität. SSE ist eine relativ neue Prozessorfunktion. Wenn Ihr Code auf einem eingebetteten Mikrocontroller ausgeführt wird, besteht eine gute Chance, dass die SSE -Anweisungen nicht unterstützt werden.

  • Sogar Systeme, bei denen keine FPU installiert ist, liefern häufig 80x87 Emulatoren, wodurch der Code transparent (mehr oder weniger) ausgeführt wird. Ich kenne keine SSE -Emulatoren - sicherlich eines meiner Systeme hat keine meiner Systeme.

  • Die 80x87 -Anweisungen haben gute parallele Betriebsmerkmale, die seit ihrer Einführung im Jahr 1982 oder so gründlich untersucht und analysiert wurden. Verschiedene Klone des X86 könnten auf eine SSE -Anleitung stehen.

Konvertierung zwischen float und double ist schneller mit x87 (normalerweise frei) als mit SSE. Mit x87 können Sie a laden und speichern float, double oder long double zum oder vom Registerstapel und er wird ohne zusätzliche Kosten in oder von verlängerter Präzision umgewandelt. Mit SSE sind zusätzliche Anweisungen erforderlich, um die Typumwandlung durchzuführen, wenn die Typen gemischt sind, da die Register enthalten float oder double Werte. Diese Conversion -Anweisungen sind ziemlich schnell, nehmen sich aber zusätzliche Zeit.

Die eigentliche Fix ist es, das Mischen nicht zu mischen float und double Übermäßig, natürlich nicht x87 zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top