【问题标题】:在 x86 CPU 上使用半精度浮点
【发布时间】:2022-01-23 12:12:11
【问题描述】:

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

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 是否确实会增加 FLOP。我记得在某处读到,fp16 上的所有算术运算都首先在内部转换为 fp32,并且只会影响缓存占用空间和带宽。
  3. SIMD 对半精度浮点数的内在支持,尤其是 bfloat(我知道像 _mm256_mul_ph 这样的内在函数,但不确定如何传递 16 位 FP 数据类型,如果有人能强调这一点,我将不胜感激)
  4. 这些类型是否也添加到英特尔编译器中?

PS - 相关帖子 - Half-precision floating-point arithmetic on Intel chips ,但它不包括声明半精度浮点数。

TIA

【问题讨论】:

    标签: c++ c x86 intrinsics half-precision-float


    【解决方案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 上运行的代码很有用。

    【讨论】:

    • 感谢您的回答。我想英特尔确实支持 bf16 (intel.com/content/dam/develop/external/us/en/documents/…, )
    • @AtharvaDubey 是的。由于命名不同,我弄错了(bf vs bfloat;我猜它们是一样的)
    • @AtharvaDubey:英特尔“支持”半精度存储,但您实际上无法对它们做任何事情(将它们相加,相乘,...)。这种“支持”的唯一好处是将更多的东西打包到内存中(当您实际需要做任何事情时,会增加将它们转换为单精度的费用)。如果您假设从一种浮点格式转换为另一种格式是“浮点运算”;那么您可以通过不断地来回转换来增加 FLOPS,而无需完成任何有用的工作。
    • @Brendan:Cooper Lake 改变了这种情况,它为 BF16 提供了硬件支持。显然,它于 2020 年年中推出,限量发行。 en.wikichip.org/wiki/intel/microarchitectures/cooper_lake。虽然 Ice Lake Xeon 似乎不支持它:anandtech.com/show/15686/… 是从 2019 年开始的,但是像 wikichip 这样的新帖子仍然没有列出它。但它又在 Sapphire Rapids Xeon(但可能不是桤木湖)中再次出现,所以是的,英特尔在玩弄它。
    • 另外Is half precision supported by modern architecture? 有关于蓝宝石急流的链接。是的,正如 Anandtech 的那篇文章所评论的那样,呃碎片化。如果您使用它获得服务器或集群,那很好,但目前还没有迹象表明它会进入主流硬件。回复:有用性:如果您受到内存带宽的限制,这在多核服务器上很重要,它可以提供帮助。它用一些额外的 ALU 工作来换取更高的实际工作计算强度(FLOP / Byte)
    猜你喜欢
    • 2019-11-10
    • 2020-02-03
    • 1970-01-01
    • 2016-08-17
    • 2011-09-03
    • 2011-10-14
    • 2011-11-17
    • 1970-01-01
    • 2013-04-16
    相关资源
    最近更新 更多