Gleitkommaformat mit halber Genauigkeit - Half-precision floating-point format

In der Computertechnik ist halbe Genauigkeit (manchmal auch als FP16 bezeichnet ) ein binäres Fließkomma- Computerzahlenformat , das 16 Bit (zwei Byte in modernen Computern) im Computerspeicher belegt .

Sie können Werte im Bereich von ±65.504 ausdrücken, wobei der Mindestwert über 1 1 + 1/1024 ist.

Im IEEE 754-2008- Standard wird das 16-Bit- Basis-2- Format als binär16 bezeichnet . Es ist für die Speicherung von Gleitkommawerten in Anwendungen gedacht, bei denen eine höhere Genauigkeit für die Durchführung arithmetischer Berechnungen nicht unbedingt erforderlich ist.

Obwohl Implementierungen des IEEE-Gleitkomma mit halber Genauigkeit relativ neu sind, gab es mehrere frühere 16-Bit-Gleitkommaformate, darunter das von Hitachis HD61810 DSP von 1982, Scotts WIF und dem 3dfx Voodoo Graphics Prozessor .

Nvidia und Microsoft definierten den halben Datentyp in der Sprache Cg , die Anfang 2002 veröffentlicht wurde, und implementierten ihn in Silizium in der GeForce FX , die Ende 2002 veröffentlicht wurde. ILM suchte nach einem Bildformat, das einen großen Dynamikbereich verarbeiten konnte , jedoch ohne die without Festplatten- und Speicherkosten von Gleitkommadarstellungen, die häufig für Gleitkommaberechnungen verwendet werden (einfache und doppelte Genauigkeit). Die von John Airey bei SGI (Silicon Graphics) geleitete hardwarebeschleunigte programmierbare Shading-Gruppe erfand 1997 den s10e5-Datentyp als Teil des "Bali"-Designs. Dies ist in einem SIGGRAPH 2000-Papier (siehe Abschnitt 4.3) beschrieben und im US-Patent 7518615 weiter dokumentiert.

Dieses Format wird in mehreren Computergrafikumgebungen verwendet, darunter MATLAB , OpenEXR , JPEG XR , GIMP , OpenGL , Cg , Direct3D und D3DX . Der Vorteil gegenüber 8-Bit- oder 16-Bit-Binär-Integern besteht darin, dass durch den erhöhten Dynamikbereich mehr Details in Lichtern und Schatten für Bilder erhalten werden können. Der Vorteil gegenüber 32-Bit - Binärformaten mit einfacher Genauigkeit besteht darin, dass es die Hälfte des Speicherplatzes und der Bandbreite benötigt (auf Kosten von Präzision und Reichweite).

Die F16C- Erweiterung ermöglicht x86-Prozessoren, Gleitkommazahlen mit halber Genauigkeit in Gleitkommazahlen mit einfacher Genauigkeit zu konvertieren .

Je nach Computer kann halbe Genauigkeit um eine Größenordnung schneller sein als doppelte Genauigkeit, zB 550 PFLOPS für halbe Genauigkeit gegenüber 37 PFLOPS für doppelte Genauigkeit bei einem Cloud-Anbieter.

IEEE 754 binäres Gleitkommaformat mit halber Genauigkeit: binary16

Der IEEE 754-Standard spezifiziert eine Binärdatei16 mit dem folgenden Format:

Das Format ist wie folgt aufgebaut:

IEEE 754r Half Floating Point Format.svg

Es wird angenommen, dass das Format ein implizites führendes Bit mit dem Wert 1 hat, es sei denn, das Exponentenfeld wird mit Nullen gespeichert. Somit erscheinen nur 10 Bit des Signifikanten im Speicherformat, aber die Gesamtgenauigkeit beträgt 11 Bit. Im IEEE 754-Sprachgebrauch gibt es 10 Bit Signifikand, aber es gibt 11 Bit Signifikand-Präzision (log 10 (2 11 ) ≈ 3,311 Dezimalstellen oder 4 Stellen ± etwas weniger als 5 Einheiten an letzter Stelle ).

