为什么超线程提供 2 个虚拟内核而不是更多?

A.L*_*A.L 10 hyper-threading cpu-architecture

以下是维基百科上对超线程的解释:

对于物理上存在的每个处理器内核,操作系统寻址两个虚拟(逻辑)内核并在可能的情况下在它们之间共享工作负载。

我想知道为什么我们没有为每个物理核心提供 3 或 4 个逻辑核心的超线程?

har*_*ymc 9

手册 Intel Hyper-Threading Technology Technical User's Guide包含一些提示,说明为什么 Intel 没有尝试在其消费 CPU 中每个内核超过两个线程,而在某些服务器 CPU 中确实这样做了。

在解释超线程技术时,它说:

每个逻辑处理器

  • 有自己的架构状态
  • 并发执行自己的代码流
  • 可以独立中断和停止

两个逻辑处理器共享相同的

  • 执行引擎和缓存
  • 固件和系统总线接口

重要的部分是两个逻辑处理器共享同一个执行引擎,这意味着构成核心的单元不会重复。例如,运算单元一旦被一个线程使用,就不能被另一个线程使用。这可以防止完全并行,因此不允许两个线程并行执行相同类型的指令 - 一个必须等​​待另一个完成。

英特尔量化了线程的平均性能增益如下:

在执行多线程操作系统和应用程序代码时,采用超线程技术的处理器与没有超线程技术的同类英特尔架构处理器相比,性能可提高 30%。

因此,两个线程相对于一个线程的统计增益仅为 30% 左右,这与如果同一内核上的两个线程可以完成一个线程两倍的工作时所期望的 100% 相去甚远。

因此,我估计如果英特尔在核心上启用三个线程,统计增益会低得多,可能在 10% 或更少的数量级。

考虑到每个线程需要复制一些硬件,即架构状态和中断逻辑,这种额外的硬件会增加内核价格的成本可能不值得。

为了实现有效的超线程,英特尔必须增加每个内核内相同类型的单元数量。它在Haswell 微体系结构中做到了这一点, 它有 4 个用于加载/存储的端口,4 个用于整数,2 个用于分支,因此即使两个线程运行相同的整数工作负载也可能不会引起太多争用。然而,英特尔仍然保持每个内核两个超线程的模型,我猜可能是为了节省允许更多超线程所需的硬件,或者甚至可能是因为现代操作系统实际上无法有效地使用这样的建筑学。