Intel芯片上的半精度浮点运算

2024-01-11

Intel芯片上可以进行半精度浮点运算吗?

我知道如何加载/存储/转换半精度浮点数 [1],但我不知道如何在不转换为单精度浮点数的情况下对它们进行加/乘。

[1] https://software.intel.com/en-us/articles/performance-benefits-of-half- precision-floats https://software.intel.com/en-us/articles/performance-benefits-of-half-precision-floats


有关的: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 设计的一部分,谷歌也没有找到任何内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Intel芯片上的半精度浮点运算 的相关文章

随机推荐

  • .Net UpdatePanel 和 javascript 已禁用

    这可能听起来 或者实际上是 一个愚蠢的问题 但我需要找到最好的方法来继续我正在进行的项目 我有一个多页网络表单 使用多视图控件 该多视图位于更新面板控件中 到目前为止一切都运行良好 我的问题是关于禁用 JavaScript 的用户 我注意到
  • Datagrid 中不同组合框的不同值

    请耐心等待 因为我是 WPF 的新手 我有一个包含组合框的数据网格
  • Pandas groupby 和聚合输出应包括所有原始列(包括未聚合的列)

    我有以下数据框并想要 记录分组依据month Sum QTY SOLDand NET AMT每个独特的UPC ID 每月 将其余列也包含在结果数据框中 我认为我可以做到这一点的方法是创建一个month列来聚合D DATES 然后求和QTY
  • 在 C# 字符串中转义双引号

    我试图逃避 and 在我的字符串中是这样的 text Replace Replace 但结果为text arash moeen 结果是 arash moeen 我怎样才能解决这个问题 只需使用 对于逐字字符串 text Replace th
  • 修补 nant 0.91 以使用 mono 4.0

    The Nant http nant sourceforge net 不支持单声道4 但幸运的是有 我下载了补丁 我也下载了source http nant sourceforge net nightly latest 我解压源代码并将补丁
  • 加载 FXML 时将参数传递给控制器​​[重复]

    这个问题在这里已经有答案了 我有一个登录屏幕 我想将登录 ID 从 LoginController 传递到 MainController 这样我就可以访问一些功能来更改密码等 我像这样加载控制器 FXMLLoader fxmlLoader
  • ValueError:不支持的格式字符'

    我从这里得到了以下大部分代码 使用python脚本生成pdf latex https stackoverflow com questions 8085520 generating pdf latex with python script u
  • 基于 Git 的内容管理? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Ruby CMS 或插件 可以提供和编辑位于 Git 存储库中的内容 我厌倦了将我的内容放在数据库中 用户 设置 评论 都
  • 致命错误:找不到类“PHPExcel_Shared_String”

    我已将 PHPExcel 用于我的 codeigniter 应用程序 它在本地主机中运行良好 但是当我将其托管到服务器时 出现以下错误 致命错误 在 xx xx xx 中找不到类 PHPExcel Shared String Third p
  • 为什么我的规则不能用简单的代数方程求解 X?

    我是 Prolog 新手 所以请保持温柔 这是我的规则 solve X A B A is 7 X 2 B is 3 X 4 显然 这里的正确答案是6 5 如果我把它交给 Prolog 它会证实 solve 6 5 yes 然而 如果我要求
  • Python解析日期字符串为date

    我正在尝试在 Python 中解析日期时间字符串 输入值的形式为 February 19 1989 到目前为止我一直在努力 datetime datetime strptime February 19 1989 B d y 但我总是出错 解
  • 可以在不损失重要性的情况下转换为二进制并返回十进制的最高有效十进制数字精度是 6 还是 7.225?

    我遇到过两种不同的浮点数精度公式 N 1 log10 2 6 decimal digits Single precision and N log10 2 7 225 decimal digits Single precision Where
  • Netbeans:编译时将文本文件移动到 dist 文件夹中

    我有一个文本文件 假设textfile txt 存储在项目文件夹中网豆 7 3 e g project folder textfile txt src package package subpackage MyClass java 当我编译
  • 在构造函数中初始化静态最终字段

    public class A private static final int x public A x 5 final意味着变量只能分配一次 在构造函数中 static意味着它是一个类实例 我不明白为什么这会被禁止 这些关键词在哪里互相干
  • 用笑话模拟第 3 方库构造函数

    我正在用玩笑编写单元测试 并且必须测试一个从第三方库调用构造函数的函数 测试的目标是检查调用是否使用了良好的参数 第 3 方库是 Popper js 我做了一个jest spyOn Popper prototype constructor
  • 设计管理的会话不会传播到子域

    我正在使用 Devise 来管理 Rails 3 1 应用程序中的身份验证 它在我的生产服务器中运行得很好 但我刚刚设置了一个新的测试服务器 如果我登录主站点 访问子域无法识别会话 它要求我重新登录 我不记得在哪里可以解决此信息的问题 看起
  • 如何在 Azure 广告 B2C 上使用自定义角色?

    我的 API 需要三种类型的用户 我想使用自定义角色定义来管理它 是否可以在 Azure B2c 上创建角色 然后通过 Microsoft Graph API 将这些角色分配给用户 我正在朝着同一个目标努力 所以这是我到目前为止发现的 将自
  • 如何在C中初始化char **?

    我对 C 还很陌生 我应该做一个简单的单词搜索谜题 所以对于 字典 我做了 char dictionary DOG ELEPHANT CAT ETC 但是当我尝试编译时 我收到一条警告 提示字典中的每个单词 标量初始值设定项中存在多余元素
  • MVC 视图的命名空间问题 - Razor 引擎

    我将 System Web DataVisualization 的引用添加到我的 MVC 项目中 现在 当我尝试将命名空间添加到 web config 时 出现错误 CS0234 命名空间 System Web UI 中不存在类型或命名空间
  • Intel芯片上的半精度浮点运算

    Intel芯片上可以进行半精度浮点运算吗 我知道如何加载 存储 转换半精度浮点数 1 但我不知道如何在不转换为单精度浮点数的情况下对它们进行加 乘 1 https software intel com en us articles perf