Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 指令表中缺少延迟_Assembly_X86_Micro Optimization - Fatal编程技术网

Assembly 指令表中缺少延迟

Assembly 指令表中缺少延迟,assembly,x86,micro-optimization,Assembly,X86,Micro Optimization,我目前正在研究Agner Fog,以了解常见指令的延迟 我希望我没有在文档中错过这个问题的答案,但是有人能向我解释为什么对于一些说明,没有延迟条目吗 例如,对于Skylake,带有操作数r、r、m的PEXT指令的延迟为空 对于丢失的延迟有什么解释?为什么首先很难获得延迟(如果是这样的话)?IDK为什么Agner在他的电子表格中留下一些空白单元格。我认为这些都是手工输入的,因为至少有两个相当清楚的输入错误,例如,对于某个吞吐量(内存源vinserti128或某个IIRC),输入的是5,而不是0.5

我目前正在研究Agner Fog,以了解常见指令的延迟

我希望我没有在文档中错过这个问题的答案,但是有人能向我解释为什么对于一些说明,没有延迟条目吗

例如,对于Skylake,带有操作数r、r、m的PEXT指令的延迟为空


对于丢失的延迟有什么解释?为什么首先很难获得延迟(如果是这样的话)?

IDK为什么Agner在他的电子表格中留下一些空白单元格。我认为这些都是手工输入的,因为至少有两个相当清楚的输入错误,例如,对于某个吞吐量(内存源vinserti128或某个IIRC),输入的是
5
,而不是
0.5

这种解释是,除了从CPU通常的工作方式可以推断出的信息之外,没有其他信息。i、 e.通常有一个单独的加载uop供给ALU uop,它通常与寄存器源的ALU uop相同。但有些指令可以使用广播加载,例如,Skylake
vpsrld
和内存源移位计数(低元素适用于所有)看起来像是使用广播加载uop而不是通常的ALU shuffle来馈送可变移位uop(如p01的
vpsrlvd
1 uop)

对于具有多个输入的多uop指令,Agner仍然只列出1个延迟数。这不是一个完整的画面;有时,第一个uop只需要一个输入,因此
a->result
b->result
的延迟。e、 g.他将
vpsrld
(SKL上p01 p5的2个UOP)列为1c吞吐量/1c延迟。显然,这两种输入都不可能同时产生结果。据推测,Agner测量了数据输入->输出延迟,而移位计数的广播运行在关键路径之外。(我从只有p5的事实推断p5 uop在做什么:洗牌端口。SKL有1个uop变量计数移位。从内存中的移位计数不需要它。显而易见的结论是它是广播洗牌或加载。)


要获取更完整的延迟数据,请参阅

它有:

  • 测量:延迟:
    • 延迟操作数2→ 1:3
    • 延迟操作数3→ 1(地址):8
    • 延迟操作数3→ 1(内存):≤七,
到目前为止,他们主要只有Intel CPU(还有Zen),但数据来自自动测试,并分别测试每个输入到每个输出。并列出了IACA数据对于每个指令的每种形式,都有一个指向详细测试结果的链接。

此外,他们对多uop指令的uop细分更为谨慎,例如,
movbe r64,m64
不是2p0156+p23,而是p06 p15 p23(如
bswap r64
,Agner确实正确)