长等待时间指令

问题描述 投票:2回答:2

我想要一个长等待时间的单微指令x86 1指令,以便创建长的依赖链,作为测试微体系结构功能的一部分。

当前我正在使用fsqrt,但我想知道还有更好的东西。

理想情况下,该指令在以下标准上得分会很高:

  • 长时间等待
  • 稳定/固定延迟
  • 一个或几个微码(尤其是:未微码)
  • 尽可能少地使用uarch资源(加载/存储缓冲区,页面遍历器等)
  • 能够与自身链接(在延迟上)
  • 能够通过GP寄存器链接输入和输出
  • 不会干扰正常的OoO执行(除了消耗的ROB,RS等资源之外)

因此,fsqrt在大多​​数情况下都可以,但是等待时间并不长,并且似乎很难与GP规则链接。


[1尤其是在现代Intel x86上,如果它在AMD Zen *上也能很好地工作,则可以加分。

optimization x86 cpu-architecture micro-optimization microbenchmark
2个回答
2
投票

[vsqrtss可能比fsqrt更好一些,因为它至少满足了与GP寄存器的相对容易的链接(因为GP向量仅相距movd。]


1
投票

主流Intel CPU没有任何非常长的延迟单位整数指令。在所有ALU端口上都有用于1周期等待时间的整数ALU,在端口1上有3周期等待时间的流水线ALU。我认为AMD是相似的。

div / sqrt单元是唯一真正的高延迟ALU,但是整数div / idiv在Intel上是微编码的,所以是的,请使用FP,其中div / sqrt通常是单uup指令。

AMD的整数div / idiv是2 uop指令(大概写入2个输出),并具有与数据有关的延迟。

[此外,AMD Bulldozer / Piledriver(其中2个整数内核共享一个SIMD / FP单元)对于movd xmm, r32(10c 2 uops)和movd r32, xmm(8c 1 uop)具有很高的延迟。 Steamroller将其每个缩短1c。 Ryzen在任一方向上都有3个周期的1个单位。

在Intel上,往返XMM regs的[movd很便宜:具有1周期(Broadwell和更早版本)或2周期延迟(Skylake)的单uop。 (https://agner.org/optimize/


sqrtss具有固定的延迟时间(在IvB及更高版本上,除了可能具有非正规输入之外)。如果带整数的链仅涉及任意整数位模式的movd xmm, r32,则可能需要设置DAZ / FTZ以消除FP辅助的可能性。 NaN输入很好;不会导致SSE / AVX数学运算变慢,只有x87。

[其他CPU(Sandybridge和更早的版本,以及所有AMD)具有可变延迟sqrtss,因此您可能希望在那里控制起始位模式。

如果您想

使用sqrtsd获得比sqrtss高的每uop延迟,则同样如此

。即使在Skylake上,延迟仍然是可变的。 (15-16个周期)。

您可以假设延迟是输入位模式的纯函数

,因此每次以相同的输入启动sqrtss指令链将产生相同的延迟序列。或以0.01.0+infNaN作为开始输入,对于序列中的每个uop,您都会得到the same延迟。(简单输入,如1.0和0.0(输入和输出中的几个有效数字)可能以最低的延迟运行。sqrt(1.0)= 1.0和sqrt(0)= 0,所以它们是自持久的。对于sqrt相同(NaN)= NaN)

您可能会使用and reg, 0或其他不中断清零作为链的一部分来控制输入位模式

。或or reg, -1创建NaN。然后,您可以在Sandybridge或更早的版本以及包括Zen在内的AMD上获得固定的延迟。或者也许是pinsrw xmm0, eax, 7(对于Intel的端口5,为2 uops)仅修改XMM的高位qword,而将底部保留为已知的0.01.0。可能便宜得多,只需将and设为0并使用movd,除非5号端口的压力不是问题。


创建吞吐量瓶颈(不是延迟)

,您在Skylake上的最佳选择是vsqrtpd ymm-p0为1 uop,延迟= 15-16,吞吐量= 9-12。[在Broadwell和更早的版本上,这是3 oups(2p0 p15),但是我认为Skylake拓宽了SIMD分隔器(我想是为AVX512做准备)。
© www.soinside.com 2019 - 2024. All rights reserved.