2013-02-28 17 views
9

Die x87-FPU zeichnet sich durch einen internen 80-Bit-Präzisionsmodus aus, der oft zu unerwarteten und nicht reproduzierbaren Ergebnissen zwischen Compilern und Maschinen führt. In my search für reproduzierbare Fließkomma-Mathematik auf .NET, entdeckte ich, dass beide großen Implementierungen von .NET (Microsoft und Mono) SSE-Anweisungen anstelle von x87 im 64-Bit-Modus emittieren.Ist SSE Fließkommaarithmetik reproduzierbar?

SSE (2) verwendet streng 32-Bit-Register für 32-Bit-Gleitkommazahlen und streng 64-Bit-Register für 64-Bit-Gleitkommazahlen. Denormale können optional auf 0 gesetzt werden, indem appropriate control word gesetzt wird.

Es scheint daher, dass SSE leidet nicht unter den Genauigkeitsfragen von x87, und dass die einzige Variable ist das derormale Verhalten, das gesteuert werden kann.

Abgesehen von transzendentalen Funktionen (die im Gegensatz zu x87 nicht von SSE bereitgestellt werden), garantiert die Verwendung von SSE reproduzierbare Ergebnisse auf Rechnern und Compilern? Könnten zum Beispiel Compiler-Optimierungen in andere Ergebnisse übersetzt werden? Ich habe ein paar konträre Meinungen gefunden:

Wenn Sie SSE2 haben, verwenden Sie es und leben Sie glücklich bis ans Ende der Welt. SSE2 unterstützt sowohl 32b als auch 64b Operationen und die Zwischenergebnisse sind der Größe der Operanden. - Yossi Kreinin, http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html

...

Die SSE2 Instruktionen (...) sind voll IEEE754-1985 konform und sie erlauben eine bessere Reproduzierbarkeit (dank der statischen Rundungs Präzision) und Portabilität mit anderen Plattformen. Muller et aliis, Handbook of Floating-Point Arithmetic - S.107

jedoch:

Sie können aber auch nicht für Floating-Point verwenden SSE oder SSE2, weil es zu ist unter spezifizierten deterministisch zu sein . - John Watte http://www.gamedev.net/topic/499435-floating-point-determinism/#entry4259411

+1

Ich bin mir ziemlich sicher, dass, wenn es zwei widersprüchliche Meinungen im Internet gibt, Sie hier ein Argument bekommen (und wahrscheinlich auch eine dritte Meinung) – KevinDTimm

+1

@KevinDTimm, die diese Frage jedoch nicht subjektiv macht. SSE ist entweder reproduzierbar oder nicht. – Asik

+1

"SSE oder SSE2 [ist] zu niedrig angegeben, um deterministisch zu sein". Ich behaupte nicht, ein Experte in diesen Angelegenheiten zu sein, aber das klingt nach BS für mich. In dem Link wird über Bibliotheksfunktionen für Transzendentale gesprochen, und natürlich könnte es Fehler in denen auf einer Plattform und nicht in einer anderen geben, wie es tatsächlich in jedem Optimierer des Compilers sein könnte, aber das sagt nichts über SSE aus/SSE2 an sich. Hat er ein Beispiel dafür, was er meint? –

Antwort

9

SSE ist vollständig angegeben *. Muller ist Experte für Gleitkommaarithmetik; Wem wirst du vertrauen, er oder irgendein Typ in einem Gamedev-Forum?

(*) Es gibt tatsächlich ein paar Ausnahmen für Nicht-IEEE-754-Operationen wie rsqrtss, bei denen Intel das Verhalten nie vollständig spezifizierte, aber das hat keine Auswirkungen auf die IEEE-754-Grundoperationen und, was noch wichtiger ist, ihr Verhalten Das ändert sich an dieser Stelle nicht, da die Binärkompatibilität für zu viele Dinge unterbrochen wird. Sie sind also so gut wie angegeben.

3

Wie Stephen bemerkte, werden Ergebnisse, die durch ein gegebenes Stück SSE-Assemblercode erzeugt werden, reproduzierbar sein; Sie füttern denselben Code mit der gleichen Eingabe und am Ende erhalten Sie die gleiche Ausgabe. (Das heißt, das Zitat von John Watte ist falsch.)

Sie haben das Wort "Compiler" dort hineingeschleudert. Das ist ein ganz anderes Ballspiel. Viele Compiler sind immer noch ziemlich schlecht darin, die Korrektheit von Fließkomma-Code zu bewahren.(The ATLAS errata page erwähnt, dass "clang" für einige Operationen keinen korrekten Code erzeugt.) Wenn Sie spezielle Funktionen in Ihrem Code verwenden, sind Sie auch in gewisser Weise der Gnade derer ausgesetzt, die Ihre Mathebibliothek implementiert haben.