6.13 Полуточная плавающая точка
На целевых платформах ARM и AArch64 GCC поддерживает полуточную (16-битовую) плавающую точку через тип __fp16, определённый в расширениях языка C для ARM. На системах ARM, для её использования, необходимо явно включить этот тип с помощью командной строки -mfp16-format. На целевых платформах x86 с включенным SSE2 GCC поддерживает полуточную (16-битовую) плавающую точку через тип _Float16. Для C++, x86 предоставляет встроенный тип, названный _Float16, который содержит тот же формат данных, что и C.
Целевые платформы ARM поддерживают две несовместимые интерпретации для значений полуточной плавающей точки. Вам необходимо выбрать одну из интерпретаций и использовать её последовательно в вашей программе.
Указание -mfp16-format=ieee выбирает формат IEEE 754-2008. Этот формат может представлять нормализованные значения в диапазоне от 2^{-14} до 65504. Есть 11 бит точности мантиссы, приблизительно 3 десятичных знака.
Указание -mfp16-format=alternative выбирает альтернативный формат ARM. Эта интерпретация похожа на формат IEEE, но не поддерживает бесконечности или NaN. Вместо этого диапазон экспоненты расширен, так что этот формат может представлять нормализованные значения в диапазоне от 2^{-14} до 131008.
Порт GCC для AArch64 поддерживает только формат IEEE 754-2008 и не требует использования командной строки -mfp16-format.
Тип __fp16 может быть использован только в качестве аргумента для встроенных функций, определённых в <arm_fp16.h>, или в качестве формата хранения. Для целей арифметических и других операций, значения __fp16 в выражениях C или C++ автоматически повышаются до float.
Целевые платформы ARM предоставляют аппаратную поддержку преобразований между __fp16 и float значениями как расширение для VFP и NEON (Advanced SIMD), а ARMv8-A предоставляет аппаратную поддержку преобразований между __fp16 и double значениями. GCC генерирует код, использующий эти аппаратные инструкции, если вы компилируете с опциями для выбора FPU, которые их предоставляют; например, -mfpu=neon-fp16 -mfloat-abi=softfp, в дополнение к опции -mfp16-format для выбора формата полуточной точности.
Поддержка типа данных __fp16 на уровне языка независима от того, генерирует ли GCC код, использующий аппаратные инструкции с плавающей точкой. В тех случаях, когда аппаратная поддержка не указана, GCC реализует преобразования между __fp16 и другими типами как вызовы библиотек.
Рекомендуется, чтобы переносимый код использовал тип _Float16, определённый стандартом ISO/IEC TS 18661-3:2015. См. Дополнительные типы чисел с плавающей точкой.
На целевых платформах x86 с включенным SSE2, без -mavx512fp16, все операции будут эмулироваться программной эмуляцией и инструкциями float. По умолчанию для FLT_EVAL_METHOD поведение заключается в сохранении промежуточного результата операции в 32-битной точности. Это может привести к несоответствующему поведению между программной эмуляцией и инструкциями AVX512-FP16. Использование -fexcess-precision=16 заставит выполнить округление назад после каждой операции.
Использование -mavx512fp16 сгенерирует инструкции AVX512-FP16 вместо программной эмуляции. По умолчанию для FLT_EVAL_METHOD поведение заключается в округления после каждой операции. То же самое верно для -fexcess-precision=standard и -mfpmath=sse. Если нет -mfpmath=sse, то -fexcess-precision=standard делает то же самое, что и раньше. Это полезно для кода, у которого нет _Float16 и который работает на x87 FPU.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Half_002dPrecision.html