bfloat16 Gleitkommaformat - bfloat16 floating-point format

Das Gleitkommaformat bfloat16 ( Brain Floating Point ) ist ein Computerzahlenformat, das 16 Bit im Computerspeicher belegt ; es repräsentiert einen breiten dynamischen Bereich numerischer Werte durch die Verwendung eines Gleitkommas . Dieses Format ist eine gekürzte (16-Bit) Version des 32-Bit IEEE 754-Gleitkommaformats mit einfacher Genauigkeit (binary32) mit der Absicht , maschinelles Lernen und Near-Sensor-Computing zu beschleunigen . Es behält den ungefähren Dynamikbereich von 32-Bit-Gleitkommazahlen durch Beibehaltung von 8 Exponentenbits bei , unterstützt jedoch nur eine 8-Bit-Präzision anstelle des 24-Bit- Signifikands des Binär32-Formats. Mehr als 32-Bit-Gleitkommazahlen mit einfacher Genauigkeit sind bfloat16-Zahlen für Integer-Berechnungen ungeeignet, aber dies ist nicht deren beabsichtigte Verwendung. Bfloat16 wird verwendet, um den Speicherbedarf zu reduzieren und die Berechnungsgeschwindigkeit von Machine-Learning-Algorithmen zu erhöhen.

Das bfloat16-Format wurde von Google Brain entwickelt , einer Forschungsgruppe für künstliche Intelligenz bei Google. Das bfloat16-Format wird in Intel AI-Prozessoren wie Nervana NNP-L1000, Xeon- Prozessoren ( AVX-512 BF16-Erweiterungen) und Intel FPGAs , Google Cloud TPUs und TensorFlow verwendet . ARMv8.6-A , AMD ROCm und CUDA unterstützen auch das bfloat16-Format. Auf diesen Plattformen kann bfloat16 auch in Mixed-Precision-Arithmetik verwendet werden , bei der bfloat16-Zahlen bearbeitet und auf breitere Datentypen erweitert werden können.

bfloat16 Gleitkommaformat

bfloat16 hat das folgende Format:

Das bfloat16-Format, ein abgeschnittenes IEEE 754-Einzelpräzisions- 32-Bit-Float, ermöglicht eine schnelle Konvertierung in und von einem IEEE 754-Einzelpräzisions-32-Bit-Float; bei der Konvertierung in das bfloat16-Format bleiben die Exponentenbits erhalten, während das Signifikandenfeld durch Abschneiden reduziert werden kann (entspricht also dem Runden auf 0 ), wobei der NaN- Sonderfall ignoriert wird. Das Beibehalten der Exponentenbits behält den 32-Bit-Floatbereich von 10 –38 bis ≈ 3 × 10 38 bei .

Die Bits sind wie folgt angeordnet:

IEEE 16-Bit-Float mit halber Genauigkeit
Unterschrift Exponent (5 Bit) Bruch (10 Bit)
  ┃ ┌───────┐ ┌─────────────────┐
 0   0   1   1   0   0   0   1   0   0   0   0   0   0   0   0 
fünfzehn 14 10 9 0
IEEE 754 32-Bit-Float mit einfacher Genauigkeit
Unterschrift Exponent (8 Bit) Bruch (23 Bit)
  ┃ ┌─────────────┐ ┌───────────────────────────────────────────┐
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
31 30 23 22 0
bfloat16
Unterschrift Exponent (8 Bit) Bruch (7 Bit)
  ┃ ┌─────────────┐ ┌───────────┐
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0 
fünfzehn 14 7 6 0
NVidias TensorFloat
Unterschrift Exponent (8 Bit) Bruch (10 Bit)
  ┃ ┌─────────────┐ ┌─────────────────┐
 0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0 
18 17 10 9 0
AMDs fp24-Format
Unterschrift Exponent (7 Bit) Bruch (16 Bit)
  ┃ ┌───────────┐ ┌─────────────────────────────┐
 0   0   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
23 22 16 fünfzehn 0
Das PXR24-Format von Pixar
Unterschrift Exponent (8 Bit) Bruch (15 Bit)
  ┃ ┌─────────────┐ ┌───────────────────────────┐
 0   0   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
23 22 fünfzehn 14 0

Kontrast mit bfloat16 und einfacher Präzision

S E E E E E E E E F F F F F F F F F F F F F F F F F F F F F F F

Legende

  •   S: Zeichen
  •   E: Exponent
  •   F: Bruch (nachgestelltes Signifikand ) in beiden Formaten
  •   f: Bruch (nachlaufender Signifikand) in 32-Bit einfacher Genauigkeit (Vergleich)

