В вычислительной технике половинная точность (иногда называемая FP16 или float16 ) — это двоичный формат числа с плавающей точкой , который занимает 16 бит (два байта в современных компьютерах) в памяти компьютера . Он предназначен для хранения значений с плавающей точкой в приложениях, где более высокая точность не является существенной, в частности, в обработке изображений и нейронных сетях .
Почти все современные применения следуют стандарту IEEE 754-2008 , где 16-битный формат с основанием 2 называется binary16 , а показатель степени использует 5 бит. Это может выражать значения в диапазоне ±65 504, при этом минимальное значение выше 1 составляет 1 + 1/1024.
В зависимости от компьютера половинная точность может быть на порядок быстрее двойной точности, например, 550 PFLOPS для половинной точности против 37 PFLOPS для двойной точности у одного облачного провайдера. [1]
Существовало несколько более ранних 16-битных форматов с плавающей точкой, включая формат DSP HD61810 компании Hitachi 1982 года (4-битная экспонента и 12-битная мантисса), [2] WIF Томаса Дж. Скотта 1991 года (5 бит экспоненты, 10 бит мантиссы) [3] и процессор 3dfx Voodoo Graphics 1995 года (такой же, как у Hitachi). [4]
ILM искала формат изображения, который мог бы обрабатывать широкий динамический диапазон , но без затрат на жесткий диск и память одинарной или двойной точности с плавающей точкой. [5] Группа программируемого затенения с аппаратным ускорением под руководством Джона Эйри из SGI (Silicon Graphics) использовала тип данных s10e5 в 1997 году как часть усилий по проектированию «bali». Это описано в статье SIGGRAPH 2000 [6] (см. раздел 4.3) и далее задокументировано в патенте США 7518615. [7] Он был популяризирован благодаря использованию в формате изображения OpenEXR с открытым исходным кодом .
Nvidia и Microsoft определили тип данных half в языке Cg , выпущенном в начале 2002 года, и реализовали его в кристалле GeForce FX , выпущенном в конце 2002 года. [8] Однако аппаратная поддержка ускоренных 16-битных операций с плавающей точкой была позднее прекращена Nvidia, прежде чем была вновь введена в мобильном графическом процессоре Tegra X1 в 2015 году.
Расширение F16C в 2012 году позволяет процессорам x86 преобразовывать числа с плавающей точкой половинной точности в числа с плавающей точкой одинарной точности и обратно с помощью машинной инструкции.
Стандарт IEEE 754 [9] определяет двоичный файл16 как имеющий следующий формат:
Формат выглядит следующим образом:
Предполагается, что формат имеет неявный ведущий бит со значением 1, если только поле экспоненты не хранится со всеми нулями. Таким образом, в формате памяти появляются только 10 бит мантиссы , но общая точность составляет 11 бит. На языке IEEE 754 имеется 10 бит мантиссы, но имеется 11 бит точности мантиссы (log 10 (2 11 ) ≈ 3,311 десятичных цифр или 4 цифры ± немного меньше 5 единиц в последней позиции ).
Двоичная экспонента с плавающей точкой половинной точности кодируется с использованием двоичного представления смещения , при этом нулевое смещение равно 15; также известное как смещение экспоненты в стандарте IEEE 754. [9]
Таким образом, как определено в двоичном представлении смещения, для получения истинной экспоненты необходимо вычесть смещение 15 из сохраненной экспоненты.
Сохраненные показатели 00000 2 и 11111 2 интерпретируются особым образом.
Минимальное строго положительное (субнормальное) значение равно 2 −24 ≈ 5,96 × 10 −8 . Минимальное положительное нормальное значение равно 2 −14 ≈ 6,10 × 10 −5 . Максимальное представимое значение равно (2−2 −10 ) × 2 15 = 65504.
Эти примеры даны в битовом представлении значения с плавающей точкой. Это включает бит знака, (смещенную) экспоненту и мантиссу.
По умолчанию 1/3 округляет вниз, как для двойной точности , из-за нечетного количества бит в значащей части. Биты за точкой округления — 0101 ... что меньше 1/2 единицы в последнем разряде .
65520 и более крупные числа округляются до бесконечности. Это для округления до четного; другие стратегии округления изменят это ограничение.
Процессоры ARM поддерживают (через бит регистра управления с плавающей точкой ) «альтернативный формат половинной точности», который устраняет особый случай для значения показателя степени 31 (11111 2 ). [10] Он почти идентичен формату IEEE, но в нем нет кодировки для бесконечности или NaN; вместо этого показатель степени 31 кодирует нормализованные числа в диапазоне от 65536 до 131008.
Половинная точность используется в нескольких средах компьютерной графики для хранения пикселей, включая MATLAB , OpenEXR , JPEG XR , GIMP , OpenGL , Vulkan , [11] Cg , Direct3D и D3DX . Преимущество перед 8-битными или 16-битными целыми числами заключается в том, что увеличенный динамический диапазон позволяет сохранять больше деталей в светах и тенях изображений и избегать гамма-коррекции. Преимущество перед 32-битной одинарной точностью с плавающей точкой заключается в том, что она требует вдвое меньше памяти и полосы пропускания (за счет точности и диапазона). [5]
Половинная точность может быть полезна для квантования сетки . Данные сетки обычно хранятся с использованием 32-битных чисел одинарной точности с плавающей точкой для вершин, однако в некоторых ситуациях допустимо уменьшить точность до 16-битной половинной точности, что потребует только половины памяти за счет некоторой точности. Квантование сетки также может быть выполнено с 8-битной или 16-битной фиксированной точностью в зависимости от требований. [12]
Аппаратное и программное обеспечение для машинного обучения или нейронных сетей , как правило, использует половинную точность: такие приложения обычно выполняют большой объем вычислений, но не требуют высокого уровня точности. Поскольку оборудование обычно не поддерживает 16-битные числа с плавающей точкой половинной точности, нейронные сети часто используют формат bfloat16 , который представляет собой формат чисел с плавающей точкой одинарной точности, усеченный до 16 бит.
Если оборудование имеет инструкции для вычисления математики с половинной точностью, это часто быстрее, чем одинарная или двойная точность. Если система имеет инструкции SIMD , которые могут обрабатывать несколько чисел с плавающей точкой в одной инструкции, половинная точность может быть в два раза быстрее, работая с вдвое большим количеством чисел одновременно. [13]
Zig обеспечивает поддержку половинной точности с его f16
типом. [14]
.NET 5 представила числа с плавающей точкой половинной точности в System.Half
стандартном библиотечном типе. [15] [16] По состоянию на январь 2024 года [обновлять]ни один язык .NET ( C# , F# , Visual Basic , C++/CLI и C++/CX ) не имеет литералов (например, в C#, 1.0f
has type System.Single
или 1.0m
has type System.Decimal
) или ключевого слова для типа. [17] [18] [19]
Swift представил числа с плавающей точкой половинной точности в Swift 5.3 с типом Float16. [20]
OpenCL также поддерживает числа с плавающей точкой половинной точности с типом данных half в формате хранения половинной точности IEEE 754-2008. [21]
По состоянию на 2024 год [обновлять]Rust работает над добавлением нового f16
типа для 16-битных чисел с плавающей точкой половинной точности IEEE. [22]
Julia обеспечивает поддержку чисел с плавающей точкой половинной точности с этим Float16
типом. [23]
C++ ввел половинную точность с C++23 вместе с std::float16_t
типом. [24] GCC уже реализует ее поддержку. [25]
Несколько версий архитектуры ARM поддерживают половинную точность. [26]
Поддержка половинной точности в наборе инструкций x86 указана в расширении набора инструкций F16C , впервые представленном в 2009 году компанией AMD и довольно широко принятом процессорами AMD и Intel к 2012 году. Это было дополнительно расширено до расширения набора инструкций AVX-512_FP16 , реализованного в процессоре Intel Sapphire Rapids . [27]
На RISC-V расширения Zfh
и обеспечивают аппаратную поддержку 16-битных чисел с плавающей точкой половинной точности. Расширение является минимальной альтернативой . [28 Zfhmin
]Zfhmin
Zfh
В Power ISA VSX и пока не одобренное расширение SVP64 обеспечивают аппаратную поддержку 16-битных чисел с плавающей точкой половинной точности, начиная с PowerISA v3.1B и более поздних версий. [29] [30]
Недавно Nvidia представила собственную поддержку чисел с плавающей точкой половинной точности (FP16) в своих графических процессорах Pascal. Это было в основном мотивировано возможностью ускорения ресурсоемких и устойчивых к ошибкам приложений в графических процессорах.