x86_64 Haswell架构中add指令为何被调度至已占用端口而非空闲端口
Haswell微架构循环初始阶段指令调度疑问分析
目标循环代码
lp: vpaddq ymm0, ymm1 vpaddq ymm3, ymm4 add rbx, rax add rcx, rax vpaddq ymm1, ymm2 vpaddq ymm4, ymm5 sub rax, 0xA jge lp
问题描述
该循环针对Haswell微架构的理论最优性能为2周期/迭代,且最终能达成这一性能。但在初始调度阶段,轨迹显示add rcx, rax被调度至仍被vpaddq ymm0, ymm1占用的port5,而非当时空闲的port0,请问这一现象的原因是什么?
原因解析
这是Haswell乱序执行引擎的初始窗口填充逻辑导致的:
- Haswell的AVX2
vpaddq指令可在port0、port1、port5执行,整数add指令也可在这三个端口执行。循环启动的初始阶段,乱序执行窗口尚未填满,调度器没有足够的指令上下文做全局最优端口分配,会优先按指令流顺序尝试分发。 - 调度器并非只看端口的当前周期占用状态,而是会预判端口的空闲时间。
vpaddq ymm0, ymm1分配到port5后,执行延迟仅1周期,port5在下一周期就会空闲;此时add rbx, rax可能已占用port0,后续的add rcx, rax按顺序分发时,调度器会选择能处理整数加法的port5——因为它能刚好衔接port5的空闲时间,不会产生额外等待。 - 当循环进入稳定迭代阶段后,乱序窗口被完全填满,调度器拥有足够的指令上下文进行全局端口调度,此时会将指令均匀分配到空闲端口,从而达成2周期/迭代的最优性能。
内容的提问来源于stack exchange,提问作者sarvel
相关产品推荐
相关产品推荐

