两个可熔合指令对能否在同一时钟周期解码?i7-10700实测疑问
问题分析
1. 测试代码的核心缺陷
你编写的测试用例中,所有jge指令的跳转目标是紧随其后的下一条指令,对应汇编中的偏移量为0,属于无操作分支。你所用的i7-10700属于Comet Lake架构,是Skylake的14nm迭代版本,该架构的预解码器对这类特殊分支存在固定单周期惩罚,每遇到一个就会导致MITE通路流水线停顿1周期,直接限制了每周期只能处理1个熔合对。
你的测试中宏熔合功能本身是正常生效的,从性能计数器数据即可验证:总执行指令数35.5G,MITE通路递送的uop数17.79G,刚好2条指令对应1个uop,说明dec+jge确实被熔合为单个uop。
2. 测试代码修正方案
将所有跳转目标从当前指令的下一行移到整个测试代码段的末尾,避免出现偏移为0的无操作分支,参考代码如下:
ALIGN 32 ; 顺序写入8000个熔合对,跳转目标统一指向代码段末尾的退出逻辑 dec ecx jge .test_exit dec ecx jge .test_exit dec ecx jge .test_exit ; ... 重复8000次 .test_exit: ; 后续测试退出逻辑
测试时将ecx初始值设为负数,保证所有jge都不会触发跳转,顺序执行所有熔合对,即可消除无操作分支带来的预解码惩罚。
修正后你应该可以观测到r479 / r1002479的数值接近2,符合每周期送出两个熔合对的理论结果。Skylake架构的MITE通路单周期最多可递送4个uops,两个熔合对总长度仅8字节、对应2个指令边界,完全可以在单周期内完成递送,和Agner的相关结论没有冲突。
3. perf计数器使用验证
你所用的两个性能计数器在Comet Lake平台定义正确,没有用法错误:
r479对应IDQ.MITE_UOPS,统计MITE通路递送到指令解码队列(IDQ)的uop数量r1002479对应IDQ.MITE_CYCLES,统计MITE通路有uop递送的周期数
计数器读数是可信的,问题与perf工具使用无关。
内容的提问来源于stack exchange,提问作者moep0
相关产品推荐
相关产品推荐

