指令表中缺少延迟

时间:2019-08-28 16:49:42

标签: assembly x86 micro-optimization

我目前正在查看Agner Fog的instruction tables,以了解常见指令的时延。

我希望我不会在文档中错过这个问题的答案,但是有人可以向我解释为什么对于某些说明没有延迟输入吗?

例如,对于Skylake,操作数为r,r,m的PEXT指令的等待时间为空吗?

对于丢失的等待时间有什么解释?为什么很难首先获得等待时间(如果是这种情况)?

1 个答案:

答案 0 :(得分:3)

IDK为什么Agner在电子表格中将某些单元格留空。我认为这些都是手工输入的,因为至少有一些相当明显的错别字,例如使用5而不是0.5可以达到某些吞吐量(内存源vinserti128或其他东西,IIRC)。

解释是,除了您通常可以从CPU的工作方式推断出的信息之外,还有 zero 信息。即通常有一个单独的负载uop来为ALU uop供电,并且通常与寄存器源中的alu uop相同。但是某些指令可以使用广播负载,例如具有内存源移位计数(所有元素均较低的元素)的Skylake vpsrld似乎使用广播负载uop而不是通常的ALU shuffle来提供可变移位uop(例如vpsrlvd 1 uop for p01)。

对于具有多个输入的多uu指令,Agner仍然仅列出1个延迟编号。这还不完整。有时第一个uop只需一个输入,因此a -> result> b -> result的延迟。例如他将vpsrld(SKL上p01 p5为2微秒)列为1c吞吐量/ 1c延迟。对于两个输入结果均为1c显然是不可能的。据推测,Agner测量了数据输入->输出等待时间,并在关键路径之外广播了移位计数。 (我从p5的唯一事实是推断它是p5:随机播放端口。而且SKL具有1个uop可变计数移位。并且不需要从内存中获取移位计数。显而易见,结论是这是广播改组或加载。)


要获取更完整的延迟数据,请参见https://www.uops.info/table.html

它有a full latency breakdown for pext r64, r64, m64

  
      
  • 测量:延迟:      
        
    • 延迟操作数2→1:3
    •   
    • 延迟操作数3→1(地址):8
    •   
    • 延迟操作数3→1(内存):≤7
    •   
  •   

到目前为止,它们主要只有Intel CPU(还有Zen),但是数据来自自动测试,并分别测试每个输入到每个输出。并列出IACA数据。 对于每种说明的每种形式,都有一个指向其详细测试结果的链接。

此外,对于多uu指令的uop分解,他们也要格外小心,例如movbe r64, m64不是2p0156 + p23,而是p06 p15 p23(就像bswap r64,Agner确实正确)。