Gleitkommaregeln (Direct3D 11)

Direct3D 11 unterstützt mehrere Gleitkommadarstellungen. Alle Gleitkommaberechnungen funktionieren unter einer definierten Teilmenge der IEEE 754 32-Bit-Single-Precision-Gleitkommaregeln.

32-Bit-Gleitkommaregeln

Es gibt zwei Regeln: diejenigen, die IEEE-754 entsprechen, und diejenigen, die vom Standard abweichen.

Ausgezeichneter IEEE-754-Regeln

Einige dieser Regeln sind eine einzige Option, in der IEEE-754 Auswahlmöglichkeiten bietet.

  • Trennzeichen nach 0 erzeugt +/- INF, außer 0/0, was zu NaN führt.
  • protokoll von (+/-) 0 erzeugt -INF. das Protokoll eines negativen Werts (außer -0) erzeugt NaN.
  • Die quadratische Wurzel (rsq) oder die Quadratwurzel (sqrt) einer negativen Zahl erzeugt NaN. Die Ausnahme lautet -0; sqrt(-0) erzeugt -0, und rsq(-0) produziert -INF.
  • INF - INF = NaN
  • (+/-) INF / (+/-)INF = NaN
  • (+/-) INF * 0 = NaN
  • NaN (any OP) any-value = NaN
  • Die Vergleiche EQ, GT, GE, LT und LE, wenn entweder oder beide Operanden NaN FALSE zurückgibt.
  • Vergleiche ignorieren das Zeichen von 0 (so +0 gleich -0).
  • Der Vergleich NE, wenn entweder oder beide Operanden NaN TRUE zurückgibt.
  • Vergleiche von nicht-NaN-Werten mit +/- INF geben das richtige Ergebnis zurück.

