对于Intel Haswell上的XMM/YMM FP操作,可以使用FMA代替ADD吗?

2024-04-15

这个问题适用于 Haswell 上带有 XMM/YMM 寄存器的打包、单精度浮点运算。

所以根据awesome, awesome table http://www.agner.org/optimize/instruction_tables.pdf由 Agner Fog 汇总,我知道 MUL 可以在端口 p0 和 p1 上完成(recp 吞吐量为 0.5),而 ADD 仅在端口 p1 上完成(recp 吞吐量为 1)。我可以排除这个限制,但我也知道 FMA 可以在端口 p0 或 p1 上完成(recp 吞吐量为 0.5)。因此,当 FMA 可以使用 p0 或 p1 并且它同时执行 ADD 和 MUL 时,为什么普通 ADD 仅限于 p1,这让我感到困惑。难道是我对表的理解有误?或者有人可以解释为什么会这样?

也就是说,如果我的阅读是正确的,那么英特尔为什么不直接使用 FMA 操作作为普通 MUL 和普通 ADD 的基础,从而提高 ADD 和 MUL 的吞吐量。或者,什么会阻止我使用两个同时、独立的 FMA 操作来模拟两个同时、独立的 ADD 操作?执行 ADD-by-FMA 会受到哪些处罚?显然,使用了更多数量的寄存器(2 个寄存器用于 ADD,3 个寄存器用于 ADD-by-FMA),但除此之外呢?


您并不是唯一一个对英特尔为何这样做感到困惑的人。阿格纳·雾在他的微架构 http://agner.org/optimize/microarchitecture.pdfHaswell 的手册写道:

奇怪的是,只有一个端口用于浮点加法,但有两个端口用于浮点乘法。

在阿格纳的留言板上他还写 http://agner.org/optimize/blog/read.php?i=285#352

浮点乘法和乘加融合有两个执行单元,但浮点加法只有一个执行单元。这种设计似乎不是最理想的,因为浮点代码通常包含比乘法更多的加法。

该线程继续提供有关该主题的更多信息,我建议您阅读这些信息,但我不会在这里引用。

他还在这个答案中讨论了这个问题sandy-bridge-and-haswell-sse2-avx-avx2 的每周期浮点数 https://stackoverflow.com/questions/15655835/flops-per-cycle-for-sandy-bridge-and-haswell-sse2-avx-avx2

Haswell 上 FMA 指令的延迟为 5,吞吐量为每个时钟 2。这意味着您必须保持 10 个并行操作才能获得最大吞吐量。例如,如果您想添加一个很长的 f.p 列表。数字,您必须将其分成十个部分并使用十个累加器寄存器。

这确实是可能的,但谁会为某个特定处理器进行如此奇怪的优化呢?

他的回答基本上回答了你的问题。您可以使用 FMA 使加法吞吐量加倍。事实上,我在加法吞吐量测试中这样做了,并且确实看到它翻倍了。

总之,此外,如果您的计算受延迟限制,则不要使用 FMA,而应使用 ADD。但如果吞吐量有限,您可以尝试使用 FMA(通过将乘数设置为 1.0),但您可能必须使用许多 AVX 寄存器来执行此操作。

我展开 10 次以获得最大吞吐量使用 ivy-bridge 和 haswell 进行循环展开以实现最大吞吐量 https://stackoverflow.com/questions/21090873/loop-unrolling-to-achieve-maximum-throughput-with-ivy-bridge-and-haswell/21600232#21600232

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

