Fro*_*ter 3 cpu x86 intel cpu-architecture
在“Intel CPU 中的 MicroFusion”中。丹尼斯·巴赫瓦洛夫 (Denis Bakhvalov)说道:
\n\nSandyBridge 的取消层压在《Intel\xc2\xae 64 和 IA-32 架构优化参考手册》章节 \xe2\x80\x9c2.3.2.4:微操作队列和循环流检测器 (LSD)\xe2\x80 中进行了描述\x9d:
\n\n微操作队列为某些指令类型提供解码后功能。特别是,与计算操作和所有存储相结合的加载,当与索引寻址一起使用时,在解码器或解码 ICache 中表示为单个微操作。在微操作队列中,它们通过称为取消分层的过程被分成两个微操作,一个执行加载,另一个执行操作
\n
BeeOnRope在HackerNews 主题中指出:
\n\n\n当指令在解码时融合,但在重命名之前为 \xe2\x80\x9cunlaminate\xe2\x80\x9d 时,它通常具有与根本不融合相似的性能(但它确实节省了 uop 缓存中的空间),因为 RAT 更可能是性能限制。
\n
在这种情况下,为什么在指令解码时使用unlamination而不是使用更多 \xce\xbcops使用更多的 \xce\xbcops ?看起来没有必要吗?
\n还是因为给定的\xce\xbcop是否应该unlamination在解码阶段是不确定的,需要根据运行时的CPU使用情况动态确定?
\n微融合+取消层压在大部分前端都获得了微融合的吞吐量优势,只是在问题/重命名时失去了它。如果没有这一优势,更多的代码可能会在管道的早期部分遇到瓶颈,尤其是传统解码,其中任何多微指令指令都必须在一个“复杂”解码器中进行解码,而不是在任何“简单”解码器中进行解码。 https://www.realworldtech.com/sandy-bridge/4/
\nSandybridge 系列简化了后端无序部分(ROB 和 RS)1的 uop 格式;相同数量的 ROB 条目使用更少的晶体管可以节省 CPU 耗电部分的功耗。ROB 必须跟踪两个 uops 是否已完成执行,并且正在处理物理寄存器号,因为在发出/重命名/分配时已经发生了寄存器重命名。
\n对我来说,在解码器和微指令缓存中解码为单个微指令并稍后取消层压是值得的vaddps ymm0, ymm1, [rdi+rdx*4]
,而不是首先不融合。
在解码器中,只有一个复杂的解码器可以产生超过 1 个 uop,因此任何尚未恰好成为其解码组中第一个的多 uop 指令都会提前结束该组。使用索引寻址模式拥有一堆带有内存操作数的指令可能会削弱传统解码吞吐量,因为每个这样的指令都会自行解码,需要复杂的解码器。
\n在uop缓存中,节省空间是有意义的;每“行”6 个 uop 并不是很大,多条指令的额外 uop 很容易需要同一 32 字节块的额外“行”,从而降低缓存密度,从而降低命中率。与 ROB 不同的是,它只需要作为块的一部分获取,无需索引即可让完成端口将其标记为“完成”并准备退出。
\n英特尔确实对 Haswell 进行了更改,以允许保持更多指令微融合:具有 2 个操作数和读+写目标的指令可以保持索引寻址模式微融合,例如addps xmm0, [rdi + rdx*4]
. 但不幸的是vaddps xmm0, xmm0, [rdi+rdx*4]
,事实并非如此。请参阅微融合和寻址模式
因此,显然他们意识到或决定值得在 ROB 条目上多花一些位来减少大量代码中的未分层。很多时候,CPU 运行标量代码,使用类似add rdx, [rsi+rcx]
or 的指令mov [rdi + rcx*4], eax
(在 Intel CPU 上,存储是存储地址 + 存储数据微指令,每个写入存储缓冲区条目的一部分),而不是 AVX。此外,Haswell uop 格式必须更改以适应具有 3 个输入的单 uop FMA;在此之前,英特尔微指令最多可以有 2 个输入。(直到 Broadwell,他们才利用这一点来制作adc
和cmov
单微操作;也许他们希望通过微代码禁用 FMA 作为一个选项,以防发现错误,所以不想硬连线它了解如何处理一些基线 x86 指令,这些指令无法在需要运行现有二进制文件的 CPU 中禁用。)
\n\n还是因为给定的\xce\xbcop是否应该unlamination在解码阶段是不确定的,需要根据运行时的CPU使用情况动态确定?
\n
也许与这个想法有关;在预解码中,指令被引导至适当的解码器。一些操作码总是被引导到复杂的解码器,将它们限制为传统解码的 1/时钟吞吐量,即使该操作码的实例实际上解码为单个 uop。(至少这是我们解释最新英特尔微架构中的简单解码器可以处理所有 1-μop 指令的最佳理论吗?)
\n如果预解码器必须基于索引寻址模式转向复杂解码器,它们可能会做一些不幸的事情,例如将带有 SIB 的任何 uop 发送到复杂解码器,包括add eax, [rsp+16]
.
它可能还使部分解码器与 Nehalem 更加相似,如果该指令可能的话,无论寻址模式如何,总是微融合内存操作数。
\n脚注 1:我不记得在哪里读到过有关英特尔简化后端内部微指令格式的事实。它不在https://www.realworldtech.com/sandy-bridge/中,所以可能在https://agner.org/optimize/(microarch 指南)中
\n 归档时间: |
|
查看次数: |
179 次 |
最近记录: |