vak: (Default)
[personal profile] vak
Полезная шпаргалка от Интела: bf16-hardware-numerics-definition-white-paper.pdf

Описывает подробности реализации чисел с плавающей точкой в формате BFloat16, или для краткости BF16.

BF16 отличается от стандартного FP32 (известного в Си как float) несколькими моментами.
  • Размер мантиссы уменьшен с 23 бит до 7 бит.
  • Размер экспоненты остаётся тот же, 8 бит.
  • Денормализованное число на входе операции считается нулём.
  • Денормализованный результат сбрасывается в ноль.
  • Результат округляется до ближайшего чётного.
  • Inf и NaN поддерживаются как обычно.
  • Никаких исключений или прерываний. В частности, SNaN не вызывает исключения.

Date: 2022-07-27 10:11 (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Но мы-то знаем, что никто проверять результат не будет.

Date: 2022-07-27 10:55 (UTC)
From: [personal profile] ivanrubilo
Так и SIGFPE небось тоже игнорили и результат получался всё равно NaN.

Date: 2022-07-27 14:02 (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Игнор специально и игнор по дефолту несколько отличается. Но, да. Сейчас ошибки игнорировать будет гораздо быстрее.

Date: 2022-07-27 14:15 (UTC)
waqur: (Default)
From: [personal profile] waqur
Невозбранно гнать лажу можно уже довольно давно: например, в gcc/clang для целевой архитектуры x86_64 по умолчанию активна опция -mfpmath=sse, что отключает использование старых регистров и инструкций FPU, соответствующие аппаратные исключения, SIGFPE, установку errno при FPU-ошибках и прочие доисторические глупости. Ну и попутно обеспечивает long double = double. Довольно много старых аппаратных фич такого рода сейчас не используется, например тот же синус вычисляется всегда на основе табличных данных в libm/libgcc_s, современный компилятор практически невозможно заставить сгенерировать инструкцию FSIN (только через ассемблерную вставку) — т.к. эта инструкция невыгодна ни по скорости, ни по точности. Поэтому её SIMD-варианта не существует.
Edited Date: 2022-07-27 14:17 (UTC)

Date: 2022-07-27 14:17 (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Помнится, рассказывали, что учёные в одном институте обнаружили, что в компиляторе фортрана есть ключик "быстро" и есть ключик "точно". И первый стоит по умолчанию.

Date: 2022-07-27 22:03 (UTC)
euthanasepam: Ла-ла-ла-ла! Ла-ла-ла-ла! (Default)
From: [personal profile] euthanasepam
С какой версии?

Date: 2022-07-27 22:17 (UTC)
waqur: (Default)
From: [personal profile] waqur
Точно не знаю, но это поведение описано в документации: https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
см. "-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, при добавлении в компилятор поддержки новой целевой архитектуры.

Date: 2022-07-27 22:50 (UTC)
euthanasepam: Ла-ла-ла-ла! Ла-ла-ла-ла! (Default)
From: [personal profile] euthanasepam
Похоже, что так. Беглое гугление показывает, что подобные вопросы задавали [и ответы на них давали] ещё начале нулевых, то есть именно по выходу потребительской AMD64.