周末的餐厅后厨,主厨一声令下,切菜声、炒菜声、摆盘声此起彼伏。想提升出菜速度,餐厅有两种截然不同的思路:一种是多请几位厨师,让同一道菜的多个步骤在同一时刻分头进行——切菜的切菜、焯水的焯水、调汁的调汁;另一种是让厨师在等汤煮沸的空闲时间里,顺手把下一道菜的配菜切了。第一种像超标量处理器,靠“同一时刻多做几件事”提速;第二种像超线程,靠“空闲时不闲着”把时间缝隙填满。现代 CPU 就像一家同时用上两种策略的顶级后厨:既有多个执行单元并行开工(超标量),又能在一路工作等待内存时快速切换到另一路任务继续干活(超线程)。本文带你走进这家“数字厨房”,看看多发射如何挖掘指令级并行、线程切换如何带来线程级并行,以及两者如何博弈、融合、被工程实践驯服。
理解超标量与超线程,是读懂 CPU 性能指标(IPC、核心数、逻辑核数)和做性能调优的必修课。AI 推理与训练场景中,吞吐量与延迟的优化,往往就藏在这两种并行机制的缝隙里。
目录
可视化演示
上方展示超标量多发射单元并行执行指令,下方展示超线程双线程交替共享执行单元,粒子流动模拟指令执行,点击按钮切换对比视角
本节配有交互动效(进入视口后自动加载,约 3KB)。
超标量与超线程并行总览 超标量实现指令级并行ILP 超线程实现线程级并行TLP 超标量多发射单元并行执行 超线程共享执行单元交替切换 两种并行机制互补提升CPU吞吐率
超标量架构:请第二个厨师,同一道菜分头做
想象一家小面馆,只有一位厨师。他煮面、炒浇头、调汤底,一道一道按顺序来,哪怕旁边炉灶空着一个,也只能干等着。这就是“标量”处理器:每个时钟周期只取一条指令、执行一条指令,一条路走到黑,执行单元大量闲置。
超标量处理器则像请了两位、四位甚至更多厨师。每个周期,处理器同时取出多条指令,交给“指令调度器”判断哪些能放手并行,然后分发给多个执行单元同时开工。这个同时发射的条数叫“发射宽度”——等价于后厨同时开火的灶眼数。发射宽度越宽,理论上每个周期能塞进流水线的指令越多。
但发射宽度只是上限,能否真正发满,取决于两件事:一是程序里有没有足够多“互不干扰”的指令(即指令级并行,ILP),二是硬件有没有足够的执行单元。调度器每周期扫描指令窗口,把所有能同时执行的指令打包发射。最大的限制来自数据依赖:若指令 B 要读指令 A 刚写出的结果,B 只能等 A 算完,这种“写后读”也叫 RAW 依赖。
超标量的哲学是“人多力量大”:在一条指令流内部寻找可以并行的碎片。但程序员的指令流未必处处并行——当后厨只剩一个菜可做时,再多厨师也会闲下来。于是,硬件设计师想到了让“等菜”的时间也利用起来,这就是超线程。
- W(发射宽度)处理器每个周期最多能发射的指令条数,由取指、译码宽度共同决定,相当于开火灶眼数。
- E/U(执行单元配额)执行单元总数 E 除以每条指令平均占用的单元数 U,表示资源侧同时能跑多少条指令。
- min 取小发射能力再强,也要受可用执行资源限制,两者中较小者才是理论 IPC 上限。
超线程技术:等汤沸腾时,切下一道菜的葱
厨师做汤时常常要等水烧开,这段时间他闲着吗?当然不会,他会顺手把下一道菜的葱切好。单线程处理器的困境恰在于此:当一条访存指令发生缓存未命中(cache miss),处理器可能要空等几十甚至几百个周期,执行单元全部闲置,而菜谱仍然要求“按顺序来,不许抢跑”。
超线程(Intel 的 SMT 实现)打破了这个死规矩:它把一个物理核心伪装成两个“逻辑处理器”,操作系统一看“有两个核”,就能把两个线程同时丢进来。硬件上,程序计数器、寄存器文件等“线程身份信息”为每个线程各准备一份,而执行单元、缓存等贵重大件大家共享。当线程 A 的访存指令进入等待时,线程 B 的指令立刻从自己的程序计数器里取出来,填入原本空转的执行单元。
这个切换几乎零成本:因为两份状态一直驻留在硬件里,不像操作系统进程切换那样需要保存和恢复现场。它本质上是把“等待内存”这段死时间,变成另一个线程的“活时间”。收益上限与单线程中等待时间的占比直接相关。
超线程的收益取决于“等待时间占比”:等待越多,切换线程越划算。如果程序从不等待,比如纯 ALU 密集的循环,超线程不仅没提升,反而会因为两个线程抢发射槽和缓存而互相拖累。它的本质不是增加硬件算力,而是“把空闲填满”。
- p(等待占比)单线程运行中,处理器因访存、分支预测失败等原因空转的周期比例,相当于厨师等水开的时间占比。
- 分母 1-p(有效比例)单线程真正在干活的周期比例,是加速比公式的基线。
- 加速比 S超线程把等待周期让给另一线程,总耗时从 1 缩短为 1-p,所以理想加速为倒数。
并行机制对比:切菜法与上菜节奏
指令级并行像“一道菜里的多个步骤同时推进”:切肉的同时焯水、调汁的同时摆盘,所有动作都在同一道菜谱内完成。线程级并行则像“两桌客人各点各的菜”,后厨交替做着宫保鸡丁和番茄炒蛋,两道菜互不依赖,天然可以穿插进行。
从技术上区分:ILP 存在于单条指令流内部,由超标量的多发射和乱序执行来挖掘,依赖的是寄存器端口、旁路网络这类数据通路硬件;TLP 存在于多个线程或进程之间,由操作系统调度加上超线程、多核这类硬件来承载,依赖的是复制线程状态与调度器。超标量提取 ILP,超线程提取 TLP,两者挖的是不同层面的“并行矿”。
它们的关系是互补而非竞争。单线程程序并行度不高时,超标量的发射槽经常空着;此时把另一个线程塞进来,用 TLP 填补 ILP 留下的缝隙。反过来,每个线程内部若没有足够 ILP,超线程也只能干瞪眼——它不会凭空创造单线程内部的并行。两者叠加,才能把一个物理核心的吞吐榨干。
两类并行的成本结构也大不相同:多核是“再建一间完整厨房”,面积功耗成倍增加;超线程只是“给现有厨房加一本菜谱和一份操作台”,便宜得多。这也是现代 CPU 不约而同选择“超标量 + 超线程 + 适度多核”组合的根本原因。
- S_ILP(超标量加速)单线程程序中,靠多发射相对标量流水线获得的额外加速,通常为 2–4 倍。
- η(TLP 补充系数)第二线程填入空闲发射槽后,额外提升的吞吐比例,一般取值 10%–30%。
- 乘积关系两类并行机制作用于不同层面、互不排斥,总加速效果近似相乘。
硬件开销权衡:多请厨师的装修费
多请几位厨师不能只加人,还得加操作台、加灶眼、加传菜窗口,厨房面积得扩大。超标量处理器同理:发射宽度 W 一旦提高,寄存器堆的读写端口必须同步增加,否则“厨师们抢一个操作台”,多发射就是空谈。
寄存器堆相当于后厨的食材操作台。每个周期 W 条指令同时进入执行阶段,每条指令最多要读 3 个源操作数,意味着寄存器堆同一周期必须提供 W×3 次读操作。写回也一样,每周期最多 W 条指令同时写结果,写端口不得少于 W。端口数一旦不够,指令发射就会堵在“取操作数”这一步。
更隐蔽的成本来自旁路网络(bypass/forwarding network)。为了让上一条指令的结果直接“抄近路”喂给下一条,硬件必须在执行单元之间铺设大量直连数据线。发射宽度越大、执行单元越多,旁路网络就越复杂、连线越长、时钟频率和功耗压力越大。工业界因此普遍把发射宽度控制在 4–8,再往上收益陡降。相比之下,超线程的硬件开销“便宜”得多:每个逻辑处理器只需多一套寄存器文件和少量状态,几百万晶体管即可,远低于再加一个物理核心。
这就是为什么超标量不是“无脑堆宽度”:每加一个发射槽,背后都拖着多端口寄存器堆、复杂旁路网络和巨大的验证成本。硬件设计师的聪明之处在于:与其把昂贵的发射宽度加到 12,不如用便宜的 TLP 把现有 4–8 宽度的空闲槽填满。
- W×R(读端口下限)W 条指令同时发射,每条最多读 R 个源操作数,同一周期共需 W×R 次读访问。
- 写端口下限 W每周期最多 W 条指令同时写回结果,写端口数不能少于发射宽度。
- 端口与面积成本寄存器堆的硅片面积约与端口数的平方成正比,端口数翻倍,面积约翻四倍。
协同融合设计:一套后厨,两本菜谱,智能排班
顶级餐厅的厨房是什么样?两位厨师共用几个灶眼,手边摆着两本菜谱,还有一位聪明的排菜经理,哪道菜能先动工就做哪道。现代 CPU 正是如此:一个物理核心内部既有“多发射”的超标量宽度,又有“多线程”的超线程状态,再加一个指令调度器负责从两个线程的指令窗口里挑选可发射的指令。
工程实践上,Intel 与 AMD 的 x86 处理器普遍采用“每核 8 发射宽度 + 2 路超线程”,操作系统能看到双倍逻辑核,但物理执行资源只有一个核心的量。ARM 阵营则出现分化:Apple Silicon 倾向于超大发射宽度、不启用 SMT,而部分服务器 ARM 芯片选择 SMT 换取吞吐。这说明“要不要超线程”和“发射宽度做多大”是互相制约的设计决策。
协同的关键在于调度。硬件层面,指令调度器每个周期同时扫描两个线程的指令队列,哪边有可发射且无依赖的指令就发哪边;软件层面,现代操作系统能识别同一物理核的两个逻辑核“搭档”,优先把重负载线程分到不同物理核上,避免两个线程在同一个核内“抢菜”。即使如此,两个线程共享 L1 缓存、分支预测器和访存队列,冲突损失不可避免,这就是公式中的 δ。
这套协同设计的关键在于“硬件多发射 + 线程切换 + 软件调度”三层配合。只有硬件没有软件感知,超线程的逻辑核会被操作系统当成真核乱塞任务;只有软件没有硬件切换机制,空闲周期依然浪费。两者合璧,才让现代 CPU 既能单线程冲高主频,也能多线程扛起吞吐。
- IPC_A 与 IPC_B线程 A 和线程 B 各自独占核心时测得的 IPC,代表各自的“单打能力”。
- δ(共享冲突损失)两线程争抢 L1 缓存容量、访存带宽、分支预测器导致的互相干扰。
- 总吞吐估算SMT 模式下核心总 IPC 约等于两者之和减去冲突损失;当 δ 过大时,开启超线程甚至可能负优化。
性能工程实践:用 perf 给厨房算账
餐厅老板要评估“多请厨师”和“多线程排班”到底值不值,最直接的办法是统计每周期真正端出几道菜。处理器的对应指标叫 IPC(Instructions Per Cycle,每周期完成指令数)。标量处理器 IPC 约为 1;超标量处理器可达 1.5–4;加上超线程后,单核的总 IPC 还能再上浮。
Linux 下用 perf stat -e instructions,cycles 一条命令就能测出这两项数据,两者相除即 IPC。但要注意,IPC 是高度依赖负载的平均值:访存密集的程序把大量时间花在等内存上,IPC 通常很低;纯数学计算的循环几乎不等待,IPC 能逼近发射宽度。所以比较两台 CPU 的 IPC,必须在同一负载下才有意义。
工程优化的三板斧,本质都是让 IPC 更接近理论值。第一板斧提高 ILP:编译器做循环展开、指令重排,把无依赖的指令排到相邻位置,让调度器更好“打包”;AI 推理引擎里对矩阵乘做算子融合和向量化,也是同一思路。第二板斧提高 TLP:把任务拆成多个线程交给逻辑核,让超线程有的放矢;PyTorch 的 DataLoader 多进程加载数据就是典型。第三板斧压缩等待时间:数据预取、缓存友好的内存布局,直接把 p_等待 压下去,IPC 自然回升。
厨房的效率不看有几个厨师、几本菜谱,而是看每个周期真正端出几道菜。理解了 IPC、发射宽度、等待占比和硬件成本,才算真正读懂了 CPU 的性能账本——也才能在真实系统里做出“性价比最高”的优化决策。
- IPC 实测通过性能计数器统计总指令数和总周期数,两者相除得到平均值。
- IPC 理论由发射宽度与执行资源决定的上限,是硬件能力的“天花板”。
- 效率比值两者之比越接近 100%,说明流水线空闲越少;若只有 60%,就要从访存等待或 ILP 不足上找原因。
AI 应用场景
CPU 推理引擎的算子级优化
阶段:模型部署与推理优化
解决的问题:传统做法把每个算子当作黑盒单独调用,循环里充满分支和依赖停顿,超标量发射槽大量空置,IPC 常年徘徊在 1.2 左右。AI 编译框架通过循环展开、指令重排和算子融合,把无依赖的乘加指令排到相邻位置,让超标量的多个执行单元真正“同时开火”。
具体案例:TensorRT 在 Intel CPU 上优化 GEMM(通用矩阵乘)时,配合 AVX 向量化与指令调度,将 IPC 从 1.2 提升到 2.5 以上,单 batch 推理延迟下降约 30%。这就像后厨重新编排了切配顺序,让两位厨师同时忙起来。
深度学习训练的数据加载多线程
阶段:数据管道与训练
解决的问题:GPU 等数据时,CPU 负责图像解码、增强和归一化;若单线程执行,访存和磁盘读取的等待时间让 CPU 计算单元闲置,GPU 持续挨饿。利用超线程,把解码任务拆成多线程交给逻辑核,当一线程等磁盘数据时,另一线程的增强计算正好填满发射槽,让“等待”变成“干活”。
具体案例:PyTorch 训练 CV 模型时,DataLoader 的 num_workers 从 1 调整为 vCPU 数(物理核 × 2),图像解码与增强吞吐提升 20%–40%,GPU 利用率从 60% 升到 90% 以上。
云上推理服务的 CPU 选型
阶段:部署架构选型与成本优化
解决的问题:云厂商售卖的 vCPU 通常是超线程的逻辑核,选型时若不清楚“一个 vCPU 约等于半个物理核”,很容易误估算力。大模型推理属于内存带宽敏感型负载,两个逻辑核抢共享缓存反而拖慢单请求,此时关掉超线程更划算;而高并发小请求场景,超线程能把等待周期转化为吞吐。
具体案例:某推理服务将实例从“开启超线程的 8 vCPU”调整为“关闭超线程的 4 物理核”,单请求延迟降低 15%,吞吐持平,云账单下降 20%;另一高并发图像分类服务则保留超线程,吞吐提升 30%。
Python 演示
"""超标量与超线程并行机制对比模拟器""" INST = {"alu": 1, "mem": 2, "fp": 3} def run_scalar(insts): """标量处理器: 每周期只能执行一条指令""" cycles = 0 for op in insts: cycles += INST[op] return cycles def run_superscalar(insts, width=2): """超标量处理器: 每周期最多发射 width 条指令, 同一批次内取执行时间最长者作为该批耗时""" cycles = 0 i = 0 n = len(insts) while i < n: group_max = 0 for _ in range(width): if i < n: group_max = max(group_max, INST[insts[i]]) i += 1 cycles += group_max return cycles def run_hyperthread(inst_a, inst_b): """超线程模拟: 两个线程共享发射槽, 任一线程访存等待时, 另一线程趁机占用空闲资源""" i = j = cycles = 0 na, nb = len(inst_a), len(inst_b) while i < na or j < nb: a_wait = (i < na and inst_a[i] == "mem") b_wait = (j < nb and inst_b[j] == "mem") if a_wait and b_wait: cycles += 1 i += 1 j += 1 elif a_wait: cycles += 1 i += 1 if j < nb: j += 1 elif b_wait: cycles += 1 j += 1 if i < na: i += 1 else: if i < na: i += 1 if j < nb: j += 1 cycles += 1 return cycles def main(): insts = ["alu", "alu", "mem"] * 4 + ["alu", "fp"] scalar = run_scalar(insts) super_ = run_superscalar(insts, width=2) thread_a = ["alu", "alu", "mem", "alu", "alu", "mem"] thread_b = ["alu", "mem", "alu", "alu", "mem", "alu"] ht = run_hyperthread(thread_a, thread_b) total = len(thread_a) + len(thread_b) print("指令流: ", insts) print("标量执行: %d 周期, IPC = %.2f" % (scalar, len(insts) / scalar)) print("超标量执行: %d 周期, IPC = %.2f" % (super_, len(insts) / super_)) print("超线程执行: %d 条指令, %d 周期, IPC = %.2f" % (total, ht, total / ht)) if __name__ == "__main__": main()
INST = {"alu": 1, "mem": 2, "fp": 3}定义每类指令的执行周期数,访存比普通运算贵一倍。def run_superscalar(insts, width=2):模拟每周期最多发射 width 条指令的超标量核心。group_max = max(group_max, INST[insts[i]])同一批发射的指令以最长执行时间为该批耗时,模拟资源并行但受限于最慢路径。def run_hyperthread(inst_a, inst_b):模拟两个线程共享发射槽的超线程模式。a_wait = (i < na and inst_a[i] == "mem")检测线程 A 是否处于访存等待,这是触发线程切换的信号。elif a_wait:当 A 等待时,B 线程的指令趁虚而入,复用空闲的执行单元。cycles += 1每个时钟周期收尾,记录一个周期流逝。print("超线程执行: %d 条指令, %d 周期, IPC = %.2f" % (total, ht, total / ht))输出总周期数与 IPC,直观对比三种机制的吞吐。
常见误区
误区既然操作系统里看到两个逻辑处理器,那超线程是不是就等于把单核变成了双核?两个核能跑的性能,超线程也能跑出来。
正解不是。超线程只是复制了程序计数器、寄存器文件等“线程身份信息”,执行单元、发射槽、缓存大件仍然是共享的一份。它相当于同一个厨师同时看两本菜谱,做菜速度不会翻倍,只是把等水开的空闲用了起来。实测中,一个物理核的两个逻辑核,合起来性能通常只有两个真核的 50%–70%。
为何常见:操作系统和任务管理器都显示“核心数翻倍”,消费者极易把逻辑核误当物理核,尤其云厂商的 vCPU 就是逻辑核,容易高估算力。
误区超标量不就是每周期发射的指令越多越好吗?把发射宽度从 4 做到 16,IPC 不就翻四倍了?
正解发射宽度只是理论天花板,实际 IPC 还受 ILP 限制、寄存器端口瓶颈和旁路网络复杂度制约。寄存器堆面积随端口数近似平方增长,旁路连线越来越长,时钟频率反而会被拖低。这就像灶眼加到二十个,但操作台和传菜通道跟不上,厨师们只能在原地打转。工业界主流发射宽度停在 4–8,正是成本收益权衡的结果。
为何常见:单看“每周期发射几条”的宣传数字非常直观,而端口、旁路、功耗这些隐形成本不写进广告,容易让人误以为宽度是免费午餐。
误区BIOS 里打开超线程,所有程序都会变快,反正“多一个核不吃亏”。
正解超线程的收益依赖“等待占比 p”。若程序是纯计算密集、几乎不访存等待,两个线程只会抢发射槽和 L1 缓存,总吞吐可能不变甚至下降,单线程延迟反而变差。HPC 和数据库领域经常主动关闭超线程,就是为了避免共享资源冲突。它适合访存密集、线程间资源互补的负载,而不是万能加速器。
为何常见:厂商宣传“超线程提升 15%–30%”时,隐含前提是典型办公与网页负载;一旦切换为 HPC、AI 训练这类资源竞争剧烈的场景,结论就会反转。
误区都说超标量处理器能“同时做多件事”,那它一定也是乱序执行,两个词是一回事。
正解两个概念分属不同维度。超标量解决“一个周期发几条”的宽度问题,乱序执行解决“发射顺序能否打破程序顺序”的调度问题。早期 RISC 超标量处理器就是顺序发射的,只是同时发多条;现代处理器通常两者兼有,但理论上完全可以在超标量里做顺序发射。好比厨房里可以“两个灶同时炒”,但不代表“可以不按菜谱顺序上菜”。
为何常见:教科书和博客常把“多发射”和“乱序”并列介绍,读者容易把它们当作同一种技术的两个别名。
面试题
Q1. 超标量处理器最主要的特征是____。
- A.拥有多个物理核心
- B.每个周期发射多条指令← 正确答案
- C.主频高于同代产品
- D.使用更先进的制程工艺
答案:B。超标量的核心是在一个物理核心内设置多个执行单元和发射槽,每个周期同时发射多条指令来挖掘指令级并行。多个物理核心属于多核并行,主频和制程与超标量没有必然关系。
Q2. 关于超线程(Intel SMT)的正确描述是____。
- A.增加物理核心数量
- B.将核心频率提升一倍
- C.一个物理核心呈现为多个逻辑处理器← 正确答案
- D.必须关闭缓存才能启用
答案:C。超线程不增加物理核心,而是为每个线程复制程序计数器与寄存器文件,让操作系统看到一个物理核对应多个逻辑处理器。执行单元和缓存仍是共享的,切换线程是为了填补等待内存时的空闲周期。
Q3. 超标量处理器正常工作需要以下哪些硬件支持?____
- A.多端口寄存器堆← 正确答案
- B.指令调度器← 正确答案
- C.旁路网络← 正确答案
- D.更大的机械硬盘
答案:ABC。多发射要求寄存器堆能同时读出多条指令的源操作数,调度器负责挑选无依赖指令成组发射,旁路网络把执行结果直接转发给后续指令。硬盘容量与超标量发射机制无关。
Q4. 两条指令存在 RAW(写后读)数据依赖时,它们____。
- A.可以同一周期发射且结果正确
- B.后一条必须等前一条算出结果← 正确答案
- C.处理器会永久丢弃其中一条
- D.只会影响功耗不影响性能
答案:B。RAW 依赖即第二条指令要读第一条刚写出的结果,若同一周期发射,第二条会读到旧值。指令调度器只能将后者延后发射,或利用旁路网络把结果“抄近路”送给后者,这也是旁路网络存在的意义。
Q5. 超线程提升性能的机理包括____。
- A.隐藏访存延迟← 正确答案
- B.复用空闲的执行单元← 正确答案
- C.增加物理缓存容量
- D.提高共享资源的利用率← 正确答案
答案:ABD。超线程的本质是当一线程访存停顿、发射槽空置时,让另一线程补位,从而隐藏延迟、提高执行单元和发射槽的利用率。它不新增物理缓存,反而会加剧线程间的缓存竞争。
Q6. 设计一个发射宽度为 4、每条指令最多读 3 个源操作数的超标量处理器,寄存器堆至少需要多少个读端口?____
- A.4
- B.7
- C.12← 正确答案
- D.3
答案:C。读端口数 ≥ 发射宽度 × 每条指令读操作数 = 4 × 3 = 12。如果端口不足,同一周期就无法为 4 条指令同时提供操作数,发射宽度便形同虚设。而端口增多会让寄存器堆面积与功耗近似平方级增长。
Q7. 某程序运行测得指令数 24 亿、周期数 12 亿,IPC 是多少?____
- A.0.5
- B.1
- C.2← 正确答案
- D.12
答案:C。IPC = 指令数 ÷ 周期数 = 24 ÷ 12 = 2,表示每个时钟周期平均完成 2 条指令,说明超标量多发射机制正在发挥作用。若 IPC 接近发射宽度,说明流水线利用率很高。
Q8. 超线程可能带来的负面效应包括____。
- A.共享缓存冲突导致单线程变慢← 正确答案
- B.整体功耗上升← 正确答案
- C.物理核心数量减少
- D.两个逻辑核抢占发射槽← 正确答案
答案:ABD。两个线程共享 L1 缓存、访存队列和发射带宽,可能互相拖累,导致单线程性能下降;额外的线程状态与多路逻辑也带来功耗开销。超线程不改变物理核心数量,只是复制线程状态。
Q9. 与超线程相比,多核技术的本质区别是____。
- A.多核复制完整的处理器核心← 正确答案
- B.多核大幅提高主频
- C.多核共享同一套执行单元
- D.多核只能运行一个操作系统
答案:A。多核是在芯片上放置多个完整的物理核心,每个核心有自己的取指、译码、执行和缓存资源,面积功耗开销大但并行能力强。超线程则在一个核心内复制线程身份信息,两者属于不同层级的并行手段。
Q10. 以下哪些手段能提高程序在超标量处理器上的 IPC?____
- A.编译器循环展开减少依赖停顿← 正确答案
- B.数据预取降低访存等待← 正确答案
- C.增加物理核心数量
- D.将可并发计算拆成多线程交给超线程← 正确答案
答案:ABD。循环展开和指令重排能提高 ILP,让更多无依赖指令同时发射;数据预取压缩等待周期,直接抬升 IPC;多线程化让超线程用 TLP 填补剩余空槽。增加物理核心数只提升整体吞吐,不改变单核 IPC。