有关的:https://scicomp.stackexchange.com/questions/35187/is-half- precision-supported-by-modern-architecture https://scicomp.stackexchange.com/questions/35187/is-half-precision-supported-by-modern-architecture- 有一些关于 Cooper Lake 和 Sapphire Rapids 中的 BFloat16 的信息,以及一些非英特尔信息。
蓝宝石急流将拥有 BF16and FP16,与 FP16 使用相同的 IEEE754binary16
格式为F16C转换指令,不是脑浮。和AVX512-FP16 https://en.wikipedia.org/wiki/AVX-512#FP16支持大多数数学运算,与 BF16 不同,BF16 仅具有单精度和点积累加对与单精度之间的转换。
这也适用于 Alder Lake,在禁用 E 核心并在 BIOS 中专门启用 AVX-512 的系统上(显然不是正式支持的 https://www.anandtech.com/show/17047/the-intel-12th-gen-core-i912900k-review-hybrid-performance-brings-hybrid-complexity/2截至目前;只有一些主板供应商有此选项。)
(对于具有 FP16 / BF16 的 Sapphire Rapids / Alder Lake,答案的其余部分未更新。)
借助片上 GPU
Intel芯片上可以进行半精度浮点运算吗?
是的,显然Skylake 及更高版本中的片上 GPU 具有对 FP16 和 FP64 的硬件支持,以及 FP32。有了足够新的驱动程序,您可以通过 OpenCL 使用它。
在早期的芯片上,FP16 与 FP32 的吞吐量大致相同(可能只是几乎免费地即时转换),但是在 SKL / KBL 芯片上,您获得的吞吐量大约是 FP32 的两倍 https://www.sisoftware.co.uk/2017/04/12/intel-graphics-gpgpu-performance/对于 GPGPU 曼德尔布罗特
(请注意该链接中图表的 Mpix/s 轴上的对数刻度)。
FP64 的增益 (double
)在 Skylake iGPU 上的性能也非常出色。
带AVX/AVX-512指令
But 在 IA 内核(Intel 架构)上 否;即使使用 AVX512,除了将它们转换为单精度之外,也没有任何硬件支持。这可以节省内存带宽,并且如果您的代码在内存上遇到瓶颈,肯定可以提高速度。但对于不存在内存瓶颈的代码,它不会提高峰值 FLOPS。
您当然可以实现软件浮点,甚至可以在 SIMD 寄存器中实现,因此从技术上讲,您提出的问题的答案仍然是“是”,但它不会比使用 F16C 更快VCVTPH2PS http://felixcloutier.com/x86/VCVTPH2PS.html / VCVTPS2PH
说明书+包装单vmulps
/ vfmadd132ps
硬件支持。
使用硬件支持的 SIMD 转换float
/ __m256
在 x86 代码中以额外的 ALU 转换工作换取减少的内存带宽和缓存占用空间。但是,如果缓存阻塞(例如,对于经过良好调整的密集矩阵相乘)或非常高的计算强度意味着您没有内存瓶颈,那么只需使用float
并节省 ALU 运算。
即将推出:bfloat16(大脑漂浮) https://en.wikipedia.org/wiki/Bfloat16_floating-point_format和 AVX512 BF16
已经为神经网络用例开发了一种新的 16 位 FP 格式,其指数范围与 IEEE binary32 相同。与 x86 F16C 转换指令使用的 IEEE 二进制 16 相比,它的有效数精度要低得多,但显然神经网络代码更关心大指数范围的动态范围。这使得 bfloat 硬件甚至不必费心支持次法线。
一些即将推出的 Intel x86 CPU 内核将具有支持此格式的硬件。主要用例仍然是专用神经网络加速器(Nervana https://en.wikichip.org/wiki/nervana)和 GPGPU 类型设备,但硬件支持的转换至少非常有用。
https://en.wikichip.org/wiki/brain_floating-point_format https://en.wikichip.org/wiki/brain_floating-point_format有更多详细信息,
特别是库珀湖 https://en.wikichip.org/wiki/intel/microarchitectures/cooper_lakeXeon 和 Core X CPU 预计支持AVX512 BF16.
我还没有看到有人提到 Ice Lake(Sunny Cove microarch)。两种情况都可能发生,我不想猜测。
英特尔® 架构指令集扩展和未来功能编程参考 https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf2019 年 4 月的修订版 -036 添加了有关 BF16 的详细信息,包括其计划用于“未来,库珀湖”。一旦发布,说明文档将移至主第 2 卷 ISA 参考手册(以及 pdf->HTML 抓取内容)https://www.felixcloutier.com/x86/index.html https://www.felixcloutier.com/x86/index.html).
https://github.com/HJLebbink/asm-dude/wiki https://github.com/HJLebbink/asm-dude/wiki有第 2 卷和 future-extensions 手册中的说明,因此您已经可以在那里找到它。
只有3条指令:转换为/从float
,以及 BF16 乘法 + 成对累加为float
。 (点积的第一个水平步骤。)所以 AVX512 BF16does最终为 16 位浮点提供真正的计算,但仅以这种非常有限的形式将结果转换为float
.
他们还忽略 MXCSR,始终使用默认舍入模式和 DAZ/FTZ,并且不设置任何异常标志。
-
VCVTNEPS2BF16 [xxy]mm1{k1}{z}, [xyz]mm2/m512/m32bcst https://github.com/HJLebbink/asm-dude/wiki/VCVTNEPS2BF16
ConVerT(无例外)包装单个 2(至)BF16
__m256bh _mm512_cvtneps_pbh (__m512);
另外两个不支持内存故障抑制(当对内存源操作数使用掩码时)。大概是因为屏蔽是针对每个目标元素的,并且源元素的数量不同。转换toBF16 显然可以抑制内存故障,因为相同的掩码可以应用于 32 位源元素和 16 位目标元素。
-
VCVTNE2PS2BF16 [xyz]mm1{k1}{z}, [xyz]mm2, [xyz]mm3/m512/m32bcst https://github.com/HJLebbink/asm-dude/wiki/VCVTNE2PS2BF16
ConVerT(无例外)Packed Single 2(至)BF16 的 2 个寄存器。
_m512bh _mm512_cvtne2ps_pbh (__m512, __m512);
-
VDPBF16PS [xyz]mm1{k1}{z}, [xyz]mm2, [xyz]mm3/m512/m32bcst https://github.com/HJLebbink/asm-dude/wiki/VDPBF16PS
BF16 对的点积累加成压缩单精度
__m512 _mm512_dpbf16_ps(__m512, __m512bh, __m512bh);
(请注意,即使是未屏蔽的版本也有目标累加器的第三个输入,如 FMA)。
# the key part of the Operation section:
t ← src2.dword[ i ] (or src.dword[0] for a broadcast memory source)
srcdest.fp32[ i ] += make_fp32(src1.bfloat16[2*i+1]) * make_fp32(t.bfloat[1])
srcdest.fp32[ i ] += make_fp32(src1.bfloat16[2*i+0]) * make_fp32(t.bfloat[0])
所以我们还是don't获得原生 16 位 FP 数学,您可以将其用于任意事物,同时将数据保持为 16 位格式,每个向量包含 32 个元素。仅 FMA 进入 32 位累加器。
顺便说一句,还有其他实数格式不基于符号/指数/尾数的固定宽度字段的 IEEE-754 结构。越来越受欢迎的一种是Posit. https://en.wikipedia.org/wiki/Unum_(number_format) https://en.wikipedia.org/wiki/Unum_(number_format), 在自己的游戏中击败浮点:定理算术 http://www.johngustafson.net/pdfs/BeatingFloatingPoint.pdf, and https://posithub.org/about https://posithub.org/about
他们没有将整个有效数编码空间花费在 NaN 上,而是将其用于锥形/渐进溢出,支持更大的范围。 (删除 NaN 可以简化硬件)。 IEEE float仅支持渐进下溢(具有次正规),硬溢出到+-Inf。 (这通常是实际数值模拟中的错误/问题,与 NaN 没有太大区别。)
正编码 https://www.johndcook.com/blog/2018/04/11/anatomy-of-a-posit-number/是一种可变宽度指数,精度更高,接近 1.0。目标是允许在更多情况下使用 32 位或 16 位精度(而不是 64 或 32),同时仍然获得科学计算/HPC 的有用结果,例如气候建模。每个 SIMD 向量的工作量加倍,内存带宽减半。
Posit FPU 硬件已经有一些论文设计,但还处于早期阶段,我认为只有 FPGA 实现真正被构建出来。一些 Intel CPU 将配备板载 FPGA(或者也许这已经是一个事实)。
截至 2019 年中期,我还没有读到任何 Posit 执行单元作为商业 CPU 设计的一部分,谷歌也没有找到任何内容。