Spec-Zone.ru › GCC 15

6.1.5 Половинная точность с плавающей точкой

На целевых платформах 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.

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

Spec-Zone.ru

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