Jump to content

Формат с плавающей запятой половинной точности

(Перенаправлено с Float16 )

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

Почти все современные варианты использования соответствуют стандарту IEEE 754-2008 , где 16-битный формат по основанию 2 называется бинарным16 , а экспонента использует 5 бит. Это может выражать значения в диапазоне ±65 504, при этом минимальное значение выше 1 составляет 1 + 1/1024.

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

Существовало несколько более ранних 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, если только поле экспоненты не хранится со всеми нулями. Таким образом, в формате памяти появляются только 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 ± 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]

См. также

[ редактировать ]
  1. ^ «Об ABCI - О ABCI | ABCI» . abci.ai . Проверено 6 октября 2019 г.
  2. ^ «Hitachi :: dataBooks :: Руководство пользователя цифрового сигнального процессора HD61810» . Архив.орг . Проверено 14 июля 2017 г.
  3. ^ Скотт, Томас Дж. (март 1991 г.). «Математика и информатика расходятся по поводу действительных чисел». Материалы двадцать второго технического симпозиума SIGCSE по компьютерному образованию - SIGCSE '91 . Том. 23. С. 130–139. дои : 10.1145/107004.107029 . ISBN  0897913779 . S2CID   16648394 .
  4. ^ "/home/usr/bk/glide/docs2.3.1/GLIDEPGM.DOC" . Геймерс.орг . Проверено 14 июля 2017 г.
  5. ^ Перейти обратно: а б «ОпенЭКСР» . OpenEXR. Архивировано из оригинала 8 мая 2013 г. Проверено 14 июля 2017 г.
  6. ^ Марк С. Пирси; Марк Олано; Джон Эйри; П. Джеффри Ангар. «Интерактивное многопроходное программируемое затенение» (PDF) . People.csail.mit.edu . Проверено 14 июля 2017 г.
  7. ^ «Патент US7518615 — Система отображения, имеющая растеризацию с плавающей запятой и с плавающей запятой… — Патенты Google» . Google.com . Проверено 14 июля 2017 г.
  8. ^ "vs_2_sw" . Cg 3.1 Документация по набору инструментов . Нвидия . Проверено 17 августа 2016 г.
  9. ^ Перейти обратно: а б Стандарт IEEE для арифметики с плавающей запятой . IEEE STD 754-2019 (пересмотр IEEE 754-2008). Июль 2019. стр. 1–84. дои : 10.1109/ieeestd.2019.8766229 . ISBN  978-1-5044-5924-2 .
  10. ^ «Поддержка чисел с плавающей запятой половинной точности» . Руководство пользователя компилятора RealView Compilation Tools . 10 декабря 2010 года . Проверено 5 мая 2015 г.
  11. ^ Гаррард, Эндрю. «10.1. 16-битные числа с плавающей запятой» . Спецификация формата данных Khronos v1.2, ред. 1 . Хронос . Проверено 5 августа 2023 г.
  12. ^ «KHR_mesh_quantization» . Гитхаб . Группа компаний «Хронос» . Проверено 2 июля 2023 г.
  13. ^ Хо, Нхут-Мин; Вонг, Венг-Фай (1 сентября 2017 г.). «Использование арифметики половинной точности в графических процессорах Nvidia» (PDF) . Кафедра компьютерных наук Национального университета Сингапура . Проверено 13 июля 2020 г. Nvidia недавно представила встроенную поддержку плавающей запятой половинной точности (FP16) в своих графических процессорах Pascal. В основном это было мотивировано возможностью того, что это ускорит работу ресурсоемких и устойчивых к ошибкам приложений на графических процессорах.
  14. ^ «Плывет» . ziglan.org . Проверено 7 января 2024 г.
  15. ^ «Полуструктура (система)» . Learn.microsoft.com . Проверено 1 февраля 2024 г.
  16. ^ Говиндараджан, Прашант (31 августа 2020 г.). «Представляем полутип!» . .NET-блог . Проверено 1 февраля 2024 г.
  17. ^ «Числовые типы с плавающей запятой — справочник C#» . Learn.microsoft.com . 29 сентября 2022 г. Проверено 1 февраля 2024 г.
  18. ^ «Литералы ― Справочник по языку F#» . Learn.microsoft.com . 15 июня 2022 г. Проверено 1 февраля 2024 г.
  19. ^ «Сводка типов данных — справочник по языку Visual Basic» . Learn.microsoft.com . 15 сентября 2021 г. Проверено 1 февраля 2024 г.
  20. ^ «swift-evolution/proposals/0277-float16.md в main · apple/swift-evolution» . github.com . Проверено 13 мая 2024 г.
  21. ^ «расширение cl_khr_fp16» . Реестр.khronos.org . Проверено 31 мая 2024 г.
  22. ^ Кросс, Трэвис. «Проблема отслеживания для типов с плавающей запятой f16 и f128» . Гитхаб . Проверено 5 июля 2024 г.
  23. ^ «Целые числа и числа с плавающей запятой · Язык Джулии» . docs.julialang.org . Проверено 11 июля 2024 г.
  24. ^ «Формат чисел с плавающей запятой половинной точности» . Справочное руководство по компилятору ARM, версия 6.7 . ARM-разработчик . Проверено 13 мая 2022 г.
  25. ^ Таунер, Дэниел. «Intel® Advanced Vector Extensions 512 — Набор инструкций FP16 для продуктов на базе процессоров Intel® Xeon®» (PDF) . Программы Intel® Builders . Проверено 13 мая 2022 г.
  26. ^ «Руководство по набору команд RISC-V, том I: ISA уровня пользователя RISC-V» . Пять EmbedDev . Проверено 2 июля 2023 г.
  27. ^ «OPF_PowerISA_v3.1B.pdf» . Файлы OpenPOWER . Фонд OpenPOWER . Проверено 2 июля 2023 г.
  28. ^ «ls005.xlen.mdwn» . libre-soc.org Git . Проверено 2 июля 2023 г.

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

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 5b318f30a86c561bde19100af394d2e1__1721332680
URL1:https://arc.ask3.ru/arc/aa/5b/e1/5b318f30a86c561bde19100af394d2e1.html
Заголовок, (Title) документа по адресу, URL1:
Half-precision floating-point format - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)