长延迟指令

2024-03-30

I would like a long-latency single-uop x861 instruction, in order to create long dependency chains as part of testing microarchitectural features.

目前我正在使用fsqrt,但我想知道是否有更好的东西。

理想情况下,该指令将在以下标准上获得良好的评分:

  • 长延迟
  • 稳定/固定延迟
  • 一个或几个微指令(特别是:未微编码)
  • 消耗尽可能少的 uarch 资源(加载/存储缓冲区、页面遍历器等)
  • 能够与自身链接(延迟方面)
  • 能够使用 GP 寄存器链接输入和输出
  • 不会干扰正常的 OoO 执行(除了它消耗的任何 ROB、RS 等资源)

So fsqrt在大多数意义上都可以,但延迟并没有那么长,而且似乎很难与 GP 规则链接。


1 On modern Intel x86 in particular, with bonus points if it also works well on AMD Zen*.


主流 Intel CPU 没有任何很长延迟的单微指令整数指令。所有 ALU 端口上都有用于 1 周期延迟微指令的整数 ALU,端口 1 上有一个 3 周期延迟流水线 ALU。我认为 AMD 类似。

div/sqrt 单元是唯一真正高延迟的 ALU,但整数 div/idiv 在 Intel 上进行了微编码,因此可以使用 FP,其中 div/sqrt 通常是单 uop 指令。

AMD 的整数div / idiv是 2 个 uop 指令(大概是写入 2 个输出),具有数据相关的延迟。

此外,AMD Bulldozer/Piledriver(其中 2 个整数核心共享一个 SIMD/FP 单元)具有相当高的延迟movd xmm, r32(10c 2 uop)和movd r32, xmm(8c 1 uop)。压路机将其缩短 1c。 Ryzen 在任一方向上都有 3 周期 1 uop。

movd到/从 XMM 寄存器在 Intel 上很便宜:具有 1 周期(Broadwell 及更早版本)或 2 周期延迟(Skylake)的单微指令。 (https://agner.org/optimize/ https://agner.org/optimize/)


sqrtss具有固定延迟(在 IvB 及更高版本上),除了次正常输入之外。如果你的整数链只涉及movd xmm, r32对于任意整数位模式,您可能需要设置 DAZ/FTZ 以消除 FP 辅助的可能性。 NaN 输入没问题;这不会导致 SSE/AVX 数学速度减慢,只会导致 x87 速度减慢。

其他 CPU(Sandybridge 及更早版本,以及所有 AMD)具有可变延迟sqrtss所以你可能想控制那里的起始位模式。

如果你愿意的话也一样use sqrtsd每微操作的延迟高于sqrtss。即使在 Skylake 上,它仍然是可变的延迟。 (15-16 个周期)。

您可以假设延迟是输入位模式的纯函数,所以开始一个链sqrtss每次具有相同输入的指令将给出相同的延迟序列。或者起始输入为0.0, 1.0, +inf, or NaN, 你会得到the same序列中每个微操作的延迟。

(像 1.0 和 0.0 这样的简单输入(输入和输出中很少有有效数字)大概以最低的延迟运行。sqrt(1.0) = 1.0 和 sqrt(0) = 0,所以这些是自我延续的。sqrt(NaN 也一样) ) = 南)

你可能会使用and reg, 0或其他非深度破坏归零作为链的一部分来控制输入位模式。也许or reg, -1创建 NaN。然后,您可以在 Sandybridge 或更早版本以及包括 Zen 在内的 AMD 上获得固定延迟。

也许pinsrw xmm0, eax, 7(Intel 上的端口 5 为 2 uop)仅修改 XMM 的高 qword,将底部保留为已知0.0 or 1.0。可能更便宜and与 0 并使用movd,除非端口 5 压力不是问题。


创建吞吐量瓶颈(不是延迟),您对 Skylake 的最佳选择是vsqrtpd ymm- p0 为 1 uop,延迟 = 15-16,吞吐量 = 9-12。

在 Broadwell 及更早版本上,它是 3 uops (2p0 p15),但我认为 Skylake 拓宽了 SIMD 分频器(我猜是为 AVX512 做准备)。

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

