超线程与超标量执行

Hyperthreading vs. Superscalar execution

想象一个 CPU(或核心)是超标量(多个执行单元)并且还具有超线程 (SMT) 支持。

为什么 CPU 可以真正并行执行的软件线程数通常由它拥有的逻辑核心(即所谓的硬件线程)的数量给出,而不是执行单元的总数它有?
如果我的理解是正确的,SMT 实际上并没有启用真正的并行执行,它只是通过复制 CPU 的某些部分(那些存储架构状态,但不主要执行资源)。另一方面,超标量架构允许每个时钟周期真正同时执行多条指令,因为 CPU 有多个执行单元,即多个并行管道,每个管道可以以真正的并行方式处理一个单独的线程。

那么比如说一个CPU有2个核心,每个核心有2个执行单元,它的硬件并发数(真正能够并行执行的线程数)不应该是4个吗?为什么它的硬件并发不是由逻辑内核的数量给出,而 SMT 实际上并没有启用真正的并行执行?

你不能只是将指令猛击到执行单元中。
如果你想要两个 2-way SMT,你需要保持两个架构状态并获取两个指令流。

如果一家公司有 100 名开发人员,但只有两名项目经理,那么它只能并行开发两个项目(但如果让 PM 每天左右切换项目,它可以 concurrently 开发更多项目)。

如果 CPU 只能从两个指令流中获取(只保留两个线程上下文),您可以只为其分配两个线程以并行执行。
但是,您可以进行时间划分并同时执行更多线程。

软件无法访问执行单元,这会产生循环论证(软件需要EU执行,而EU需要软件执行)。
CPU 将尝试尽可能多地使用 EU,利用乱序并进行任何可能的推测。
实际上,超线程只是一种让所有资源保持忙碌的方式(就像在他们无事可做时与另一个 PM 共享一个开发人员)。

但如果全部失败并且未使用 EU,那么该可能的工作单元就完全浪费了。