计算机体系结构 28:SMT 与共享资源
计算机体系结构 28:SMT 与共享资源
核心问题
单线程因为依赖或 cache miss 暂时不能发射时,执行槽会空着。细粒度多线程可以每周期换一个线程,减少整段空闲;同时多线程(SMT)还能在同一周期从多个线程挑选指令填充多个槽。它提高的是共享资源利用率,不会自动增加执行单元、cache 容量或互联带宽。
本篇用宽度为 2 的有限发射模型区分三种调度。当前主机没有硬件 SMT、逻辑兄弟线程或 PMU 证据。
范围与证据等级
模型先给两个线程各一条包含 wait 的短指令流:单线程模式只运行 A,细粒度模式每拍只选一个线程,SMT 模式同拍可选 A、B。另有一组 load → alu → alu 的就绪等待实验,宽度仍为 2,但只有一个 load 端口。
证据等级是教学时序模型。它没有 ROB、cache、分支预测、物理寄存器、真实 NoC、线程优先级或公平性策略,因此只能解释“空槽怎样被另一线程利用”。
核心案例:发射宽度不等于可用吞吐
两个槽在某拍都空闲,不代表单线程一定能填满。若线程 A 的下一条指令等待前序结果,它不能凭空提供第二条就绪指令。线程 B 若有独立工作,SMT 调度器可以用 B 填其中一个槽。
逐周期发射轨迹得到:只运行 A 需要 4 拍;每拍只选一个线程、轮流选择 A/B 的细粒度交错需要 8 拍;允许同拍选择两个线程的 SMT 式发射需要 4 拍。这里的 wait 是占一个发射槽的标记指令,不模拟长延迟或暂停;没有延迟时,不应拿 5 拍的静态表代替调度结果。
第二组中,load 在第 1 拍发射后,该线程下一条指令最早第 4 拍就绪。A、B 单独运行各需 5 拍,顺序运行共 10 拍。一起运行时第 1 拍只有 A 的 load 占据唯一端口,B 虽已就绪仍因端口占用停顿;B 的 load 第 2 拍发射,第 3 拍两线程都在等结果;第 5 拍 A、B 的 alu 同拍发射。两线程合计 6 拍完成,比顺序运行少 4 拍,但 B 的最后一条比独自运行晚一拍。轨迹逐拍列出就绪集合、占用的端口、发射指令与停顿原因。
共享资源能限制填槽收益。这组端口争用还没有 cache 替换、互联排队、线程公平策略,更不能据此推断当前宿主的 SMT 加速比例。
片上互联怎样进入同一问题
核心数增加后,请求要经过 ring、mesh 或其他互联到达共享 cache、目录或内存控制器。路由跳数、链路容量和热点决定排队。SMT 在核心内部填发射槽,NoC 在核心之间搬运请求;两者共享“有限资源上的多来源竞争”这一结构,但模型参数不能混用。
模式:先写资源预算,再谈并发收益
把每拍槽位、每级队列、每条链路容量写出来,再问哪些请求能并行。这个方法可迁移到 GPU warp、DMA 队列和存储系统。没有资源预算的“增加并发”只是负载变化,不是性能解释。
验收结果
从仓库根目录运行 python3 examples/computer-architecture/run_batch.py 26-28,输出既保留 4/8/4 拍的简化标记案例,也记录独立的 5+5→6 拍就绪等待和端口争用案例;每拍停顿与占用均可检查,异常周期数导致非零退出。
有限模型展示跨线程填空槽如何隐藏部分等待,同时显示 B 因端口争用晚完成;简化的 wait 标记案例本身不模拟延迟。这里没有真机 SMT、逻辑兄弟线程或吞吐与干扰的 PMU 数据。
练习
若两个线程都只产生访存指令,而处理器每拍只有一个 load/store 端口,发射宽度为 2 是否还能让两条同时执行?
把模型改成线程 B 永远有就绪指令。若调度器总优先 B,需要增加什么规则才能讨论 A 的前进性?
模式速查
| 现象 | 首先核对 | 仍需的真机证据 |
|---|---|---|
| 空槽减少 | 每拍就绪集合与发射宽度 | 端口利用率、IPC |
| 两线程互相拖慢 | cache、队列、端口、带宽 | sibling 拓扑与 PMU |
| 核数增加后拥塞 | 路由与共享出口 | NoC/uncore 计数 |





