我听说push
的周期仅为1,并且在为push
设计的处理器中有一些特殊的处理使它变得特殊,而不是这样做:
sub rsp, 24
mov [rsp], rbx
mov [rsp+8], rcx
mov [rsp+16], rdx
最好像这样使用push:
push rbx
push rcx
push rdx
但是今天,我看到[[PUSH(R64)的延迟为[[≤2;≤11]和uops 2
!什么...!因此push
不仅是1个延迟!这是一个繁重的指示!仅在AMD Zen2 CPU中才是令人惊奇的,它是≤0
和uops 1
,对英特尔CPU不利!我说的对吗?
但是,由于堆栈引擎的缘故,用于修改堆栈指针的有效延迟为零。 https://uops.info/甚至没有测试。例如从SKX latency results test details中,您可以看到他们只测试了从寄存器输入到重载存储器的延迟,除了对[rsp]
的重载链回到下一个[ C0]。
操作数1(r):寄存器(RAX,RCX,RDX,RBX,RSP,RBP,RSI,RDI,R8,R9,R10,R11,R12,R13,R14,R15)]]运算符2(r / w,
- 被抑制
):寄存器(RSP)
延迟操作数1→3:≤2
我已经解释了如何查看上一个问题push
的测量结果。
并且,如果您正在查看Intel CPU的uop计数,不幸的是What do multiple values or ranges means as the latency for a single instruction?在表中显示
但是当测试mov [rsp], rbx
的一大块指令时,push
的测量结果仅为[[over]] 1。 push r8
是堆栈引擎偏移量溢出时堆栈同步uop的摊销成本。 .04
阅读Agner Fog的微体系结构指南以获取一些背景细节,这些细节将有助于您理解表格。
AMD CPU并不称其为“微融合”,它们只是始终将前端的存储地址和存储数据部分保持为1 uop。这就是uops.info将其列为AMD 1 uop的原因,即使它与Intel处理What is the stack engine in the Sandybridge microarchitecture?的方式并没有真正的不同。