You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:30:06