Exponentencodierung

Der binäre Gleitkommaexponent bfloat16 wird unter Verwendung einer Offset-Binär- Darstellung codiert , wobei der Null-Offset 127 beträgt; im IEEE 754-Standard auch als Exponenten-Bias bekannt.

  • E min = 01 H -7F H = -126
  • E max = FE H -7F H = 127
  • Exponenten-Bias = 7F H = 127

Um also den wahren Exponenten zu erhalten, wie er durch die Offset-Binärdarstellung definiert ist, muss der Offset von 127 vom Wert des Exponentenfeldes subtrahiert werden.

Die Minimal- und Maximalwerte des Exponentenfeldes (00 H und FF H ) werden speziell interpretiert, wie in den IEEE 754-Standardformaten.

Exponent Signifikant Null Signifikantund ungleich Null Gleichung
00 H null , -0 subnormale Zahlen (−1) Vorzeichenbit ×2 −126 × 0.significandbits
01 H , ..., FE H normalisierter Wert (−1) Vorzeichenbit ×2 Exponentbits−127 × 1.significandbits
FF H ± unendlich NaN (ruhig, signalisierend)

Der minimale positive Normalwert beträgt 2 −126 ≈ 1,18 × 10 −38 und der minimale positive (subnormale) Wert beträgt 2 −126−7 = 2 −133 ≈ 9,2 × 10 −41 .

Kodierung von Sonderwerten

Positive und negative Unendlichkeit

Genau wie in IEEE 754 werden positive und negative Unendlichkeit mit ihren entsprechenden Vorzeichenbits dargestellt , alle 8 Exponentenbits gesetzt (FF hex ) und alle Vorzeichenbits Null. Ausdrücklich,

val    s_exponent_signcnd
+inf = 0_11111111_0000000
-inf = 1_11111111_0000000

Keine Zahl

Genau wie in IEEE 754 werden NaN- Werte mit einem der beiden Vorzeichenbits dargestellt, wobei alle 8 Exponentenbits gesetzt sind (FF hex ) und nicht alle Vorzeichenbits null sind. Ausdrücklich,

val    s_exponent_signcnd
+NaN = 0_11111111_klmnopq
-NaN = 1_11111111_klmnopq

wobei mindestens eines von k, l, m, n, o, p oder q 1 ist. Wie bei IEEE 754 können NaN-Werte ruhig oder signalisierend sein, obwohl es seit September 2018 keine bekannten Verwendungen für die Signalisierung von bfloat16-NaNs gibt.

Reichweite und Präzision

Bfloat16 wurde entwickelt, um den Zahlenbereich aus dem 32-Bit- IEEE 754-Gleitkommaformat mit einfacher Genauigkeit (binary32) beizubehalten, während die Genauigkeit von 24 Bit auf 8 Bit reduziert wird. Dies bedeutet, dass die Genauigkeit zwischen zwei und drei Dezimalstellen liegt und bfloat16 endliche Werte bis etwa 3,4 × 10 38 darstellen kann .

Beispiele

Diese Beispiele werden in Bit- Darstellung , in hexadezimaler und binärer Form , des Gleitkommawerts angegeben. Dazu gehören das Vorzeichen, der (verzerrte) Exponent und der Signifikand.

3f80 = 0 01111111 0000000 = 1
c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (28 − 1) × 2−7 × 2127 ≈ 3.38953139 × 1038 (max finite positive value in bfloat16 precision)
0080 = 0 00000001 0000000 = 2−126 ≈ 1.175494351 × 10−38 (min normalized positive value in bfloat16 precision and single-precision floating point)

Der maximale positive endliche Wert einer normalen bfloat16-Zahl beträgt 3,38953139 × 10 38 , etwas unter (2 24 – 1) × 2 –23 × 2 127 = 3,402823466 × 10 38 , dem maximalen endlichen positiven Wert, der mit einfacher Genauigkeit darstellbar ist.

Nullen und Unendlichkeiten

0000 = 0 00000000 0000000 = 0
8000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = infinity
ff80 = 1 11111111 0000000 = −infinity

Sonderwerte

4049 = 0 10000000 1001001 = 3.140625 ≈ π ( pi )
3eab = 0 01111101 0101011 = 0.333984375 ≈ 1/3

NaNs

ffc1 = x 11111111 1000001 => qNaN
ff81 = x 11111111 0000001 => sNaN

Siehe auch

Verweise