对于Intel Haswell上的XMM/YMM FP操作,可以使用FMA代替ADD吗? 的相关文章

  • 将8个16位SSE寄存器转换为8位数据

    假设我有一个包含 16 位数据的 SSE 数组 1 2 3 4 5 6 7 8 现在我需要通过在前 8 个字节中仅存储 16 位数据的低字节来将此 SSE 数组转换为 8 位数据 如下所示 1 2 3 4 5 6 7 8 0 0 0 0 0
  • 使用 ymm 寄存器作为“类似内存”的存储位置

    考虑 x86 中的以下循环 on entry rdi has the number of iterations top some magic happens here to calculate a result in rax mov arr
  • 在每个函数/每个代码块的基础上启用 SSE4 的正确方法是什么?

    对于我的一个 OS X 程序 我有一些使用 SSE4 1 指令的优化案例 在仅 SSE3 的计算机上 运行非优化分支 SupportsSSE4 1 returns true on CPUs that support SSE4 1 false
  • 具有 PCLMULQDQ 的快速 CRC *未反映*

    我正在尝试写一个PCLMULQDQ 优化的 CRC 32 https www intel com content dam www public us en documents white papers fast crc computatio
  • 是否存在或将会存在 target_clones 属性的“全局”版本?

    我最近玩过target clones该属性从 gcc 6 1 及更高版本可用 这非常漂亮 但是就目前而言 它需要一种有点笨拙的方法 每个想要多版本化的函数都必须手动声明一个属性 这不是最佳的 因为 它将编译器特定的内容放入代码中 它要求开发
  • SSE 双线性插值

    我正在紧密循环中实现双线性插值 并尝试使用 SSE 对其进行优化 但我从中得到的加速为零 这是代码 非 SIMD 版本使用简单的向量结构 可以定义为struct Vec3f float x y z 实现乘法和加法运算符 ifdef USE
  • 是否可以使用 SSE 对此嵌套进行矢量化?

    我从来没有为 SSE 优化编写过汇编代码 如果这是一个菜鸟问题 我很抱歉 在this https felix abecassis me 2012 08 sse vectorizing conditional code 文章解释了如何向量化f
  • 当内存带宽受限时 SSE 和 AVX 的性能

    在下面的代码中 我更改了 dataLen 并获得了不同的效率 dataLen 400 SSE 时间 758000 us AVX 时间 483000 us SSE gt AVX dataLen 2400 SSE 时间 4212000 us A
  • 如何避免单元测试中的浮点舍入错误?

    我正在尝试为一些对单精度浮点数数组进行操作的简单向量数学函数编写单元测试 这些函数使用 SSE 内在函数 并且在 32 位系统上运行测试时出现误报 至少我认为 测试在 64 位上通过 当操作遍历数组时 我积累了越来越多的舍入误差 这是单元测
  • memcpy 在 Linux 中移动 128 位

    我正在 Linux 中为 PCIe 设备编写设备驱动程序 该设备驱动程序执行多次读取和写入来测试吞吐量 当我使用 memcpy 时 最大有效负载TLP https en wikipedia org wiki PCI Express Data
  • Intel 指令文档中未使用 XMM 寄存器 0

    在 Intel x64 手册中 它说 32 位 SSE2 模式下有 XMM 寄存器 0 7 那么为什么 95 使用这些寄存器的指令会跳过 0 并使用 1 4 例如Intel的vol 2手册entry https www felixclout
  • MOVDQA 和 MOVAPS x86 指令之间的区别?

    我正在查找英特尔数据表 英特尔 64 和 IA 32 架构 软件开发人员手册我找不到两者之间的区别 MOVDQA 移动对齐的双四字 MOVAPS 移动对齐压缩单精度 在英特尔数据表中我可以找到这两条指令 该指令可用于从 128 位加载 XM
  • AVX2浮点比较并得到0.0或1.0而不是全0或全1位

    基本上 在生成的向量中 我想为所有输入浮点值 gt 1 保存 1 0 而为所有输入浮点值 float f 8 1 2 0 5 1 7 1 9 0 34 22 9 18 6 0 7 float r 8 Must be 1 0 1 1 0 1
  • 融合乘加和默认舍入模式

    使用 GCC 5 3 可以编译以下代码 O3 fma float mul add float a float b float c return a b c 产生以下程序集 vfmadd132ss xmm1 xmm2 xmm0 ret 我注意
  • 我应该使用 SIMD 或向量扩展还是其他什么?

    我目前正在开发一个开源 3D 应用程序框架c questions tagged c 2b 2b with c 11 questions tagged c 2b 2b11 我自己的数学库是这样设计的XNA数学库 http msdn micro
  • 在 SIMD 操作上下文中,非压缩指令和压缩指令有什么区别?

    在 SIMD 操作上下文中 非压缩指令和压缩指令有什么区别 我正在阅读一篇关于优化 SSE 代码的文章 http www cortstratton org articles OptimizingForSSE php batch http w
  • AmazonDB 免费套餐的含义是什么?

    在我的 Android 应用程序中 我使用 Amazon DynamoDB 我创建了 10 个表 读取容量为 10 写入容量为 5 今天我收到了一封来自 Amazon 的电子邮件 我花了 11 36 美元 我不明白免费套餐的含义 这是我从亚
  • 优化数组压缩

    假设我有一个数组k 1 2 0 0 5 4 0 我可以按如下方式计算掩码m k gt 0 1 1 0 0 1 1 0 仅使用掩码 m 和以下操作 左移 右移 And Or 加 减 乘 我可以将 k 压缩为以下形式 1 2 5 4 以下是我目
  • 使用 AVX 内在函数代替 SSE 并不能提高速度 - 为什么?

    我已经使用 Intel 的 SSE 内在函数相当长一段时间了 并取得了良好的性能提升 因此 我希望 AVX 内在函数能够进一步加速我的程序 不幸的是 直到现在情况并非如此 可能我犯了一个愚蠢的错误 所以如果有人能帮助我 我将非常感激 我使用
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi

随机推荐