长延迟指令 的相关文章

  • 如何用 numpy 在 Cython 中表示 inf 或 -inf ?

    我正在用 cython 逐个元素构建一个数组 我想存储常量np inf or 1 np inf 在某些条目中 然而 这将需要返回 Python 进行查找的开销inf 有没有libc math相当于这个常数 或者其他一些可以轻松使用的值 相当
  • 优化 Web 应用程序开发策略

    如今 许多网络应用程序正在使用它们自己无法使用的 API 或代码 并且通常使用效率低下 我想到了一些谷歌地图混搭 对于 php asp 后端 HTML javascript 尤其是现在所有的 AJAX 存在许多潜在的瓶颈 问题 低效率和双重
  • 这段代码可以优化吗?

    我有一些图像处理代码 循环遍历 2 个多维字节数组 大小相同 它从源数组中获取一个值 对其执行计算 然后将结果存储在另一个数组中 int xSize ResultImageData GetLength 0 int ySize ResultI
  • 为什么在比较范围内的数字时会在汇编代码中发生分支?

    我正在读书this https stackoverflow com questions 17095324 fastest way in c to determine if an integer is between two integers
  • 汇编编程语言:程序仅当输入为 ESC 时退出,并在退出前要求确认(y/n),否则循环

    我只是汇编语言编程的初学者 我们的第一个任务是让程序仅在输入为 ESC 时退出 退出之前请求确认 y n 否则循环 我知道 ESC 在 ASCII 代码中具有等效值 但我对插入位置或是否需要添加更多内容感到困惑 请帮我 这是程序 model
  • 使用 :first 优化 jQuery 选择器

    我有过这样的感觉 class first 运行速度比 class 所以任何时候我都知道只有一个 class在子集中 我已经使用了它 Does first使查询运行得更快 还是没有必要 这实际上取决于浏览器 first http api jq
  • C++ 中的编译器指令重新排序优化(以及阻碍它们的因素)

    我已将代码缩减为以下内容 这在保留我感兴趣的编译器输出的同时 尽可能简单 void foo const uint64 t used uint64 t ar 100 for int i 0 i lt 100 i ar i some globa
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https
  • 如何通过点积获得峰值 CPU 性能?

    Problem 我一直在研究 HPC 特别是使用矩阵乘法作为我的项目 请参阅我的个人资料中的其他帖子 我在这些方面取得了不错的成绩 但还不够好 我退后一步 看看我在点积计算方面能做得如何 点积与矩阵乘法 点积更简单 并且允许我测试 HPC
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • 如何使用 #pragma 在 G++ 中启用优化

    我想在没有命令行参数的情况下启用 g 优化 我知道 GCC 可以通过写来做到这一点 pragma GCC optimize 2 在我的代码中 但它似乎在 G 中不起作用 此页面可能有帮助 http gcc gnu org onlinedoc
  • 取消的分支与常规分支有何不同?

    特别是对于 SPARC Assembly 取消的分支与常规分支有何不同 我一直认为 当我需要填充分支指令的 nop 延迟槽时 需要取消分支指令 但是 我认为我在这一部分上是不正确的 因为您可以在不取消分支的情况下填充 nop 如果不采用分支
  • 将两个 32 位整数向量相乘,生成 32 位结果元素向量

    将每个 32 位条目乘以 2 的最佳方法是什么 mm256i互相注册 mm256 mul epu32不是我正在寻找的 因为它产生 64 位输出 我想要每个 32 位输入元素都有一个 32 位结果 而且 我确信两个 32 位值的乘法不会溢出
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 在 Ruby 中构建字符串时,为什么铲运算符 (<<) 优于加等于 (+=)?

    我正在通过 Ruby Koans 进行工作 The test the shovel operator modifies the original string公案中about strings rb包括以下评论 Ruby 程序员倾向于使用铲子
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 为什么 hibernate 在 SAVE 之前执行 SELECT?

    为什么 hibernate 在保存对象之前要进行选择 我在互联网上找不到有用的信息 这是每次保存之前的正常行为吗 我发现这个话题 选择 hibernateTemplate save 的查询运行 https stackoverflow com
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • Rglpk - 梦幻足球阵容优化器 - For 循环输出的 Rbind

    我有一个使用 Rgplk 的梦幻足球阵容优化器 它使用for循环生成多个最佳阵容 其数量由用户输入 代码如下 Lineups lt list for i in 1 Lineup no matrix lt rbind as numeric D

随机推荐