Формат с плавающей запятой половинной точности - Half-precision floating-point format

В вычислении , половина точность (иногда называемый FP16 ) представляет собой двоичный с плавающей точкой компьютера номер формат , который занимает 16 бит (два байта в современных компьютерах) в памяти компьютера .

Они могут выражать значения в диапазоне ± 65 504, при этом минимальное значение выше 1 составляет 1 + 1/1024.

В стандарте IEEE 754-2008 16-битный формат base-2 называется двоичным16 . Он предназначен для хранения значений с плавающей запятой в приложениях, где высокая точность не важна для выполнения арифметических вычислений.

Хотя реализации IEEE с плавающей запятой половинной точности являются относительно новыми, существовало несколько более ранних 16-битных форматов с плавающей запятой, в том числе Hitachi HD61810 DSP 1982 года, WIF Скотта и графический процессор 3dfx Voodoo Graphics .

Nvidia и Microsoft определили половинный тип данных в языке Cg , выпущенном в начале 2002 года, и реализовали его на кристалле в GeForce FX , выпущенном в конце 2002 года. ILM искал формат изображения, который мог бы обрабатывать широкий динамический диапазон , но без стоимость жесткого диска и памяти для представлений с плавающей запятой, которые обычно используются для вычислений с плавающей запятой (одинарной и двойной точности). Группа программируемого затенения с аппаратным ускорением во главе с Джоном Эйри из SGI (Silicon Graphics) изобрела тип данных s10e5 в 1997 году в рамках проекта «bali». Это описано в статье SIGGRAPH 2000 (см. Раздел 4.3) и дополнительно задокументировано в патенте США 7518615.

Этот формат используется в нескольких средах компьютерной графики, включая MATLAB , OpenEXR , JPEG XR , GIMP , OpenGL , Cg , Direct3D и D3DX . Преимущество перед 8-битными или 16-битными двоичными целыми числами заключается в том, что увеличенный динамический диапазон позволяет сохранять больше деталей в светлых и темных участках изображений. Преимущество перед 32-битными двоичными форматами с одинарной точностью состоит в том, что они требуют вдвое меньше памяти и полосы пропускания (за счет точности и диапазона).

F16C расширение позволяет x86 процессоров преобразовать половинную точность поплавки и с одинарной точностью поплавков .

В зависимости от компьютера, половинная точность может быть более чем на порядок быстрее, чем двойная точность, например, 550 PFLOPS для половинной точности против 37 PFLOPS для двойной точности на одном облачном провайдере.

IEEE 754 двоичный формат с плавающей запятой половинной точности: binary16

Стандарт IEEE 754 определяет двоичный файл16 как имеющий следующий формат:

Формат выложен следующим образом:

IEEE 754r Half Floating Point Format.svg

Предполагается, что формат имеет неявный ведущий бит со значением 1, если только поле экспоненты не хранится со всеми нулями. Таким образом , только 10 бит мантиссы появляются в формате памяти , но общая точность 11 бит. В языке IEEE 754 имеется 10 значащих битов, но есть 11 битов значимой точности (log 10 (2 11 ) ≈ 3,311 десятичных цифр, или 4 цифры ± чуть меньше 5 единиц на последнем месте ).

Экспонентное кодирование

Двоичная экспонента с плавающей запятой половинной точности кодируется с использованием двоичного представления смещения с нулевым смещением, равным 15; также известный как смещение экспоненты в стандарте IEEE 754.

Таким образом, как определено двоичным представлением смещения, чтобы получить истинную экспоненту, смещение 15 должно быть вычтено из сохраненной экспоненты.

Сохраненные экспоненты 00000 2 и 11111 2 интерпретируются особым образом.

Экспонента Significand = ноль Значение ≠ ноль Уравнение
00000 2 ноль , −0 субнормальные числа (−1) знаковый бит × 2 −14 × 0 значащих битов 2
00001 2 , ..., 11110 2 нормализованное значение (−1) знаковый бит × 2 показатель степени − 15 × 1. значащие биты 2
11111 2 ± бесконечность NaN (тихо, сигнализирует)

Минимальное строго положительное (субнормальное) значение составляет 2 −24 ≈ 5,96 × 10 −8 . Минимальное положительное нормальное значение составляет 2 −14 ≈ 6,10 × 10 −5 . Максимальное представимое значение: (2−2 −10 ) × 2 15 = 65504.

Примеры половинной точности

Эти примеры даны в битовом представлении значения с плавающей запятой. Это включает знаковый бит, (смещенную) экспоненту и мантиссу.

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