Abweichungen oder zusätzliche Anforderungen von IEEE-754-Regeln

  • IEEE-754 erfordert Gleitkommavorgänge, um ein Ergebnis zu erzeugen, das den nächsten repräsentativen Wert für ein unendlich präzises Ergebnis darstellt, das als round-to-nearest-even bezeichnet wird. Direct3D 11 definiert die gleiche Anforderung: 32-Bit-Gleitkommavorgänge erzeugen ein Ergebnis, das sich innerhalb von 0,5 Unit-last-place (ULP) des unendlich genauen Ergebnisses befindet. Dies bedeutet, dass beispielsweise Hardware Ergebnisse auf 32-Bit abschneiden darf, anstatt round-to-nearest-even durchzuführen, da dies zu einem Fehler von höchstens 0,5 ULP führen würde. Diese Regel gilt nur für Ergänzung, Subtraktion und Multiplikation.

  • Es gibt keine Unterstützung für Gleitkomma-Ausnahmen, Statusbits oder Traps.

  • Denormale werden auf eingabe- und Ausgabe aller gleitkommabasierten mathematischen Vorgänge gespült, um null zu signieren. Ausnahmen werden für jeden I/O- oder Datenbewegungsvorgang vorgenommen, der die Daten nicht bearbeitet.

  • Zustände, die Gleitkommawerte enthalten, z. B. Viewport MinDepth/MaxDepth, BorderColor-Werte, können als Denormierungswerte bereitgestellt werden und möglicherweise nicht gespült werden, bevor die Hardware sie verwendet.

  • Min- oder max.-Vorgänge spülen Denormierungen im Vergleich, aber das Ergebnis kann oder nicht normal gespült werden.

  • NaN-Eingabe an einen Vorgang erzeugt immer NaN auf Ausgabe. Aber das genaue Bitmuster des NaN ist nicht erforderlich, um identisch zu bleiben (es sei denn, der Vorgang ist eine unformatierte Verschiebungsanweisung - was keine Daten ändert.)

  • Min- oder Max-Vorgänge, für die nur ein Operand naN den anderen Operand als Ergebnis zurückgibt (im Gegensatz zu Vergleichsregeln, die wir zuvor betrachtet haben). Dies ist eine IEEE 754R-Regel.

    Die IEEE-754R-Spezifikation für Gleitkomma- und Max-Vorgänge gibt an, dass eine der Eingaben zu min oder max ein ruhiger QNaN-Wert ist, das Ergebnis des Vorgangs der andere Parameter ist. Beispiel:

    min(x,QNaN) == min(QNaN,x) == x (same for max)
    

    Eine Überarbeitung der IEEE-754R-Spezifikation hat ein anderes Verhalten für min und max. angenommen, wenn eine Eingabe ein "Signaling" SNaN-Wert im Vergleich zu einem QNaN-Wert ist:

    min(x,SNaN) == min(SNaN,x) == QNaN (same for max)
    
    

    Im Allgemeinen folgt Direct3D den Standards für Arithmetik: IEEE-754 und IEEE-754R. Aber in diesem Fall haben wir eine Abweichung.

    Die arithmetischen Regeln in Direct3D 10 und später unterscheiden sich nicht zwischen ruhigen und signalierenden NaN-Werten (QNaN versus SNaN). Alle NaN-Werte werden genauso behandelt. Im Fall von min und max ist das Direct3D-Verhalten für jeden NaN-Wert wie QNaN in der IEEE-754R-Definition behandelt. (Wenn beide Eingaben NaN sind, wird ein NaN-Wert zurückgegeben.)

  • Eine weitere IEEE 754R-Regel ist, dass min(-0,+0) == min(+0,-0) == -0 und max(-0,+0) == max(+0,-0) == +0, das das Signieren berücksichtigt, im Gegensatz zu den Vergleichsregeln für signierte Null (wie zuvor gesehen). Direct3D empfiehlt das IEEE 754R-Verhalten hier, jedoch nicht erzwingen; es ist zulässig, dass das Ergebnis des Vergleichs von Nullen abhängig von der Reihenfolge der Parameter ist, indem ein Vergleich verwendet wird, der die Zeichen ignoriert.

  • x*1.0f führt immer zu x (außer denormiert).

  • x/1.0f führt immer zu x (außer denormiert).

  • x +/- 0,0f führt immer zu x (außer denormiert). Aber -0 + 0 = +0.

  • Fused Operations (z. B. mad, dp3) erzeugen Ergebnisse, die nicht weniger genau sind als die schlechteste serielle Reihenfolge der Auswertung der unfussierten Erweiterung des Vorgangs. Die Definition der schlechtesten möglichen Reihenfolge, für den Zweck der Toleranz, ist keine feste Definition für einen bestimmten Fused-Vorgang; es hängt von den bestimmten Werten der Eingaben ab. Die einzelnen Schritte in der unfussierten Erweiterung sind jede zulässige 1 ULP-Toleranz (oder für alle Anweisungen, die Direct3D mit einer mehr laxen Toleranz als 1 ULP aufruft, ist die mehr laxe Toleranz zulässig).

  • Fused-Vorgänge entsprechen den gleichen NaN-Regeln wie Nicht-Fused-Vorgängen.

  • sqrt und rcp verfügen über 1 ULP-Toleranz. Der Shader- und die gegenseitigen Quadratstammanweisungen, rcp und rsq verfügen über eine eigene separate entspannte Genauigkeitsanforderung.

  • Multiplizieren und Teilen Sie jeden Vorgang auf der 32-Bit-Gleitkommagenauigkeitsebene (Genauigkeit auf 0,5 ULP für Multiplikation, 1,0 ULP für gegenseitig). Wenn x/y direkt implementiert wird, müssen Die Ergebnisse größer oder gleich genau sein als eine zweistufige Methode.

64-Bit-Gleitkommaregeln (Doppelte Genauigkeit)

