计算机体系结构 28:SMT 与共享资源

核心问题

单线程因为依赖或 cache miss 暂时不能发射时,执行槽会空着。细粒度多线程可以每周期换一个线程,减少整段空闲;同时多线程(SMT)还能在同一周期从多个线程挑选指令填充多个槽。它提高的是共享资源利用率,不会自动增加执行单元、cache 容量或互联带宽。

本篇用宽度为 2 的有限发射模型区分三种调度。当前主机没有硬件 SMT、逻辑兄弟线程或 PMU 证据。

附件:28-smt.json。

范围与证据等级

模型给两个线程各一条短指令流,其中包含 wait。单线程模式只运行 A;细粒度模式每拍只能从一个线程发射;SMT 模式允许同拍从 A、B 各取一条,但总发射宽度仍为 2。

证据等级是教学时序模型。它没有 ROB、cache、分支预测、物理寄存器、真实 NoC、线程优先级或公平性策略,因此只能解释“空槽怎样被另一线程利用”。

核心案例:发射宽度不等于可用吞吐

两个槽在某拍都空闲,不代表单线程一定能填满。若线程 A 的下一条指令等待前序结果,它不能凭空提供第二条就绪指令。线程 B 若有独立工作,SMT 调度器可以用 B 填其中一个槽。

本模型得到:只运行 A 需要 4 拍;每拍只选一个线程的细粒度交错需要 8 拍;允许同拍选择两个线程的 SMT 式发射需要 5 拍。数字只属于这两条固定指令流和当前调度规则。

共享资源也会反向限制收益。两个线程若同时争用同一 load/store 单元、cache 端口或互联出口,SMT 只能改变等待分布,不能越过资源容量。对单线程而言,另一个线程还可能驱逐其 cache 和预测器状态。

片上互联怎样进入同一问题

核心数增加后,请求要经过 ring、mesh 或其他互联到达共享 cache、目录或内存控制器。路由跳数、链路容量和热点决定排队。SMT 在核心内部填发射槽,NoC 在核心之间搬运请求;两者共享“有限资源上的多来源竞争”这一结构,但模型参数不能混用。

模式:先写资源预算,再谈并发收益

把每拍槽位、每级队列、每条链路容量写出来,再问哪些请求能并行。这个方法可迁移到 GPU warp、DMA 队列和存储系统。没有资源预算的“增加并发”只是负载变化,不是性能解释。

验收结果

运行 python3 examples/computer-architecture/run_batch.py 26-28 后,输出记录 issue_width=2、三种模式的周期数和 not_a_host_smt_measurement=true。

验收结论是:有限模型展示 SMT 可以跨线程填空槽,也展示总发射宽度仍是硬上限。它没有证明当前 CPU 启用了 SMT,没有识别逻辑兄弟线程,也没有提供吞吐提升或相互干扰的真机数据。

练习

若两个线程都只产生访存指令,而处理器每拍只有一个 load/store 端口,发射宽度为 2 是否还能让两条同时执行?

把模型改成线程 B 永远有就绪指令。若调度器总优先 B,需要增加什么规则才能讨论 A 的前进性?

模式速查

现象 首先核对 仍需的真机证据
空槽减少 每拍就绪集合与发射宽度 端口利用率、IPC
两线程互相拖慢 cache、队列、端口、带宽 sibling 拓扑与 PMU
核数增加后拥塞 路由与共享出口 NoC/uncore 计数

一手参考资料