По умолчанию 1/3 округляется в меньшую сторону, как для двойной точности , из-за нечетного количества бит в мантиссе. Биты за точкой округления 0101...меньше 1/2 единицы в последнем месте .

Ограничения точности десятичных значений в [0, 1]

  • Десятичные числа от 2 до 24 (минимальное положительное субнормальное) и 2-14 (максимальное субнормальное): фиксированный интервал 2-24.
  • Десятичные числа от 2 -14 (минимальная положительная норма) до 2-13 : фиксированный интервал 2 -24.
  • Десятичные числа от 2 −13 до 2 −12 : фиксированный интервал 2 −23
  • Десятичные числа от 2 −12 до 2 −11 : фиксированный интервал 2 −22
  • Десятичные числа от 2 −11 до 2 −10 : фиксированный интервал 2 −21
  • Десятичные числа от 2 −10 до 2 −9 : фиксированный интервал 2 −20
  • Десятичные числа от 2 −9 до 2 −8 : фиксированный интервал 2 −19
  • Десятичные числа от 2-8 до 2-7 : фиксированный интервал 2-18
  • Десятичные числа от 2 −7 до 2 −6 : фиксированный интервал 2 −17
  • Десятичные числа от 2 −6 до 2 −5 : фиксированный интервал 2 −16
  • Десятичные числа от 2 −5 до 2 −4 : фиксированный интервал 2 −15
  • Десятичные числа от 2 −4 до 2 −3 : фиксированный интервал 2 −14
  • Десятичные числа от 2 −3 до 2 −2 : фиксированный интервал 2 −13
  • Десятичные числа от 2 −2 до 2 −1 : фиксированный интервал 2 −12
  • Десятичные числа от 2 −1 до 2 −0 : фиксированный интервал 2 −11

Ограничения точности десятичных значений в [1, 2048]

  • Десятичные числа от 1 до 2: фиксированный интервал 2 −10 (1 + 2 −10 - следующее по величине число с плавающей запятой после 1)
  • Десятичные числа от 2 до 4: фиксированный интервал от 2 до 9.
  • Десятичные между 4 и 8: фиксированный интервал 2 -8
  • Десятичные числа от 8 до 16: фиксированный интервал 2-7.
  • Десятичные числа от 16 до 32: фиксированный интервал 2 −6
  • Десятичные числа от 32 до 64: фиксированный интервал 2 −5
  • Десятичные числа от 64 до 128: фиксированный интервал 2 −4
  • Десятичные числа от 128 до 256: фиксированный интервал 2-3
  • Десятичные числа от 256 до 512: фиксированный интервал 2 −2
  • Десятичные числа от 512 до 1024: фиксированный интервал 2 −1
  • Десятичные числа от 1024 до 2048: фиксированный интервал 2 0

Ограничения точности для целочисленных значений

  • Можно точно представить целые числа от 0 до 2048 (а также от -2048 до 0)
  • Целые числа от 2048 до 4096 округляются до кратного 2 (четного числа)
  • Целые числа от 4096 до 8192 округляются до кратного 4
  • Целые числа от 8192 до 16384 округляются до кратного 8
  • Целые числа от 16384 до 32768 округляются до кратного 16
  • Целые числа от 32768 до 65519 округляются до кратного 32
  • Целые числа выше 65519 округляются до «бесконечности» при использовании округления до четности, выше 65535 при использовании округления до нуля или выше 65504 (наибольшее представимое конечное значение) при использовании округления до бесконечности.

Альтернативный вариант ARM с половинной точностью

Процессоры ARM поддерживают (через бит регистра управления с плавающей запятой ) «альтернативный формат половинной точности», который устраняет особый случай для значения экспоненты 31 (11111 2 ). Он почти идентичен формату IEEE, но в нем нет кодирования для бесконечности или NaN; вместо этого показатель степени 31 кодирует нормализованные числа в диапазоне от 65536 до 131008.

Использует

Аппаратное и программное обеспечение для машинного обучения или нейронных сетей, как правило, использует половинную точность: такие приложения обычно выполняют большой объем вычислений, но не требуют высокого уровня точности.

На старых компьютерах, которые обращаются к 8 или 16 битам за раз (большинство современных компьютеров обращаются к 32 или 64 битам за раз), арифметика половинной точности выполняется быстрее, чем одинарная точность, и значительно быстрее, чем двойная точность. В системах с инструкциями, которые могут обрабатывать несколько чисел с плавающей запятой в одной инструкции, половинная точность часто обеспечивает более высокую среднюю пропускную способность.

Смотрите также

использованная литература

дальнейшее чтение

внешние ссылки