Hardware- und Anzeigetreiber unterstützen optional doppelgenaue Gleitkommapunkte. Um die Unterstützung anzugeben, wenn Sie ID3D11Device::CheckFeatureSupport mit D3D11_FEATURE_DOUBLES aufrufen, legt der Treiber DoublePrecisionFloatShaderOps von D3D11_FEATURE_DATA_DOUBLES auf TRUE fest. Der Treiber und die Hardware müssen dann alle doppelgenauen Gleitkommaanweisungen unterstützen.

Doppelte Genauigkeitsanweisungen folgen ieee 754R-Verhaltensanforderungen.

Die Unterstützung für die Generation von denormalisierten Werten ist für Doppelgenauigkeitsdaten erforderlich (kein Flush-to-Zero-Verhalten). Ebenso lesen Anweisungen keine denormalisierten Daten als signierte Null, sie ehren dennormalen Wert.

16-Bit-Gleitkommaregeln

Direct3D 11 unterstützt auch 16-Bit-Darstellungen von Gleitkommanummern.

Format:

  • 1 Sign bit (s)in der MSB-Bitposition
  • 5 Bit der voreingenommenen Exponent (e)
  • 10 Bit von Bruch (f), mit einem zusätzlichen ausgeblendeten Bit

Ein Float16-Wert (v) folgt den folgenden Regeln:

  • wenn e == 31 und f != 0, dann ist v NaN unabhängig von s
  • wenn e == 31 und f == 0, dann v = (-1)s*infinity (signierte Infinity)
  • wenn e zwischen 0 und 31 liegt, dann v = (-1)s*2(e-15)*(1.f)
  • wenn e == 0 und f != 0, dann v = (-1)s*2(e-14)*(0.f) (denormalisierte Zahlen)
  • wenn e == 0 und f == 0, dann v = (-1)s*0 (signierte Null)

32-Bit-Gleitkommaregeln halten auch für 16-Bit-Gleitkommanummern fest, die für das zuvor beschriebene Bitlayout angepasst wurden. Ausnahmen bilden die folgenden Fälle:

  • Genauigkeit: Unfused-Vorgänge auf 16-Bit-Gleitkommazahlen erzeugen ein Ergebnis, das den nächsten repräsentativen Wert für ein unendlich präzises Ergebnis darstellt (rund zu nächster sogar, pro IEEE-754, auf 16-Bit-Werte angewendet). 32-Bit-Gleitkommaregeln entsprechen 1 ULP-Toleranz, 16-Bit-Gleitkommaregeln entsprechen 0,5 ULP für unfussierte Vorgänge und 0,6 ULP für fused-Vorgänge.
  • 16-Bit-Gleitkommanummern erhalten Denormale.

11-Bit- und 10-Bit-Gleitkommaregeln

Direct3D 11 unterstützt auch 11-Bit- und 10-Bit-Gleitkommaformate.

Format:

  • Kein Signierbit
  • 5 Bit der voreingenommenen Exponent (e)
  • 6 Bit von Bruch (f) für ein 11-Bit-Format, 5 Bit von Bruch (f) für ein 10-Bit-Format mit einem zusätzlichen ausgeblendeten Bit in beiden Fällen.

Ein Float11/float10-Wert (v) folgt den folgenden Regeln:

  • wenn e == 31 und f != 0, dann ist v NaN
  • wenn e == 31 und f == 0, dann v = +infinity
  • wenn e zwischen 0 und 31 liegt, dann v = 2(e-15)*(1.f)
  • wenn e == 0 und f != 0, dann v = *2(e-14)*(0.f) (denormalisierte Zahlen)
  • wenn e == 0 und f == 0, dann v = 0 (Null)

32-Bit-Gleitkommaregeln halten auch 11-Bit- und 10-Bit-Gleitkommanummern, angepasst für das zuvor beschriebene Bitlayout. Zu den Ausnahmen zählen:

  • Genauigkeit: 32-Bit-Gleitkommaregeln entsprechen 0,5 ULP.
  • 10/11-Bit-Gleitkommanummern erhalten Denormale.
  • Jeder Vorgang, der zu einer Zahl kleiner als null führt, wird auf Null geklammert.

Ressourcen

Texturen