Spec-Zone.ru › GCC 12

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 и который выполняется на FPU x87.

Далее: Десятичная плавающая точка, Предыдущее: Типы с плавающей точкой, Вверх: Расширения языка C [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Half-Precision.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API