LLVM-MCA中首条vhaddps指令无法在第二周期执行的原因探究
LLVM MCA指令执行延迟疑问解答
指令序列
vmulps %xmm0, %xmm1, %xmm2 vhaddps %xmm2, %xmm2, %xmm3 vhaddps %xmm3, %xmm3, %xmm4
3次迭代模拟状态转换
[0,0] DeeER. . . vmulps %xmm0, %xmm1, %xmm2 [0,1] D==eeeER . . vhaddps %xmm2, %xmm2, %xmm3 [0,2] .D====eeeER . vhaddps %xmm3, %xmm3, %xmm4 [1,0] .DeeE-----R . vmulps %xmm0, %xmm1, %xmm2 [1,1] . D=eeeE---R . vhaddps %xmm2, %xmm2, %xmm3 [1,2] . D====eeeER . vhaddps %xmm3, %xmm3, %xmm4 [2,0] . DeeE-----R . vmulps %xmm0, %xmm1, %xmm2 [2,1] . D====eeeER . vhaddps %xmm2, %xmm2, %xmm3 [2,2] . D======eeeER vhaddps %xmm3, %xmm3, %xmm4
状态说明:
D:指令分发e:执行中E:执行结束R:指令提交=:已分发等待执行-:等待提交
问题解析
你忽略了真数据依赖:第一条vhaddps的源操作数是%xmm2,而%xmm2正是前一条vmulps的目标寄存器。
虽然乘法和加法使用的执行单元(JFPM/JFPU1 vs JFPA/JFPU0)完全独立,但vhaddps要开始执行,必须等到vmulps把计算结果写入%xmm2之后——这是硬数据依赖,和执行单元是否空闲无关。
从状态序列看:
vmulps的执行周期是2个(ee),直到第三个周期才到达E(执行结束,数据写回寄存器堆)。- 第一条
vhaddps虽然在第0周期就完成了分发(D),但必须等到vmulps完成数据写回,也就是第2周期之后才能进入执行阶段(eee),所以中间出现了两个=等待状态。
内容的提问来源于stack exchange,提问作者fabian
相关产品推荐
相关产品推荐

