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

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

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

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

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

答案1

手册 英特尔超线程技术技术用户指南包含了一些关于为什么英特尔没有在其消费级 CPU 中尝试每个核心超过两个线程(而它在一些服务器 CPU 中确实这样做了)的提示。

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

每个逻辑处理器

  • 拥有自己的建筑状态
  • 同时执行自己的代码流
  • 可以独立中断和停止

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

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

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

英特尔已量化线程带来的平均性能提升,如下所示:

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

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

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

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

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

答案2

此讨论已在ServerFault SE:超线程应该使用多少个 CPU?

何时有两个不同的线程会导致一个线程运行得更差?

虽然指令之间的依赖关系不会改变,但一个新的问题出现了——竞赛这些不同的线程在缓存利用率和带宽方面竞争内存访问,这有点适得其反。

逻辑核心不能做太多事情,但它确实提供了一点增强的并行性。它远非真正的核心。事实上,它提供的性能约为真实物理核心的 30%。

其目的只是在 I/O 密集型(非 CPU 密集型)进程占主导地位的世界中提高并行性。当 CPU 密集型(CPU 密集型)线程切换到其中一个核心时,其性能将大幅下降。

现在想象一下这样的线程在多个逻辑核心之间来回移动的场景,这可能会降低性能。

来源:超线程带来的危害

答案3

为什么不是 3 或 4 个线程?或者 8 个?收益递减。Sun 为每个核心设计了 8 个线程,对于需要多线程但不需要高性能的东西来说,它工作得很好,但你会注意到时钟速度比同时期的英特尔芯片低得多。复制核心的部分以获得更多线程会导致额外的热量积聚。Sun 和现在的 Oracle 的较新芯片能够动态关闭给定核心上的部分或所有其他线程,从而为单线程任务提供高性能。

相关内容