组装推送延迟过多

问题描述 投票:0回答:1

我听说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中才是令人惊奇的,它是≤0uops 1,对英特尔CPU不利!我说的对吗?

performance assembly x86-64
1个回答
0
投票
这是一家商店,当然它没有数据的单周期延迟。

但是,由于堆栈引擎的缘故,用于修改堆栈指针的有效延迟为零。 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)
  • 运算符3(w,不显示):内存
  • 延迟操作数1→3:≤2

  • 延迟操作数3→3(地址,基址寄存器:≤11)>
  • 我已经解释了如何查看上一个问题push的测量结果。

  • 并且,如果您正在查看Intel CPU的uop计数,不幸的是What do multiple values or ranges means as the latency for a single instruction?在表中显示


    unfused domain uop计数;您必须深入测量页面(例如SKX的吞吐量:https://uops.info/)才能看到RETIRE_SLOTS:1.04。在前端,它是一个单uu微融合存储,就像https://www.uops.info/html-tp/SKX/PUSH_R64-Measurements.html也是2个​​后端uu。

    但是当测试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?的方式并没有真正的不同。

  • 最新问题
    © www.soinside.com 2019 - 2024. All rights reserved.