bfloat16 Gleitkommaformat - bfloat16 floating-point format
Floating-Point - Formate |
---|
IEEE 754 |
Sonstiges |
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:
- Vorzeichenbit : 1 Bit
- Exponentenbreite : 8 Bit
- Signifikante Genauigkeit : 8 Bit (7 explizit gespeichert), im Gegensatz zu 24 Bit in einem klassischen Gleitkommaformat mit einfacher Genauigkeit
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:
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 |
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 |
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 |
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 |
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 |
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
- Gleitkommaformat mit halber Genauigkeit : 16-Bit-Float mit 1-Bit-Vorzeichen, 5-Bit-Exponent und 11-Bit-Signifikand, wie von IEEE 754 definiert
- ISO/IEC 10967 , sprachunabhängige Arithmetik
- Primitiver Datentyp
- Minischwimmer
- Google Gehirn