Gleitkommaregeln (Direct3D 11)
Direct3D 11 unterstützt mehrere Gleitkommadarstellungen. Alle Gleitkommaberechnungen werden unter einer definierten Teilmenge der IEEE 754-32-Bit-Gleitkommaregeln mit einfacher Genauigkeit ausgeführt.
- 32-Bit-Gleitkommaregeln
- 64-Bit-Gleitkommaregeln (doppelte Genauigkeit)
- 16-Bit-Gleitkommaregeln
- 11-Bit- und 10-Bit-Gleitkommaregeln
- Verwandte Themen
32-Bit-Gleitkommaregeln
Es gibt zwei Regelsätze: diejenigen, die IEEE-754 entsprechen, und diejenigen, die vom Standard abweichen.
Eingehaltene IEEE-754-Regeln
Einige dieser Regeln sind eine einzige Option, bei der IEEE-754 Auswahlmöglichkeiten bietet.
- Dividieren durch 0 erzeugt +/- INF, mit Ausnahme von 0/0, dies ergibt NaN.
- Der Logarithmus von (+/-) 0 ergibt -INF. Der Logarithmus eines negativen Werts (außer -0) erzeugt NaN.
- Die reziproke Quadratwurzel (rsq) oder die Quadratwurzel (sqrt) einer negativen Zahl ergibt 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 geben FALSE zurück, wenn entweder ein Operand oder beide Operanden NaN sind.
- Vergleiche ignorieren das Vorzeichen 0 (sodass +0 gleich -0ist).
- Der Vergleich NE gibt TRUEzurück, wenn entweder ein oder beide Operanden NaN sind.
- Vergleiche eines Nicht-NaN-Werts mit +/- INF geben das richtige Ergebnis zurück.
Abweichungen oder zusätzliche Anforderungen von IEEE-754-Regeln
Gemäß IEEE-754 müssen Gleitkommavorgänge ein Ergebnis erzeugen, das den nächsten darstellbaren Wert für ein Ergebnis mit unendlicher Genauigkeit darstellt. Dies wird als „gerundet auf die nächste Ganzzahl“ bezeichnet. Direct3D 11 definiert die gleiche Anforderung: 32-Bit-Gleitkommavorgänge erzeugen ein Ergebnis, das innerhalb von 0,5 ULP (Unit Last Place, Einheit der geringsten Genauigkeit) des Ergebnisses mit unendlicher Genauigkeit liegt. Dies bedeutet, dass z. B. 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 Addition, Subtraktion und Multiplikation.
Es gibt keine Unterstützung für Gleitkommaausnahmen, Statusbits oder Traps.
Denormalisierte Werte werden bei der Eingabe und Ausgabe von mathematischen Gleitkommaoperationen auf Null mit beibehaltenem Vorzeichen zurückgesetzt. Ausnahmen werden für alle E/A- oder Datenverschiebungsvorgänge vorgenommen, die die Daten nicht bearbeiten.
Zustände, die Gleitkommawerte enthalten, wie z. B. Viewport MinDepth/MaxDepth- oder BorderColor-Werte, können als denormalisierte Werte angegeben und vor der Nutzung durch die Hardware zurückgesetzt oder auch nicht zurückgesetzt werden.
Min- oder Max-Operationen setzen denormalisierte Werte für den Vergleich zurück, aber das Ergebnis kann zurückgesetzte oder nicht zurückgesetzte denormalisierte Werte enthalten.
Eine NaN-Eingabe bei einer Operation führt immer zu NaN im Ergebnis. Das genaue Bitmuster des NaN ist jedoch nicht erforderlich, um gleich zu 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 Vergleichsregeln, die wir zuvor betrachtet haben). Dies ist eine IEEE 754R-Regel.
Die arithmetischen Regeln in Direct3D 10 und höher unterscheiden sich nicht zwischen "stillen" und "signalierenden" NaN-Werten (QNaN vs SNaN). Alle NaN-Werte werden auf die gleiche Weise behandelt.
Wenn beide Eingaben für min() oder max() NaN ergeben, wird ein beliebiger NaN-Wert zurückgegeben.
Eine IEEE 754R-Regel ist, dass min(-0,+0) == min(+0,-0) == -0 und max(-0,+0) == max(+0,-0) == +0; die das Zeichen ehren. Dies steht im Gegensatz zu den Vergleichsregeln für Null mit Vorzeichen (oben angegeben). Direct3D 11 empfiehlt hier das IEEE 754R-Verhalten, erzwingt es jedoch 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 ergibt immer x (außer bei zurückgesetzten denormalisierten Werten).
x/1,0f ergibt immer x (außer bei zurückgesetzten denormalisierten Werten).
x +/- 0,0f ergibt immer x (außer bei zurückgesetzten denormalisierten Werten). Aber: -0 + 0 = +0.
Fused-Operationen (z. B. mad, dp3) erzeugen Ergebnisse, die nicht weniger genau sind als die schlechtestmögliche serielle Reihenfolge der Auswertung der unfused-Erweiterung der Operation. Die Definition der schlimmsten möglichen Sortierung zum Zweck der Toleranz ist keine feste Definition für einen bestimmten Fused-Vorgang; sie hängt von den jeweiligen Werten der Eingaben ab. Die einzelnen Schritte in der unfused-Erweiterung dürfen jeweils eine Toleranz von 1 ULP aufweisen (oder bei Anweisungen, bei denen Direct3D eine lockerere Toleranz als 1 ULP festlegt, ist diese lockerere Toleranz zulässig).
Fused-Operationen halten die gleichen NaN-Regeln wie unfused-Operationen ein.
sqrt und rcp haben eine Toleranz von 1 ULP. Für die Shader-Anweisungen für Kehrwerte und die reziproke Quadratwurzel (rcp und rsq) gelten eigene lockere Präzisionsanforderungen.
Multiplikation und Division arbeiten jeweils mit 32-Bit-Gleitkommagenauigkeit (Genauigkeit auf 0,5 ULP für Multiplikation, 1,0 ULP für Kehrwert). 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 Gleitkommawerte mit doppelter Genauigkeit. Zum Angeben der Unterstützung beim Aufruf von ID3D11Device::CheckFeatureSupport mit D3D11_FEATURE_DOUBLES legt der Treiber DoublePrecisionFloatShaderOps von D3D11_FEATURE_DATA_DOUBLES auf TRUE fest. Treiber und 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 Erzeugung von denormalisierten Werten ist für Daten mit doppelter Genauigkeit erforderlich (kein Verhalten zum Zurücksetzen auf Null). Ebenso lesen Befehle denormalisierte Daten nicht als signierte Null, sondern berücksichtigen den denormalisierten Wert.
16-Bit-Gleitkommaregeln
Direct3D 11 unterstützt auch 16-Bit-Darstellungen von Gleitkommazahlen.
Format:
- 1 Vorzeichenbit (s) in der MSB-Bitposition
- 5 Bits für verschobenen Exponenten (e)
- 10 Bit des Bruchs (f) mit einem zusätzlichen versteckten 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 (Unendlichkeit mit Vorzeichen)
- 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 (signiert null)
32-Bit-Gleitkommaregeln gelten auch für 16-Bit-Gleitkommazahlen, die an das zuvor beschriebene Bitlayout angepasst wurden. Zu diesen Ausnahmen gehören:
- Genauigkeit: Unfused-Operationen für 16-Bit-Gleitkommazahlen erzeugen ein Ergebnis, das den nächsten darstellbaren Wert zu einem Ergebnis mit unendlicher Genauigkeit darstellt (gemäß IEEE-754 auf die nächste gerade Zahl gerundet, angewendet auf 16-Bit-Werte). 32-Bit-Gleitkommaregeln entsprechen der Toleranz von 1 ULP, 16-Bit-Gleitkommaregeln entsprechen 0,5 ULP für unfused-Operationen und 0,6 ULP für fused-Operationen.
- 16-Bit-Gleitkommazahlen behalten denormalisierte Werte bei.
11-Bit- und 10-Bit-Gleitkommaregeln
Direct3D 11 unterstützt auch 11-Bit- und 10-Bit-Gleitkommaformate.
Format:
- Kein Vorzeichenbit
- 5 Bits für verschobenen Exponenten (e)
- 6 Bits des Bruchs (f) für ein 11-Bit-Format, 5 Bits des Bruchs (f) für ein 10-Bit-Format, jeweils mit einem zusätzlichen versteckten Bit.
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 wurden. Zu den Ausnahmen gehören:
- Genauigkeit: 32-Bit-Gleitkommaregeln entsprechen 0,5 ULP.
- 10/11-Bit-Gleitkommazahlen behalten denormalisierte Werte bei.
- Jeder Vorgang, der zu einer Zahl kleiner als 0 führen würde, wird auf Null geklemmt.
Verwandte Themen