我一直认为,不必执行用于杀死依赖项的指令,例如xor reg, reg
,并且只要重命名器将它们移动到Re-order Buffer,就可以退出。
我只是用事件uops_issued.any
测量了进入RS的微操作的数量,并对这个数字感到惊讶。在perf事件中考虑了所有用于killing依赖关系的xor reg, reg
。
为什么不把杀人依赖放在ROB身上,而不无谓地干扰预订站?
他们没有,但AFAIK没有未融合的域前端计数器。如果您没有分支预测失误导致uop在发布后/执行前从RS中丢弃,那么在管道中的哪个位置进行计数并不重要,因此有一个解决方法。
若要计算RS uop,请使用uops_executed.thread
,它计算已成功(?(执行的uop。我还没有检查急切调度的uops的回放是否在每次尝试调度时都计数为uops_executed
,或者仅在uops_dispatched_port.port_[0..7]
。
请参阅Can x86';s MOV真的是";免费";?为什么可以';我根本不复制这个吗?例如,使用perf
来排序已消除域与未消除域,以及前端融合域与后端未融合域。
我只是用事件
uops_issued.any
测量进入RS的微操作数量
该事件统计发布到ROB的融合域uop。对于合并到RAX的下半部分的微融合uop(如add eax, [rdi]
或mov al, [rsi]
(,它计数1(即使这些计数为2个uops_executed(,对于消除的uop,如mov reg,reg
和xor same,same
,它计数为1(0个uops_Executted(。
perf list
(在Skylake上(确实误导性地描述了它,所以这种困惑是可以理解的。
uops_issued.any
[资源分配表(RAT(向保留发布的操作站点(RS(]
我一直认为,不必执行用于杀死依赖项的指令,例如xor reg、reg,并且只要重命名器将它们移动到Re-order Buffer,就可以退出。
是的,我也这么认为,他们进入标记为已执行的ROB,不要触摸RS。
只有Sandybridge家族这样做(包括Skylake/IceLake(;其他微体系结构(如Zen AFAIK(确实需要一个后端uop来实际写入零。在x86程序集中,将寄存器设置为零的最佳方法是什么:xor、mov或and?
AMD确实对矢量移动(自推土机以来(和GP整数移动(自Zen以来(进行mov消除,所以这些移动可能像Intel xor归零或mov
一样处理。
对Sandybridge上的机制的一种猜测是,(GP整数或XMM/YMM寄存器的(xor归零重命名为内部零寄存器。http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/测试了这个和它的xor归零指令不会消耗额外的PRF条目来写入目标寄存器。