为什么需要对 μop 进行分层?

2023-12-21

In “Intel CPU 中的 MicroFusion。”作者:丹尼斯·巴赫瓦洛夫 https://easyperf.net/blog/2018/02/15/MicroFusion-in-Intel-CPUs, 他说:

enter image description here Unlamination for SandyBridge is described in Intel® 64 and IA-32 Architectures Optimization Reference Manual in chapter “2.3.2.4: Micro-op Queue and the Loop Stream Detector (LSD)”:

微操作队列为某些指令类型提供解码后功能。特别是,与计算操作和所有存储相结合的加载,当与索引寻址一起使用时,在解码器或解码 ICache 中表示为单个微操作。在微操作队列中,它们通过称为取消分层的过程被分成两个微操作,一个执行加载,另一个执行操作

And in 黑客新闻主题 https://news.ycombinator.com/item?id=16304415#16305542,BeeOnRope 指出:

当指令在解码时融合,但在重命名之前“未层压”时,它通常具有与根本不融合类似的性能(但它确实节省了 uop 缓存中的空间),因为 RAT 更有可能成为性能限制。

在这种情况下,为什么要使用未层压代替指令解码时使用更多μops?看起来没有必要吗?

还是因为给定的μop是否应该unlamination在解码阶段是不确定的,需要根据运行时的CPU使用情况动态确定?


微融合+非层压在大部分前端都获得了微融合的吞吐量优势,只是在问题/重命名时失去了它。如果没有这种好处,更多的代码可能会在管道的早期部分遇到瓶颈,尤其是传统解码,其中任何多微指令指令都必须在一个“复杂”解码器中解码,而不是在任何“简单”解码器中解码。https://www.realworldtech.com/sandy-bridge/4/ https://www.realworldtech.com/sandy-bridge/4/


Sandybridge-family simplified the uop format for the out-of-order parts of the back-end (ROB and RS)1; fewer transistors for the same number of ROB entries saves power in a power-intensive part of the CPU. The ROB has to keep track of whether both uops have finished executing, and is dealing with physical register numbers since register-rename has already happened on issue/rename/allocate.

对我来说,解码是值得的vaddps ymm0, ymm1, [rdi+rdx*4]到解码器和微指令缓存中的单个微指令,然后取消层压,而不是首先不熔合。

在解码器中,只有一个复杂解码器可以产生超过 1 个 uop,因此任何尚未恰好位于其解码组中第一个的多 uop 指令都会提前结束该组。使用索引寻址模式拥有一堆带有内存操作数的指令可能会削弱传统解码吞吐量,因为每个这样的指令都会自行解码,需要复杂的解码器。

在uop缓存中,节省空间是有意义的;每“行”6 个 uop 并不是很大,多条指令的额外 uop 很容易需要同一 32 字节块的额外“行”,从而降低缓存密度,从而降低命中率。与 ROB 不同的是,它只需要作为块的一部分获取,无需索引即可让完成端口将其标记为“完成”并准备退出。


英特尔确实对 Haswell 进行了更改,以允许保持更多指令微融合:具有 2 个操作数和读+写目标的指令可以保持索引寻址模式微融合,例如addps xmm0, [rdi + rdx*4]。但不是vaddps xmm0, xmm0, [rdi+rdx*4], 很遗憾。看微融合和寻址模式 https://stackoverflow.com/questions/26046634/micro-fusion-and-addressing-modes

因此,显然他们意识到或决定值得在 ROB 条目上多花一些位来减少大量代码中的未分层。很多时候 CPU 都在运行标量代码,其指令如下add rdx, [rsi+rcx] or mov [rdi + rcx*4], eax(在 Intel CPU 上,存储是存储地址 + 存储数据微指令,每个写入存储缓冲区条目的一部分),而不是 AVX。此外,Haswell uop 格式必须更改以适应具有 3 个输入的单 uop FMA;在此之前,英特尔微指令最多可以有 2 个输入。 (直到布罗德韦尔,他们才利用这一点来制作adc and cmov单微操作;也许他们希望通过微代码禁用 FMA 作为一个选项,以防发现错误,因此不想将其硬连接到一些基线 x86 指令的处理方式中,这些指令无法在需要运行的 CPU 中禁用现有的二进制文件。)


