Gleitkommaregeln (Direct3D 11)

Direct3D 11 unterstützt mehrere Gleitkommadarstellungen. Alle Gleitkommaberechnungen werden unter einer definierten Teilmenge der IEEE 754 32-Bit-Gleitkommaregeln mit einzeler Genauigkeit ausgeführt.

32-Bit-Gleitkommaregeln

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

Ehrte IEEE-754-Regeln

Einige dieser Regeln sind eine einzige Option, bei der IEEE-754 Optionen bietet.

  • Divid by 0 erzeugt +/- INF, außer 0/0, was zu NaN führt.
  • log of (+/-) 0 erzeugt -INF. Das Protokoll eines negativen Werts (außer -0) erzeugt NaN.
  • Reziproke Quadratwurzel (rsq) oder Quadratwurzel (sqrt) einer negativen Zahl erzeugt NaN. Die Ausnahme ist -0; sqrt(-0) erzeugt -0 und rsq(-0) erzeugt -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 einer oder beide Operanden NaN ist, gibt FALSE zurück.
  • Vergleiche ignorieren das Vorzeichen 0 (sodass +0 gleich -0 ist).
  • Der Vergleichs-NE, wenn einer oder beide Operanden NaN ist, gibt TRUE zurück.
  • Vergleiche eines beliebigen Nicht-NaN-Werts 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 dem nächsten darstellbaren Wert zu einem unendlich präzisen Ergebnis entspricht, das als Round-to-Nearest-Even bezeichnet wird. Direct3D 11 definiert die gleiche Anforderung: 32-Bit-Gleitkommavorgänge erzeugen ein Ergebnis, das innerhalb von 0,5 Unit-Last-Place (ULP) des unendlich präzisen Ergebnisses liegt. Dies bedeutet, dass die Hardware beispielsweise die 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 Addition, Subtraktion und Multiplikation.

  • Es gibt keine Unterstützung für Gleitkommaausnahmen, status Bits oder Traps.

  • Denormale werden bei der Eingabe und Ausgabe eines mathematischen Gleitkommavorgangs in vorzeichenbehaltene Null geleert. Ausnahmen werden für alle E/A- oder Datenverschiebungsvorgänge vorgenommen, die die Daten nicht bearbeiten.

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

  • Min- oder max.-Vorgänge spülen Denormale für den Vergleich, aber das Ergebnis kann oder nicht normal geleert werden.

  • Die NaN-Eingabe für einen Vorgang erzeugt immer NaN bei der Ausgabe. Das genaue Bitmuster des NaN muss jedoch nicht gleich bleiben (es sei denn, der Vorgang ist eine unformatierte Verschiebungsanweisung , die keine Daten ändert.)

  • Min- oder max-Vorgänge, für die nur ein Operand NaN ist, geben den anderen Operanden als Ergebnis zurück (im Gegensatz zu den Vergleichsregeln, die wir uns zuvor angesehen haben). Dies ist eine IEEE 754R-Regel.

    Die IEEE-754R-Spezifikation für Gleitkommavorgänge für min- und max.-Vorgänge besagt, dass das Ergebnis des Vorgangs der andere Parameter ist, wenn einer der Eingaben auf min oder max ein leiser QNaN-Wert ist. Beispiel:

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

    Bei einer Überarbeitung der IEEE-754R-Spezifikation wurde ein anderes Verhalten für Min. und Max. angenommen, wenn eine Eingabe ein signalisierender 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 höher unterscheiden nicht zwischen leisen und signalisierenden NaN-Werten (QNaN und SNaN). Alle NaN-Werte werden auf die gleiche Weise behandelt. Im Fall von min und max entspricht das Direct3D-Verhalten für jeden NaN-Wert der Behandlung von QNaN in der IEEE-754R-Definition. (Zur Vollständigkeit: Wenn beide Eingaben NaN sind, wird ein beliebiger NaN-Wert zurückgegeben.)

  • Eine weitere IEEE 754R-Regel ist min(-0,+0) == min(+0,-0) == -0 und max(-0,+0) == max(+0,-0) == + 0, das das Zeichen im Gegensatz zu den Vergleichsregeln für signierte Null (wie bereits erwähnt) honoriert. Direct3D empfiehlt hier das IEEE 754R-Verhalten, erzwingt es aber nicht. es ist zulässig, dass das Ergebnis des Vergleichs von Nullen von der Reihenfolge der Parameter abhängig ist, wobei ein Vergleich verwendet wird, der die Zeichen ignoriert.

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

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

  • x +/- 0.0f führt immer zu x (außer denorm flushed). Aber -0 + 0 = +0.

  • Fused Operations (z. B. mad, dp3) führen zu Ergebnissen, die nicht weniger genau sind als die schlechteste mögliche serielle Reihenfolge der Auswertung der unfundierten Erweiterung des Vorgangs. Die Definition der bestmöglichen Reihenfolge im Sinne der Toleranz ist keine feste Definition für einen gegebenen Fusionsvorgang; es hängt von den jeweiligen Werten der Eingaben ab. Die einzelnen Schritte in der unfundierten Erweiterung sind jeweils zulässig 1 ULP-Toleranz (oder für alle Anweisungen, die Direct3D mit einer laxeren Toleranz als 1 ULP ruft, ist die laxe Toleranz zulässig).

  • Fused-Vorgänge entsprechen den gleichen NaN-Regeln wie nicht fusionierte Vorgänge.

  • sqrt und rcp haben eine ULP-Toleranz von 1. Die gegenseitigen und gegenseitigen Quadratwurzelanweisungen des Shaders , rcp und rsq, haben ihre eigenen entspannten Genauigkeitsanforderungen.

  • Multiplizieren und dividieren Sie jeden Betrieb auf der 32-Bit-Gleitkommagenauigkeitsebene (Genauigkeit auf 0,5 ULP für Multiplikation, 1,0 ULP für gegenseitigen Wert). Wenn x/y direkt implementiert wird, müssen die Ergebnisse eine höhere oder gleiche Genauigkeit aufweisen als eine zweistufige Methode.

