如何在g86上为x86_64启用__fp16类型

Non*_*yme 13 c c++ x86 gcc half-precision-float

__fp16浮点数据类型是一个众所周知的扩展上的ARM处理器特别是所使用的C标准.我想在我的x86_64处理器上运行它们的IEEE版本.虽然我知道他们通常没有这个,但我可以用"无符号短"存储(它们具有相同的对齐要求和存储空间)和(硬件)浮点算法来模拟它们.

有没有办法在gcc中请求?

我认为舍入可能稍微"不正确",但这对我来说没问题.

如果这也适用于C++,那将是理想的.

Non*_*yme 6

我没有在 gcc 中找到这样做的方法(从 gcc 8.2.0 开始)。

至于 clang,在 6.0.0 中,以下选项显示了一些成功:

clang -cc1 -fnative-half-type -fallow-half-arguments-and-returns
Run Code Online (Sandbox Code Playgroud)

该选项-fnative-half-type允许使用__fp16类型(而不是将它们提升为浮动)。虽然该选项-fallow-half-arguments-and-returns允许__fp16按值传递,但 API 是非标准的,请注意不要混合不同的编译器。

话虽如此,它不提供使用__fp16类型的数学函数(它会将它们提升为/从floatdouble)。

对于我的用例来说已经足够了。

  • (更新:Sapphire Rapids 对 [AVX-512 FP16](https://en.wikipedia.org/wiki/AVX-512#FP16) 数学指令以及一些早期 CPU 中出现的 BF16 具有完整的标量和 SIMD 支持[Intel芯片上的半精度浮点运算](/sf/ask/3499691611/)) (3认同)
  • 缺少 `__fp16` 数学函数是有充分理由的:x86 对半精度的支持仅限于转换为 `float` ([`vcvtph2ps`](http://felixcloutier.com/x86/VCVTPH2PS.html) 和反向,仅适用于 SIMD 向量,不适用于标量)。因此,它仅用于在加载和存储时以 ALU 转换为代价减少数组的缓存占用空间。即使转换为 `double` 也需要 2 个步骤。您绝对不想在 x86 上的寄存器中传递 `__fp16` 数据,因为每个计算都必须转换为浮点数并返回。 (2认同)