还是因为给定的μop是否应该unlamination在解码阶段是不确定的,需要根据运行时的CPU使用情况动态确定?

也许与这个想法有关;在预解码中,指令被引导至适当的解码器。一些操作码总是被引导到复杂的解码器,将它们限制为传统解码的 1/时钟吞吐量,即使该操作码的实例实际上解码为单个 uop。 (至少这是我们最好的解释理论最近的英特尔微架构中的简单解码器可以处理所有 1-μop 指令吗? https://stackoverflow.com/questions/61980149/can-the-simple-decoders-in-recent-intel-microarchitectures-handle-all-1-%C2%B5op-inst)

如果预解码器必须基于索引寻址模式转向复杂解码器,它们可能会做一些不幸的事情,例如将带有 SIB 的任何 uop 发送到复杂解码器,包括add eax, [rsp+16].

它可能还使部分解码器与 Nehalem 更加相似,如果该指令可能的话,无论寻址模式如何,总是微融合内存操作数。


脚注 1:我不记得在哪里读到过有关英特尔简化后端内部微指令格式的事实。它不在https://www.realworldtech.com/sandy-bridge/ https://www.realworldtech.com/sandy-bridge/所以也许在https://agner.org/optimize/ https://agner.org/optimize/(微架构指南)

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

为什么需要对 μop 进行分层? 的相关文章

  • 跨 AVX 通道的最佳方式是什么?

    有些问题具有类似的标题 但我的问题涉及其他地方未涵盖的一个非常具体的用例 我有 4 个 128d 寄存器 x0 x1 x2 x3 我想将它们的内容重新组合在 5 个 256d 寄存器 y0 y1 y2 y3 y4 中 以准备其他计算 on
  • gcc 如何知道内联汇编中使用的寄存器大小?

    我有内联汇编代码 define read msr index buf asm volatile rdmsr d buf 1 a buf 0 c index 使用该宏的代码 u32 buf 2 read msr 0x173 buf 我发现反汇
  • elf .rel.text 部分中 R_386_32/R_386_PC32 的含义

    为了理解重定位的概念 我编写了一个简单的 chk c 程序 如下所示 1 include
  • 现代缓存中的方式预测

    我们知道 就缓存命中时间而言 直接映射缓存优于集合关联缓存 因为不涉及特定标签的搜索 另一方面 组关联缓存通常比直接映射缓存具有更好的命中率 我读到 现代处理器试图通过使用一种称为路径预测的技术来结合两者的优点 他们预测给定集合中最有可能发
  • 汇编编程语言:程序仅当输入为 ESC 时退出,并在退出前要求确认(y/n),否则循环

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

    我们将使用 Virtuoso 来存储 RDF 三重计数一开始将为 1 亿 我需要知道典型的 RAM CPU 磁盘等应该是什么 查询将使用 SPARQL 并且查询会有点复杂 请提供您的意见 Virtuoso 版本 6 x 三元组 四元组 的平
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https
  • 预取双类成员需要转换为 char*?

    我有一个正在使用的课程 mm prefetch 预先请求包含 double 类型的类成员的缓存行 class MyClass double getDouble return dbl other members double dbl othe
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 普通的 x86 或 AMD PC 是直接从 ROM 运行启动/BIOS 代码,还是先将其复制到 RAM? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道现代计算机已经修改了哈佛架构 它们可以从保存数据的地方以外的地方读取指令 这一事实是否允许它们直接从 ROM 芯片获取指令 他们是先
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • NodeJS CPU 一次飙升至 100%

    我有一个用 NodeJS 编写的 SOCKS5 代理服务器 我正在使用原生net and dgram打开 TCP 和 UDP 套接字的库 它可以正常工作大约 2 天 所有 CPU 的最大利用率约为 30 两天没有重新启动后 一个 CPU 峰
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数

随机推荐