В вычислительной технике половинная точность (иногда называемая FP16 или float16 ) — это двоичный формат числа с плавающей точкой , который занимает 16 бит (два байта в современных компьютерах) в памяти компьютера . Он предназначен для хранения значений с плавающей точкой в приложениях, где более высокая точность не является существенной, в частности, в обработке изображений и нейронных сетях .
Почти все современные применения следуют стандарту IEEE 754-2008 , где 16-битный формат с основанием 2 называется binary16 , а показатель степени использует 5 бит. Это может выражать значения в диапазоне ±65 504, при этом минимальное значение выше 1 составляет 1 + 1/1024.
В зависимости от компьютера половинная точность может быть на порядок быстрее двойной точности, например, 550 PFLOPS для половинной точности против 37 PFLOPS для двойной точности у одного облачного провайдера. [1]
Форматы с плавающей точкой |
---|
IEEE 754 |
|
Другой |
Альтернативы |
Конусная плавающая точка |
Существовало несколько более ранних 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 интерпретируются особым образом.
Экспонента | Значащая часть = ноль | Значащая часть ≠ ноль | Уравнение |
---|---|---|---|
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 0000000000 | 0000 | 0 | |
0 00000 0000000001 | 0001 | 2 −14 × (0 + 1/1024 ) ≈ 0,000000059604645 | наименьшее положительное субнормальное число |
0 00000 1111111111 | 03ff | 2 −14 × (0 + 1023/1024 ) ≈ 0,000060975552 | наибольшее субнормальное число |
0 00001 0000000000 | 0400 | 2 −14 × (1 + 0/1024 ) ≈ 0,00006103515625 | наименьшее положительное нормальное число |
0 01101 0101010101 | 3555 | 2 −2 × (1 + 341/1024 ) ≈ 0,33325195 | ближайшее значение к 1/3 |
0 01110 1111111111 | 3лучшие друзья | 2 −1 × (1 + 1023/1024 ) ≈ 0,99951172 | наибольшее число меньше единицы |
0 01111 0000000000 | 3c00 | 2 0 × (1 + 0/1024 ) = 1 | один |
0 01111 0000000001 | 3c01 | 2 0 × (1 + 1/1024 ) ≈ 1,00097656 | наименьшее число больше единицы |
0 11110 1111111111 | 7лучшихдрузей | 2 15 × (1 + 1023/1024 ) = 65504 | наибольшее нормальное число |
0 11111 0000000000 | 7c00 | ∞ | бесконечность |
1 00000 0000000000 | 8000 | −0 | |
1 10000 0000000000 | с000 | (−1) 1 × 2 1 × (1 + 0/1024 ) = −2 | |
1 11111 0000000000 | fc00 | −∞ | отрицательная бесконечность |
По умолчанию 1/3 округляет вниз, как для двойной точности , из-за нечетного количества бит в значащей части. Биты за точкой округления — 0101 ... что меньше 1/2 единицы в последнем разряде .
Мин. | Макс | интервал |
---|---|---|
0 | 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 | 1/8 | 2 −14 |
1/8 | 1/4 | 2 −13 |
1/4 | 1/2 | 2 −12 |
1/2 | 1 | 2 −11 |
1 | 2 | 2 −10 |
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 | 1/8 |
256 | 512 | 1/4 |
512 | 1024 | 1/2 |
1024 | 2048 | 1 |
2048 | 4096 | 2 |
4096 | 8192 | 4 |
8192 | 16384 | 8 |
16384 | 32768 | 16 |
32768 | 65520 | 32 |
65520 | ∞ | ∞ |
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 года [update]ни один язык .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 год [update]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]
Поддержка половинной точности в IBM Z является частью функции Neural-network-processing-assist, которую IBM представила с Telum . IBM называет данные с плавающей точкой половинной точности NNP-Data-Type 1 (16 бит).
Недавно Nvidia представила собственную поддержку чисел с плавающей точкой половинной точности (FP16) в своих графических процессорах Pascal. Это было в основном мотивировано возможностью ускорения ресурсоемких и устойчивых к ошибкам приложений в графических процессорах.
This article's use of external links may not follow Wikipedia's policies or guidelines. (July 2017) |