Exponentencodierung

Der binäre Gleitkommaexponent mit halber Genauigkeit wird unter Verwendung einer Offset-Binär- Darstellung codiert , wobei der Null-Offset 15 beträgt; im IEEE 754-Standard auch als Exponent-Bias bekannt.

  • E min = 00001 2 - 01111 2 = -14
  • E max = 11110 2 − 01111 2 = 15
  • Exponenten-Bias = 01111 2 = 15

Somit muss, wie durch die Offset-Binärdarstellung definiert, der Offset von 15 vom gespeicherten Exponenten abgezogen werden, um den wahren Exponenten zu erhalten.

Die gespeicherten Exponenten 00000 2 und 11111 2 werden speziell interpretiert.

Exponent Signifikant = null Signifikant ≠ null≠ Gleichung
00000 2 null , -0 subnormale Zahlen (−1) Vorzeichenbit × 2 −14 × 0.significantbits 2
00001 2 , ..., 11110 2 normalisierter Wert (−1) Vorzeichenbit × 2 Exponent−15 × 1.Significantbits 2
11111 2 ± unendlich NaN (ruhig, signalisierend)

Der minimale streng positive (subnormale) Wert ist 2 −24 ≈ 5,96 × 10 −8 . Der minimale positive Normalwert beträgt 2 −14 ≈ 6,10 × 10 −5 . Der maximal darstellbare Wert beträgt (2−2 −10 ) × 2 15 = 65504.

Beispiele mit halber Genauigkeit

Diese Beispiele sind in Bitdarstellung des Gleitkommawerts angegeben. Dazu gehören das Vorzeichenbit, der (vorgespannte) Exponent und der Signifikand.

0 00000 00000000012 = 000116 =  ≈ 0.000000059604645
                              (smallest positive subnormal number)
0 00000 11111111112 = 03ff16 =  ≈ 0.000060975552
                              (largest subnormal number)
0 00001 00000000002 = 040016 =  ≈ 0.00006103515625
                              (smallest positive normal number)
0 11110 11111111112 = 7bff16 =  = 65504
                              (largest normal number)
0 01110 11111111112 = 3bff16 =  ≈ 0.99951172
                              (largest number less than one)
0 01111 00000000002 = 3c0016 =  = 1
                              (one)
0 01111 00000000012 = 3c0116 =  ≈ 1.00097656
                              (smallest number larger than one)
0 01101 01010101012 = 355516 =  = 0.33325195
                              (the rounding of 1/3 to nearest)
1 10000 00000000002 = c00016 = −2
0 00000 00000000002 = 000016 = 0
1 00000 00000000002 = 800016 = −0
0 11111 00000000002 = 7c0016 = infinity
1 11111 00000000002 = fc0016 = −infinity

Standardmäßig wird 1/3 wie bei doppelter Genauigkeit abgerundet , da die Anzahl der Bits im Signifikand ungerade ist. Die Bits jenseits des Rundungspunktes sind an letzter Stelle0101... weniger als 1/2 einer Einheit .

Genauigkeitsbeschränkungen für Dezimalwerte in [0, 1]

  • Dezimalstellen zwischen 2 –24 (minimaler positiver Subnormal) und 2 –14 (maximaler Subnormal): festes Intervall 2 –24
  • Dezimalstellen zwischen 2 −14 (minimaler positiver Normalwert) und 2 −13 : festes Intervall 2 −24
  • Dezimalstellen zwischen 2 −13 und 2 −12 : festes Intervall 2 −23
  • Dezimalstellen zwischen 2 −12 und 2 −11 : festes Intervall 2 −22
  • Dezimalstellen zwischen 2 −11 und 2 −10 : festes Intervall 2 −21
  • Dezimalstellen zwischen 2 −10 und 2 −9 : festes Intervall 2 −20
  • Dezimalstellen zwischen 2 −9 und 2 −8 : festes Intervall 2 −19
  • Dezimalstellen zwischen 2 −8 und 2 −7 : festes Intervall 2 −18
  • Dezimalstellen zwischen 2 −7 und 2 −6 : festes Intervall 2 −17
  • Dezimalstellen zwischen 2 −6 und 2 −5 : festes Intervall 2 −16
  • Dezimalstellen zwischen 2 −5 und 2 −4 : festes Intervall 2 −15
  • Dezimalstellen zwischen 2 −4 und 2 −3 : festes Intervall 2 −14
  • Dezimalstellen zwischen 2 −3 und 2 −2 : festes Intervall 2 −13
  • Dezimalstellen zwischen 2 −2 und 2 −1 : festes Intervall 2 −12
  • Dezimalstellen zwischen 2 −1 und 2 −0 : festes Intervall 2 −11

