1

我打算在我的代码中使用半精度浮点,但我不知道如何声明它们。例如,我想做如下的事情 -

fp16 a_fp16;
bfloat a_bfloat;

但是,编译器似乎不知道这些类型(出于演示目的fp16bfloat它们只是虚拟类型)

我记得读到bfloat支持被添加到 GCC-10 中,但我无法在手册中找到它。我对bfloat浮点数特别感兴趣

其他问题 -

  1. FP16 现在有硬件支持 Intel / AMD 支持吗?我认为自 Ivy Bridge 本身以来就添加了本机硬件支持。(https://scicomp.stackexchange.com/questions/35187/is-half-precision-supported-by-modern-architecture
  2. 我想确认使用 FP16 是否确实会增加 FLOPs。我记得在某处读到,所有算术运算fp16都首先在内部转换为 fp32,并且只会影响缓存占用空间和带宽。
  3. SIMD 对半精度浮点数的内在支持,特别是bfloat(我知道_mm256_mul_ph
  4. 这些类型是否也添加到了英特尔编译器中?

PS - 相关帖子 - Intel 芯片上的半精度浮点运算,但不包括声明半精度浮点数。

TIA

4

1 回答 1

1

C++ 和 C 语言都没有半浮点数的算术类型。

GCC 编译器支持半浮点数作为语言扩展。从文档中引用:

在启用 SSE2 的 x86 目标上,GCC 通过 _Float16 类型支持半精度(16 位)浮点。对于 C++,x86 提供了一个名为 _Float16 的内置类型,它包含与 C 相同的数据格式。

...

在启用 SSE2 且没有 -mavx512fp16 的 x86 目标上,所有操作都将通过软件仿真和浮点指令进行仿真。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 并且在 x87 FPU 上运行的代码很有用。

于 2021-12-22T08:53:07.737 回答