![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Полезная шпаргалка от Интела: bf16-hardware-numerics-definition-white-paper.pdf
Описывает подробности реализации чисел с плавающей точкой в формате BFloat16, или для краткости BF16.
BF16 отличается от стандартного FP32 (известного в Си как float) несколькими моментами.
Описывает подробности реализации чисел с плавающей точкой в формате BFloat16, или для краткости BF16.
BF16 отличается от стандартного FP32 (известного в Си как float) несколькими моментами.
- Размер мантиссы уменьшен с 23 бит до 7 бит.
- Размер экспоненты остаётся тот же, 8 бит.
- Денормализованное число на входе операции считается нулём.
- Денормализованный результат сбрасывается в ноль.
- Результат округляется до ближайшего чётного.
- Inf и NaN поддерживаются как обычно.
- Никаких исключений или прерываний. В частности, SNaN не вызывает исключения.
no subject
Date: 2022-07-27 22:17 (UTC)см. "-mfpmath=unit", ‘sse’: For the x86-64 compiler, these extensions are enabled by default.
(так что, подозреваю, с самой первой версии компилятора, в которой появилась поддержка целевой архитектуры x86_64).
Если подумать, то это ведь часть ABI. Если, например, функция принимает аргумент типа double, то его надо передавать либо в регистре st(0), либо в регистре XMM0. Соответственно, есть какой-то вариант, принятый для данной целевой архитектуры по умолчанию (для i686 это st(0) а для x86_64 это XMM0), а если пользователь начинает задавать какие-то нестандартные флаги компиляции для данной единицы трансляции, например играться с -mfpmath, то компилятору нужно вставить инструкцию выгрузки аргумента в другой регистр при вызове функции из другого модуля, или по указателю. Во-первых, это лишняя трата времени выполнения. Во-вторых, такие вещи нельзя легко изменить в новой версии компилятора, их закладывают раз и навсегда, как часть ABI, при добавлении в компилятор поддержки новой целевой архитектуры.
no subject
Date: 2022-07-27 22:50 (UTC)