Gleitkommaregeln mit 64 Bit (doppelte Genauigkeit)

Hardware- und Anzeigetreiber unterstützen optional Gleitkomma mit doppelter Genauigkeit. Wenn Sie ID3D11Device::CheckFeatureSupport mit D3D11_FEATURE_DOUBLES aufrufen, legt der Treiber DoublePrecisionFloatShaderOps of D3D11_FEATURE_DATA_DOUBLES auf TRUE fest, um die Unterstützung anzugeben. Der Treiber und die Hardware müssen dann alle Gleitkommaanweisungen mit doppelter Genauigkeit unterstützen.

Anweisungen mit doppelter Genauigkeit folgen den Ieee 754R-Verhaltensanforderungen.

Unterstützung für die Generierung von denormalisierten Werten ist für Daten mit doppelter Genauigkeit erforderlich (kein Flush-to-Zero-Verhalten). Ebenso lesen Anweisungen denormalisierte Daten nicht als signierte Null, sie berücksichtigen den normalisierten Wert.

16-Bit-Gleitkommaregeln

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

Format:

  • 1 Zeichenbit (s)in der MSB-Bitposition
  • 5 Bits des voreingenommenen Exponenten (e)
  • 10 Bits Der 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*unendlich (unendlich)
  • 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 (vorzeichen null)

32-Bit-Gleitkommaregeln enthalten auch 16-Bit-Gleitkommazahlen, die für das zuvor beschriebene Bitlayout angepasst werden. Ausnahmen bilden die folgenden Fälle:

  • Genauigkeit: Unfundierte Vorgänge für 16-Bit-Gleitkommazahlen erzeugen ein Ergebnis, das den nächsten darstellbaren Wert für ein unendlich präzises Ergebnis darstellt (nach IEEE-754, auf 16-Bit-Werte angewendet). 32-Bit-Gleitkommaregeln entsprechen der 1 ULP-Toleranz, 16-Bit-Gleitkommaregeln entsprechen 0,5 ULP für unfundierte Vorgänge und 0,6 ULP für fusionierte Vorgänge.
  • 16-Bit-Gleitkommazahlen behalten Normwerte bei.

11-Bit- und 10-Bit-Gleitkommaregeln

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

Format:

  • Kein Zeichenbit
  • 5 Bits des voreingenommenen Exponenten (e)
  • 6 Bits bruch (f) für ein 11-Bit-Format, 5 Bits Bruch (f) für ein 10-Bit-Format, wobei in beiden Fällen ein zusätzliches ausgeblendetes Bit vorhanden ist.

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 = +unendlich
  • 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 enthalten auch 11-Bit- und 10-Bit-Gleitkommazahlen, die für das zuvor beschriebene Bitlayout angepasst werden. Zu den Ausnahmen zählen:

  • Genauigkeit: 32-Bit-Gleitkommaregeln entsprechen 0,5 ULP.
  • 10/11-Bit-Gleitkommazahlen behalten Normalwerte bei.
  • Jeder Vorgang, der zu einer Zahl kleiner als 0 führen würde, wird auf 0 geklemmt.

Ressourcen

Texturen