Формат с плавающей запятой половинной точности
В вычислениях , половинная точность (иногда называемая FP16 или float16 ) — это двоичный с плавающей запятой формат компьютерных чисел который занимает 16 бит (два байта в современных компьютерах) в памяти компьютера . Он предназначен для хранения значений с плавающей запятой в приложениях, где не важна более высокая точность, в частности в обработке изображений и нейронных сетях .
Почти все современные варианты использования соответствуют стандарту IEEE 754-2008 , где 16-битный формат по основанию 2 называется бинарным16 , а экспонента использует 5 бит. Это может выражать значения в диапазоне ±65 504, при этом минимальное значение выше 1 составляет 1 + 1/1024.
В зависимости от компьютера половинная точность может быть более чем на порядок быстрее, чем двойная точность, например 550 PFLOPS для половинной точности против 37 PFLOPS для двойной точности у одного облачного провайдера. [1]
с плавающей запятой Форматы |
---|
ИЭЭЭ 754 |
|
Другой |
Альтернативы |
История
[ редактировать ]Существовало несколько более ранних 16-битных форматов с плавающей запятой, в том числе формат Hitachi HD61810 DSP 1982 года (4-битная экспонента и 12-битная мантисса), [2] WIF Томаса Дж. Скотта 1991 года (5 бит экспоненты, 10 бит мантиссы) [3] и процессор 3dfx Voodoo Graphics 1995 года (тот же, что и Hitachi). [4]
ILM искала формат изображения, который мог бы обрабатывать широкий динамический диапазон , но без затрат на жесткий диск и память, связанных с плавающей запятой одинарной или двойной точности. [5] Группа программируемого затенения с аппаратным ускорением под руководством Джона Эйри из SGI (Silicon Graphics) использовала тип данных s10e5 в 1997 году в рамках разработки «бали». Это описано в документе SIGGRAPH 2000. [6] (см. раздел 4.3) и дополнительно описано в патенте США 7518615. [7] Он стал популяризирован благодаря использованию в формате изображений OpenEXR с открытым исходным кодом .
Nvidia и Microsoft определили тип half данных в языке Cg , выпущенном в начале 2002 года, и реализовали его в кристалле в GeForce FX , выпущенном в конце 2002 года. [8] Однако позже Nvidia отказалась от аппаратной поддержки ускоренных 16-битных операций с плавающей запятой, прежде чем она была вновь представлена в мобильном графическом процессоре Tegra X1 в 2015 году.
Расширение F16C в 2012 году позволяет процессорам x86 преобразовывать числа с плавающей запятой половинной точности в числа с плавающей точкой одинарной точности и обратно с помощью машинной инструкции.
Двоичный формат с плавающей запятой IEEE 754 половинной точности:binary16
[ редактировать ]Стандарт IEEE 754 [9] указывает двоичный файл 16 как имеющий следующий формат:
- Знаковый бит : 1 бит
- Ширина экспоненты : 5 бит
- значащего числа Точность : 11 бит (10 хранятся явно)
Формат выложен следующим образом:
Предполагается, что формат имеет неявный ведущий бит со значением 1, если только поле показателя не хранится со всеми нулями. Таким образом, в формате памяти появляются только 10 бит мантиссы , но общая точность составляет 11 бит. На языке IEEE 754 имеется 10 бит мантиссы, но есть 11 бит точности мантиссы (log 10 (2 11 ) ≈ 3,311 десятичных цифр, или 4 цифры ± чуть меньше 5 единиц в последнем месте ).
Экспоненциальное кодирование
[ редактировать ]Двоичная экспонента с плавающей запятой половинной точности кодируется с использованием двоичного представления смещения , при этом нулевое смещение равно 15; также известное как смещение экспоненты в стандарте IEEE 754. [9]
- E min = 00001 2 − 01111 2 = −14
- Е макс = 11110 2 − 01111 2 = 15
- Экспоненциальное смещение = 01111 2 = 15
Таким образом, как определено двоичным представлением смещения, для получения истинного показателя степени необходимо вычесть смещение 15 из сохраненного показателя степени.
Сохраненные показатели степени 00000 2 и 11111 2 интерпретируются особым образом.
Экспонента | Мантисса = ноль | Значение ≠ ноль | Уравнение |
---|---|---|---|
00000 2 | ноль , −0 | субнормальные числа | (−1) знаковый бит × 2 −14 × 0.значимые биты 2 |
00001 2 , ..., 11110 2 | нормализованное значение | (−1) знаковый бит × 2 показатель степени −15 × 1.значимые биты 2 | |
11111 2 | ± infinity | 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 | 3bff | 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 | −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
[ редактировать ]с плавающей запятой Процессоры 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
имеет тип System.Single
или 1.0m
имеет тип System.Decimal
) или ключевое слово для типа. [17] [18] [19]
Swift представил числа с плавающей запятой половинной точности в Swift 5.3 с помощью Float16
тип. [20]
OpenCL также поддерживает числа с плавающей запятой половинной точности с типом данных половинной точности в формате хранения половинной точности IEEE 754-2008. [21]
По состоянию на 2024 год Rust работает над добавлением нового f16
тип для 16-битных чисел с плавающей запятой половинной точности IEEE. [22]
Julia обеспечивает поддержку чисел с плавающей запятой половинной точности с помощью Float16
тип. [23]
Аппаратная поддержка
[ редактировать ]Несколько версий архитектуры ARM поддерживают половинную точность. [24]
Поддержка половинной точности в x86 наборе команд указана в расширении набора команд F16C , впервые представленном в 2009 году AMD и довольно широко принятом процессорами AMD и Intel к 2012 году. Это было дополнительно расширено до AVX-512_FP16 расширения набора команд , реализованного в процессор Intel Sapphire Rapids . [25]
На RISC- V Zfh
и Zfhmin
расширения обеспечивают аппаратную поддержку 16-битных чисел с плавающей запятой половинной точности. Zfhmin
расширение является минимальной альтернативой Zfh
. [26]
В Power ISA VSX и еще не утвержденное расширение SVP64 обеспечивают аппаратную поддержку 16-битных чисел с плавающей запятой половинной точности, начиная с PowerISA v3.1B и более поздних версий. [27] [28]
См. также
[ редактировать ]- Формат чисел с плавающей запятой bfloat16 : альтернативный 16-битный формат с плавающей запятой с 8 битами экспоненты и 7 битами мантиссы.
- Minifloat : небольшие форматы с плавающей запятой.
- IEEE 754 : стандарт IEEE для арифметики с плавающей запятой (IEEE 754).
- ISO/IEC 10967 , Независимая от языка арифметика
- Примитивный тип данных
- Формат изображения RGBE
- Шина управления питанием § Формат чисел с плавающей запятой Linear11
Ссылки
[ редактировать ]- ^ «Об ABCI - О ABCI | ABCI» . abci.ai . Проверено 6 октября 2019 г.
- ^ «Hitachi :: dataBooks :: Руководство пользователя цифрового сигнального процессора HD61810» . Архив.орг . Проверено 14 июля 2017 г.
- ^ Скотт, Томас Дж. (март 1991 г.). «Математика и информатика расходятся по поводу действительных чисел». Материалы двадцать второго технического симпозиума SIGCSE по компьютерному образованию - SIGCSE '91 . Том. 23. С. 130–139. дои : 10.1145/107004.107029 . ISBN 0897913779 . S2CID 16648394 .
- ^ "/home/usr/bk/glide/docs2.3.1/GLIDEPGM.DOC" . Геймерс.орг . Проверено 14 июля 2017 г.
- ^ Jump up to: Перейти обратно: а б «ОпенЭКСР» . OpenEXR. Архивировано из оригинала 8 мая 2013 г. Проверено 14 июля 2017 г.
- ^ Марк С. Пирси; Марк Олано; Джон Эйри; П. Джеффри Ангар. «Интерактивное многопроходное программируемое затенение» (PDF) . People.csail.mit.edu . Проверено 14 июля 2017 г.
- ^ «Патент US7518615 — Система отображения, имеющая растеризацию с плавающей запятой и с плавающей запятой… — Патенты Google» . Google.com . Проверено 14 июля 2017 г.
- ^ "vs_2_sw" . Cg 3.1 Документация по набору инструментов . Нвидиа . Проверено 17 августа 2016 г.
- ^ Jump up to: Перейти обратно: а б Стандарт IEEE для арифметики с плавающей запятой . IEEE STD 754-2019 (пересмотр IEEE 754-2008). Июль 2019. стр. 1–84. дои : 10.1109/ieeestd.2019.8766229 . ISBN 978-1-5044-5924-2 .
- ^ «Поддержка чисел с плавающей запятой половинной точности» . Руководство пользователя компилятора RealView Compilation Tools . 10 декабря 2010 года . Проверено 5 мая 2015 г.
- ^ Гаррард, Эндрю. «10.1. 16-битные числа с плавающей запятой» . Спецификация формата данных Khronos v1.2, ред. 1 . Хронос . Проверено 5 августа 2023 г.
- ^ «KHR_mesh_quantization» . Гитхаб . Группа компаний «Хронос» . Проверено 2 июля 2023 г.
- ^ Хо, Нхут-Мин; Вонг, Венг-Фай (1 сентября 2017 г.). «Использование арифметики половинной точности в графических процессорах Nvidia» (PDF) . Кафедра компьютерных наук Национального университета Сингапура . Проверено 13 июля 2020 г.
Nvidia недавно представила встроенную поддержку плавающей запятой половинной точности (FP16) в своих графических процессорах Pascal. В основном это было мотивировано возможностью ускорения работы ресурсоемких и устойчивых к ошибкам приложений на графических процессорах.
- ^ «Плывет» . ziglan.org . Проверено 7 января 2024 г.
- ^ «Полуструктура (система)» . Learn.microsoft.com . Проверено 1 февраля 2024 г.
- ^ Говиндараджан, Прашант (31 августа 2020 г.). «Представляем полутип!» . .NET-блог . Проверено 1 февраля 2024 г.
- ^ «Числовые типы с плавающей запятой — справочник C#» . Learn.microsoft.com . 29 сентября 2022 г. Проверено 1 февраля 2024 г.
- ^ «Литералы ― Справочник по языку F#» . Learn.microsoft.com . 15 июня 2022 г. Проверено 1 февраля 2024 г.
- ^ «Сводка типов данных — справочник по языку Visual Basic» . Learn.microsoft.com . 15 сентября 2021 г. Проверено 1 февраля 2024 г.
- ^ «swift-evolution/proposals/0277-float16.md в main · apple/swift-evolution» . github.com . Проверено 13 мая 2024 г.
- ^ «расширение cl_khr_fp16» . Реестр.khronos.org . Проверено 31 мая 2024 г.
- ^ Кросс, Трэвис. «Проблема отслеживания для типов с плавающей запятой f16 и f128» . Гитхаб . Проверено 5 июля 2024 г.
- ^ «Целые числа и числа с плавающей запятой · Язык Джулии» . docs.julialang.org . Проверено 11 июля 2024 г.
- ^ «Формат чисел с плавающей запятой половинной точности» . Справочное руководство по компилятору ARM, версия 6.7 . ARM-разработчик . Проверено 13 мая 2022 г.
- ^ Таунер, Дэниел. «Intel® Advanced Vector Extensions 512 — Набор инструкций FP16 для продуктов на базе процессоров Intel® Xeon®» (PDF) . Программы Intel® Builders . Проверено 13 мая 2022 г.
- ^ «Руководство по набору команд RISC-V, том I: ISA уровня пользователя RISC-V» . Пять EmbedDev . Проверено 2 июля 2023 г.
- ^ «OPF_PowerISA_v3.1B.pdf» . Файлы OpenPOWER . Фонд OpenPOWER . Проверено 2 июля 2023 г.
- ^ «ls005.xlen.mdwn» . libre-soc.org Git . Проверено 2 июля 2023 г.
Дальнейшее чтение
[ редактировать ]Внешние ссылки
[ редактировать ]![]() | в этой статье Использование внешних ссылок может не соответствовать политике и рекомендациям Википедии . ( Июль 2017 г. ) |
- Мини-флоаты (в обзоре форматов с плавающей запятой )
- сайт OpenEXR
- Константы половинной точности из D3DX
- OpenGL обработка половинной точности
- Быстрые преобразования Half Float
- Вариант Analog Devices (четырехбитная экспонента)
- Исходный код C для преобразования между двойной, одинарной и половинной точностью IEEE можно найти здесь.
- Исходный код Java для преобразования чисел с плавающей запятой половинной точности
- С плавающей запятой половинной точности для одной из расширенных функций GCC.