[PATCH 0/2] Initial support for AVX512FP16
Joseph Myers
joseph@codesourcery.com
Tue Jul 6 18:11:52 GMT 2021
On Tue, 6 Jul 2021, Hongtao Liu via Gcc-patches wrote:
> There may be inconsistent behavior between soft-fp and avx512fp16
> instructions if we emulate _Float16 w/ float .
> i.e
> 1) for a + b - c where b and c are variables with the same big value
> and a + b is NAN at _Float16 and real value at float, avx512fp16
> instruction will raise an exception but soft-fp won't(unless it's
> rounded after every operation.)
There are at least two variants of emulation using float:
(a) Using the excess precision support, as on AArch64, which means the C
front end converts the _Float16 operations to float ones, with explicit
narrowing on assignment (and conversion as if by assignment - argument
passing and return, casts, etc.). Excess precision indeed involves
different semantics compared to doing each operation directly in the range
and precision of _Float16.
(b) Letting the expand/optabs code generate operations in a wider mode.
My understanding is that the result should get converted back to the
narrower mode after each operation (by the expand/optabs code /
convert_move called by it generating such a conversion), meaning (for
basic arithmetic operations) that the semantics end up the same as if the
operation had been done directly on _Float16 (but with more truncation
operations occurring than would be the case with excess precision support
used).
> 2) a / b where b is denormal value and AVX512FP16 won't flush it to
> zero even w/ -Ofast, but when it's extended to float and using divss,
> it will be flushed to zero and raise an exception when compiling w/
> Ofast
I don't think that's a concern, flush to zero is well outside the scope of
standards defining _Float16 semantics.
> So the key point is that the soft-fp and avx512fp16 instructions may
> do not behave the same on the exception, is this acceptable?
As far as I understand it, all cases within the standards will behave as
expected for exceptions, whether pure software floating-point is used,
pure hardware _Float16 arithmetic or one of the forms of emulation listed
above. (Where "as expected" itself depends on the value of
FLT_EVAL_METHOD, i.e. whether excess precision is used for _Float16.)
Flush to zero and trapping exceptions are outside the scope of the
standards. Since trapping exceptions is outside the scope of the
standards, so is anything that distinguishes whether an arithmetic
operation raises the same exception more than once or the order in which
it raises different exceptions (e.g. the possibility of "inexact" being
raised more than once, both by arithmetic on float and by narrowing from
float to _Float16).
--
Joseph S. Myers
joseph@codesourcery.com
More information about the Gcc-patches
mailing list