超线程与超标量执行

Adm*_*ama 5 cpu hyperthreading superscalar

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

为什么 CPU 真正可以并行执行的软件线程数通常由它拥有的逻辑内核(即所谓的硬件线程)数决定,而不是它拥有的执行单元总数?
如果我的理解是正确的,SMT 实际上并没有实现真正的并行执行,它只是通过复制 CPU 的某些部分(那些存储架构状态,但不是主要执行资源的部分)来使上下文切换更快/更有效。另一方面,超标量架构允许每个时钟周期真正同时执行多条指令,因为 CPU 具有多个执行单元,即多个并行流水线,每个流水线都可以以真正的并行方式处理单独的线程。

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

Mar*_*oom 2

您不能只是将指令猛烈地输入执行单元。
如果您想要两个 2 路 SMT,则需要保留两个架构状态并获取两个指令流。

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

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

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

但如果一切都失败并且没有使用欧盟,那么这个可能的工作单元就被浪费了。