Genauigkeitsbeschränkungen für Dezimalwerte in [1, 2048]

  • Dezimalstellen zwischen 1 und 2: festes Intervall 2 −10 (1+2 −10 ist der nächstgrößere Float nach 1)
  • Dezimalstellen zwischen 2 und 4: festes Intervall 2 −9
  • Dezimalstellen zwischen 4 und 8: festes Intervall 2 −8
  • Dezimalstellen zwischen 8 und 16: festes Intervall 2 −7
  • Dezimalstellen zwischen 16 und 32: festes Intervall 2 −6
  • Dezimalstellen zwischen 32 und 64: festes Intervall 2 −5
  • Dezimalstellen zwischen 64 und 128: festes Intervall 2 −4
  • Dezimalstellen zwischen 128 und 256: festes Intervall 2 −3
  • Dezimalstellen zwischen 256 und 512: festes Intervall 2 −2
  • Dezimalstellen zwischen 512 und 1024: festes Intervall 2 −1
  • Dezimalstellen zwischen 1024 und 2048: festes Intervall 2 0

Genauigkeitsbeschränkungen für ganzzahlige Werte

  • Ganzzahlen zwischen 0 und 2048 können exakt dargestellt werden (und auch zwischen −2048 und 0)
  • Ganzzahlen zwischen 2048 und 4096 runden auf ein Vielfaches von 2 (gerade Zahl)
  • Ganzzahlen zwischen 4096 und 8192 runden auf ein Vielfaches von 4
  • Ganzzahlen zwischen 8192 und 16384 runden auf ein Vielfaches von 8
  • Ganzzahlen zwischen 16384 und 32768 runden auf ein Vielfaches von 16
  • Ganzzahlen zwischen 32768 und 65519 runden auf ein Vielfaches von 32
  • Ganzzahlen über 65519 werden auf "unendlich" gerundet, wenn auf gerade gerundet wird, oder über 65535, wenn auf null gerundet wird, oder über 65504 (der größte darstellbare endliche Wert), wenn auf unendlich gerundet wird.

ARM-Alternative halbe Genauigkeit

ARM-Prozessoren unterstützen (über ein Gleitkomma- Steuerregisterbit ) ein "alternatives halbgenaues" Format, das den Sonderfall für einen Exponentenwert von 31 (11111 2 ) aufhebt . Es ist fast identisch mit dem IEEE-Format, aber es gibt keine Codierung für unendlich oder NaNs; stattdessen kodiert ein Exponent von 31 normalisierte Zahlen im Bereich von 65536 bis 131008.

Verwendet

Hardware und Software für maschinelles Lernen oder neuronale Netze verwenden in der Regel halbe Genauigkeit: Solche Anwendungen führen normalerweise viele Berechnungen durch, erfordern jedoch kein hohes Maß an Präzision.

Auf älteren Computern, die gleichzeitig auf 8 oder 16 Bit zugreifen (die meisten modernen Computer greifen auf 32 oder 64 Bit gleichzeitig zu), ist die Arithmetik mit halber Genauigkeit schneller als mit einfacher Genauigkeit und wesentlich schneller als mit doppelter Genauigkeit. Auf Systemen mit Befehlen, die mehrere Gleitkommazahlen in einem Befehl verarbeiten können, bietet die halbe Genauigkeit oft einen höheren durchschnittlichen Durchsatz.

Siehe auch

Verweise

Weiterlesen

Externe Links