使用索引寻址模式时的瓶颈

2023-11-30

我在 Haswell 和 Coffee Lake 机器上进行了以下实验。

指令

cmp rbx, qword ptr [r14+rax]

吞吐量为 0.5(即每个周期 2 条指令)。这正如预期的那样。该指令被解码为随后未层压的一个微指令(参见https://stackoverflow.com/a/31027695/10461973),因此需要两个退出时隙。

如果我们添加一个nop操作说明

cmp rbx, qword ptr [r14+rax]; nop

我预计吞吐量为 0.75,因为该序列需要 3 个退休槽,并且后端似乎也没有其他瓶颈。这也是 IACA 报告的吞吐量。然而,实际吞吐量为 1(这与微指令来自解码器还是 DSB 无关)。这个案例中的瓶颈是什么?

如果没有变址寻址模式,

cmp rbx, qword ptr [r14]; nop

正如预期的那样,吞吐量为 0.5。


看来您已经发现了取消分层与常规多微指令指令相比的缺点,也许是在微融合微指令到达 IDQ 头部时与 4 宽问题/重命名/分配的交互中。

假设:也许由未层压产生的两个 uop 必须属于同一问题组,所以unlaminated; nop重复仅实现每个时钟 3 个融合域微指令的前端吞吐量。

如果取消分层仅发生在 IDQ 的头部(当它们到达分配/重命名阶段时),那么这可能是有意义的。而不是将它们添加到 IDQ 中。去测试this,我们可以看到 Haswell 上的 LSD(循环缓冲区)容量是否取决于取消层压之前或之后的 uop 计数 -@AndreasAbel 的测试显示包含 55x 的循环cmp rbx, [r14+rax]从 Haswell 上的 LSD 运行,因此这是分配/重命名期间发生取消分层的有力证据,not在 IDQ 本身中获取多个条目。


为了比较,cmp dword [rip+rel32], 1首先,在解码器中不会出现微熔丝,因此它不会分层。如果它达到 0.75c 的吞吐量,这将是支持在同一问题组中需要空间的非层压的证据。

Perhaps times 2 nop; unlaminate or times 3 nop也可能是一个有趣的测试,看看未层压的 uop 是否会自行发出,或者在从问题组中的任何位置延迟后是否可以可靠地再获取 2 个 NOP。从你的背靠背cmp-unlaminate 测试,我预计我们仍然会看到大部分完整的 4-uop 问题组。


你的问题提到了退休,但没有提到问题。

Retire 至少与 Issue 一样宽(从 Core2 到 Skylake 为 4 宽,在 Ice Lake 为 5 宽)。

桑迪布里奇/哈斯韦尔退役 4 个融合域微指令/时钟。 Skylake 每个时钟可以停用 4 个融合域微指令每个超线程,如果两个逻辑核心都忙的话,允许在一个旧的停滞 uop 最终完成后更快地释放资源,例如加载缓冲区。目前还不是 100% 清楚在单线程模式下运行时是否可以退休 8/clock,我发现相互矛盾的说法,并且 Intel 的优化手册中没有明确的声明。

真正造成退休瓶颈(但不是问题),即使不是不可能,也是非常困难的。任何持续的流都必须经过发行阶段,该阶段不比退休更宽。 (性能计数器uops_issued.any表明未层压发生在发布前的某个时刻,因此这并不能帮助我们通过前端塞入超出退休处理能力的更多微指令。除非这具有误导性;在同一物理核心的两个逻辑核心上运行相同的循环应该具有相同的整体瓶颈,但如果 Skylake 运行得更快,那就会告诉我们并行 SMT 退役有所帮助。不太可能,但如果有人想排除它,需要检查一下。)


这也是 IACA 报告的吞吐量

IACA 的管道模型看起来相当幼稚;我认为它不知道 Sandybridge 的 4 uop 倍数问题效应(例如 6 uop 循环的成本与 8 uop 相同)。 IACA 也不知道 Haswell 能否保留add eax, [rdi+rdx]在整个管道中进行微融合,因此对未分层的索引微指令的任何分析都是错误的。

我不相信 IACA 会做更多的事情,除了计算 uops 以及对它们将如何分配给端口进行一些疯狂的猜测。

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

使用索引寻址模式时的瓶颈 的相关文章

  • 源操作数和目标操作数是否需要相同大小?

    我刚刚尝试了这个问题 要求你解释一下代码行有什么问题 movl eax rdx 解决方案表明目标操作数的大小错误 仅当从较大尺寸变为较小尺寸时才 非法 还是源操作数和目标操作数对于所有指令 或至少 mov 类类型 必须具有相同的尺寸 是的
  • 什么是微编码指令?

    我看过很多参考微编码指令的文献 这些是什么以及为什么使用它们 CPU 读取机器代码并将其解码为内部控制信号 将正确的数据发送到正确的执行单元 大多数指令映射到一个内部操作 并且可以直接解码 例如 在 x86 上 add eax edx只是将
  • 哪种架构称为非均匀内存访问(NUMA)?

    根据wiki http en wikipedia org wiki Non uniform memory access 非均匀内存访问 NUMA 是一种用于多处理的计算机内存设计 其中内存访问时间取决于相对于处理器的内存位置 但尚不清楚它是
  • x86-64 Linux 中不再允许使用 32 位绝对地址?

    64 位 Linux 默认使用小内存模型 将所有代码和静态数据置于 2GB 地址限制以下 这确保您可以使用 32 位绝对地址 旧版本的 gcc 对静态数组使用 32 位绝对地址 以便节省相对地址计算的额外指令 然而 这不再有效 如果我尝试在
  • 现代缓存中的方式预测

    我们知道 就缓存命中时间而言 直接映射缓存优于集合关联缓存 因为不涉及特定标签的搜索 另一方面 组关联缓存通常比直接映射缓存具有更好的命中率 我读到 现代处理器试图通过使用一种称为路径预测的技术来结合两者的优点 他们预测给定集合中最有可能发
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 为什么n++执行速度比n=n+1快?

    在C语言中 为什么n 执行速度快于n n 1 int n n int n n n 1 我们的老师在今天的课堂上问了这个问题 这不是家庭作业 如果您正在开发一个 石器时代 编译器 的情况下 石器时代 n比n 比n n 1 机器通常有incre
  • 为什么在展开的 ADD 循环内重新初始化寄存器会使其运行速度更快,即使循环内有更多指令?

    我有以下代码 include
  • SIMD 和 VLIW 指令是一样的吗?

    SIMD 单指令多数据 和 VLIW 超长指令字 到底有什么区别 其中一个是另一个的子集吗 或者它们是两个完全不同的东西 完全不相关且正交 一台机器可以有一个或两个 或者两者都没有 SIMD 指令可以作为扩展添加到 VLIW ISA 但 V
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • 如何有效地扫描每次迭代交替的 2 位掩码

    给定 2 个位掩码 应交替访问 0 1 0 1 我尝试获得运行时高效的解决方案 但找不到比以下示例更好的方法 uint32 t mask 2 uint8 t mask index 0 uint32 t f tzcnt u32 mask ma

随机推荐

  • 如何在 Picturebox C# 中添加标签透明度?

    我在其中创建一个程序可以添加标签和图片框 所有控件都必须是面板的子控件 我使用这样的代码 panel2 Controls Add picturebox1 panel2 Controls Add label1 是的 问题是我想要在图片框上贴上
  • java控制台输入

    通过控制台输入的任何数据类型 就像我使用 BufferedReader 类所做的那样 是 String 之后我们将其转换为所需的数据类型 如 Inter parseInt 表示整数 但是在 C 中 我们可以接受任何输入原始数据类型 而在ja
  • std::auto_ptr 到 std::unique_ptr

    随着新标准的到来 以及某些编译器中已经可用的部分 新类型std unique ptr应该是替代品std auto ptr 它们的用法是否完全重叠 这样我可以在我的代码上进行全局查找 替换 不是我会这样做 但如果我这样做 或者我应该意识到一些
  • 搜索短信收件箱

    如何搜索短信收件箱并显示来自特殊号码的最新消息 例如 搜索 999999999 并显示从此号码收到的最后一条消息 有办法做到这一点吗 我已使用此代码返回我的收件箱中的消息数 TextView view Override public voi
  • System.Object 类和结构之间的关系

    我知道我的问题看起来很愚蠢 但我很困惑 如果有人为我澄清这一点 我将不胜感激 我知道结构 例如Int32 是值类型 在堆栈上实例化 而类是引用类型 在堆上实例化 我还知道所有结构都派生自 System Object 类型 它是一个类 我想知
  • 尽管已颁发有效令牌,但仍从 Dynamics 365 返回 401

    我正在尝试重写当前使用 JavaScript 连接到 Dynamics 365 的客户端应用程序 let URL https
  • Ember 2.0 中的 makeBoundHelper 替代方案

    到目前为止 我一直在使用绑定助手在我的博客文章中注入 Google DFP 广告 由于所有 Handlebars API 已在 Ember 2 0 中删除从 Ember 2 0 开始我可以使用什么 import Ember from emb
  • Android 加速度计全系列

    我目前正在处理 Android 传感器 API 和加速计数据 虽然内部组件应该支持高加速 甚至 16g 但我尝试了一些最近的智能手机 发现暴露数据的最大范围通常是 2g 例如Nexus 5 有时是 4g 例如Nexus 4 有没有办法设置传
  • add_library 无法在 CMake 中添加 CSharp 源文件?

    我正在尝试从一组构建 CSharp DLL cs文件 我用的是add library 函数添加源文件 cs文件 但它给出了诸如 add library for library libname without any source files
  • phonegap :: navigator.notification.activityStart()和loadingStart()不起作用

    我尝试在phonegap1 0 在onDeviceReady内部 上调用loadingStart 和activityStart 但它不起作用 有已知的原因吗 它应该运作良好吗 thnx 正如 mmigdol 所说 这些已在 1 0 0 中被
  • 在 fopen a+ 模式下从多个线程/进程写入锁定文件之前是否需要同步/刷新?

    我正在从多个线程对单个文件执行 I O 访问此共享文件foo通过咨询文件锁进行控制 flock 2 with LOCK EX foo被打开fopen 3 mode a a 被选中是因为文档指出 对文件的后续写入将始终以当时的当前位置结束 文
  • 如何在 Tableau 中将不同的 y 轴合并为一个 y 轴

    在 Tableau 中 我想弄清楚如何组合 前吸烟者 从不吸烟 每天吸烟 和 有时吸烟 的 y 轴 我想要一个范围从 0 00 到 1 的 y 轴 非常感谢您的帮助 谢谢 不确定您的理想图形输出 但不要绘制每个单独的度量 将 测量值 药丸拖
  • 为什么会出现反向递归

    问题是 函数是否在再次调用该函数的行暂停 或者是否完全执行然后返回到该行 调用同一函数的行 我还有这个例子 它表明递归是以相反的方式发生的 我猜每个内部函数都保留对其外部函数的引用 并且执行以与正常顺序相反的方式发生 请尽可能详细说明 fu
  • 写入联合中的字节数组并从 int 读取以转换 MISRA C 中的值是否合法?

    我想这一定是以前被问过的 但我无法得到具体的是 否的答案 我有这个代码片段 union integer to byte signed int IntPart unsigned char BytePart 2 typedef union in
  • openssl.so 出现 Rails LoadError:未定义符号:d2i_ECPKParameters

    导轨 版本 轨道3 2 1 ruby v 红宝石 1 9 3p0 2011 10 30 x86 64 linux rpm qa grep openssl openssl 0 9 8e 20 el5 openssl devel 0 9 8e
  • 对象修改的差异

    我只是想知道是否有人可以帮助我解决这个问题 StringBuilder s new StringBuilder 0123456789 s substring 1 2 System out println s s delete 2 8 Sys
  • 如何使用 VBA 在 PowerPoint 演示文稿的所有幻灯片上粘贴水印?

    如何使用VBA向PPT演示文稿的所有幻灯片添加水印 形状倾斜45度且呈灰色 我创建了一个输入框来接受一个字符串变量 该变量将在 PPT 的所有幻灯片上加水印 我还尝试创建一个形状并将输入的变量输入其中 我现在面临一个挑战 将这个形状粘贴到演
  • 将 SelectedItems 绑定到 ObservableCollection 属性

    Why the SelectedItems无法从 XAML 绑定 我如何绑定它并保持应用 MVVM 模式 SelectedItems是无法绑定的只读属性 虽然存在通过附加属性解决此问题的方法
  • `` 提供什么,它记录在哪里?

    新的 C 11 标准提到了一个标头
  • 使用索引寻址模式时的瓶颈

    我在 Haswell 和 Coffee Lake 机器上进行了以下实验 指令 cmp rbx qword ptr r14 rax 吞吐量为 0 5 即每个周期 2 条指令 这正如预期的那样 该指令被解码为随后未层压的一个微指令 参见http