bfloat16 (Brain Floating Point) формат с плавающей запятой - это формат компьютерных чисел, занимающий 16 бит в памяти компьютера ; он представляет широкий динамический диапазон числовых значений с помощью точки с плавающей точкой. Этот формат представляет собой усеченную (16-битную) версию 32-битного IEEE 754 формата с плавающей запятой одинарной точности (binary32) с целью ускорения машинного обучения и ближний датчик. Он сохраняет приблизительный динамический диапазон 32-битных чисел с плавающей запятой, сохраняя 8 битов экспоненты, но поддерживает только 8-битную точность, а не 24-битное значение двоичного32 формат. В большей степени, чем 32-битные числа с плавающей запятой одинарной точности, числа bfloat16 не подходят для целочисленных вычислений, но это не их предполагаемое использование. Bfloat16 используется для уменьшения требований к памяти и увеличения скорости вычислений алгоритмов машинного обучения.
Формат bfloat16 используется в процессорах Intel AI, таких как Nervana NNP -L1000, процессоры Xeon (AVX-512 расширения BF16) и Intel FPGA, Google Cloud TPU и TensorFlow. ARMv8.6-A также поддерживает формат bfloat16. По состоянию на октябрь 2019 года AMD добавила поддержку этого формата в свои библиотеки ROCm.
bfloat16 имеет следующий формат:
Формат bfloat16, представляющий собой усеченный IEEE 754 одинарной точности 32-битное число с плавающей запятой, обеспечивает быстрое преобразование в и из IEEE 754 32-битных числа с плавающей запятой одинарной точности; при преобразовании в формат bfloat16 биты экспоненты сохраняются, в то время как поле значимости может быть уменьшено путем усечения (что соответствует округлению до 0 ), игнорируя особый случай NaN. Сохранение битов экспоненты поддерживает диапазон 32-битных чисел с плавающей запятой от ≈ 10 до ≈ 3 × 10.
Биты располагаются следующим образом:
знак | показатель степени (5 бит) | дробь (10 бит) | ||||||||||||||
┃ | ┌─────────────┐ | ┌── ───────────────────────┐ | ||||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
15 | 14 | 10 | 9 | 0 |
знак | экспонента (8 бит) | дробь (23 бит) | ||||||||||||||||||||||||||||||
┃ | ┌─────────────────────┐ | ┌─── ──────────────────────────────────────────────────── ────────────┐ | ||||||||||||||||||||||||||||||
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 |
знак | показатель степени (8 бит) | дробь (7 бит) | ||||||||||||||
┃ | ┌─── ──────────────────┐ | ┌─────────────────┐ | ||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
15 | 14 | 7 | 6 | 0 |
знак | показатель степени (8 бит) | дробь (10 бит) | |||||||||||||||||
┃ | ┌───────────────────── | ┌──────────────────────── | |||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
18 | 17 | 10 | 9 | 0 |
знак | экспонента (7 бит) | дробь (16 бит) | ||||||||||||||||||||||
┃ | ┌──────────────────── | ┌────── ──────────────────────────────── | ||||||||||||||||||||||
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 | 15 | 0 |
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 |
Двоичная экспонента с плавающей запятой bfloat16 кодируется с использованием представления смещение-двоичное с нулевым смещением 127; также известный как смещение экспоненты в стандарте IEEE 754.
Таким образом, чтобы получить истинный показатель степени, определенный двоичным представлением смещения, смещение 127 имеет вычитается из значения поля экспоненты.
Минимальные и максимальные значения поля экспоненты (00 H и FF H) интерпретируются особым образом, как в стандартных форматах IEEE 754.
Показатель | Знаки и ноль | Значимые и ненулевые | Уравнение |
---|---|---|---|
00H | ноль, −0 | субнормальные числа | (-1) × 2 × 0. значащие биты |
01H,..., FE H | нормализованное значение | (-1) × 2 × 1. значащие биты | |
FFH | ±бесконечность | NaN (тихий, сигнальный) |
Минимальное положительное нормальное значение - 2 ≈ 1,18 × 10, а минимальное положительное (субнормальное) значение - 2 = 2 ≈ 9,2 × 10.
Так же, как в IEEE 754, положительная и отрицательная бесконечность представлены соответствующими знаковыми битами , установлены все 8 битов экспоненты (FF шестнадцатеричный) и все значащие биты нулевые. Явно
val s_exponent_signcnd + inf = 0_11111111_0000000 -inf = 1_11111111_0000000
Так же, как в IEEE 754, NaN значения представлены с любой знаковый бит, все 8 битов экспоненты установлены (FF шестнадцатеричный), а не все значащие биты равны нулю. Явно
val s_exponent_signcnd + NaN = 0_11111111_klmnopq -NaN = 1_11111111_klmonpq
, где хотя бы одно из k, l, m, n, o, p или q равно 1. Как и в случае с IEEE 754, значения NaN могут быть тихими. или сигнализация, хотя на сентябрь 2018 года не было известных применений сигнализации bfloat16 NaN.
Bfloat16 предназначен для поддержания диапазона чисел из 32-битного IEEE 754 одинарной точности в формате с плавающей запятой (binary32), снижая точность с 24 до 8 бит. Это означает, что точность составляет от двух до трех десятичных цифр, а bfloat16 может представлять конечные значения примерно до 3,4 × 10.
Эти примеры даны в битовом представлении в шестнадцатеричный и двоичный значения с плавающей запятой. Это включает знак, (смещенную) экспоненту и значащую.
3f80 = 0 01111111 0000000 = 1 c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (2 - 1) × 2 × 2 ≈ 3,38953139 × 10 (макс. значение с точностью до bfloat16) 0080 = 0 00000001 0000000 = 2 ≈ 1,175494351 × 10 (минимальное нормализованное положительное значение с точностью до bfloat16 и с плавающей запятой с одинарной точностью)
Максимальное положительное конечное значение нормального числа bfloat16 составляет 3,38953139 × 10, немного ниже (2 - 1) × 2 × 2 = 3,402823466 × 10, максимальное конечное положительное значение, представляемое с одинарной точностью.
0000 = 0 00000000 0000000 = 0 8000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = бесконечность ff80 = 1 11111111 0000000 = - бесконечность
4049 = 0 10000000 1001001 = 3,140625 ≈ π (pi) 3eab = 0 01111101 0101011 = 0,333984375 ≈ 1/3
ffc1 = x 11111111 1000001 =>qNaN ff81 = x 11111111 0000001 =>sNaN