首页 > 解决方案 > 在超线程 CPU 上运行第二个线程是否会在整个管道中引入额外的开销?

问题描述

有一个关于超线程 Xeon 机器的讨论。我对超线程如何工作的(肤浅的)理解是 CPU 在物理上多路复用来自两个“线程”的指令。也就是说,执行单元是共享的,但是有两个不同的架构集(寄存器集、指令队列,甚至可能是分支预测器等)——每个线程一个。执行单元及其缓冲区/队列始终准备好接收新指令/数据,从这个角度来看,禁用其中一个线程而不是保留两个线程没有任何优势。

我的同事暗示,通过关闭超线程,我们可以实现加速,因为运行单个线程的 CPU 不再需要“查看”其他线程是否也有一些工作要做。我的理解是,所有这些电路都已经硬连线以复用来自两个线程的传入数据/指令,并且禁用超线程只会关闭其中一个线程,不允许它接收任何指令/数据,但实际上没有什么不同。这是超线程如何工作的一个很好的心理模型吗?

我确实理解有许多因素在起作用,例如内存工作集、共享缓存的问题等,这可能会影响 2 线程超线程 CPU 与禁用超线程的相同 CPU 的表现,但我的问题更直接地指向是否禁用超线程以某种方式使通过管道的整个数据/指令流更快?例如,在尝试填充后端头部的缓冲区时是否会出现争用问题?

我同事的解释也不知何故包括了管理程序,但我看不到两者之间的关系?它们似乎是正交的概念。

谢谢!

标签: performancex86cpu-architecturehyperthreading

解决方案


对,超线程通过在前端阶段和流水线的退休阶段复用每个线程的指令流来工作。在 RS 和 MOB 单元中,来自不同线程的微指令可以在同一周期内分派到执行单元或缓存管道。管道的这两个区域大多忽略了超线程。此外,如果一个线程在特定周期在流水线的任何阶段停止,则该周期的该阶段的全部带宽可以由其他超线程使用。如果线程进入 C1 或更深的睡眠状态或者如果超线程被禁用,则由于分区而专用于一个线程的资源(即,缓冲区条目)可供其他线程使用。

每个线程都有自己的体系结构状态,如题为“逻辑处理器状态”的英特尔手册第 8.7.1 节所述。大多数体系结构寄存器都是为每个线程复制的。这是通过在管道中复制 RAT 结构来实现的。内存也是架构状态的一部分,但英特尔处理器都是共享内存处理器,这意味着内存在系统的所有内核之间共享。

在“关闭超线程我们可以实现加速”这句话中,我不清楚使用什么性能指标和参考系统来进行这种比较。如果要比较以下两种配置中两个任务的挂钟执行时间:

  • 这两个任务在启用了超线程的同一个物理内核上运行,并且假设没有上下文切换。
  • 这两个任务在禁用超线程的不同物理内核上运行,并且假设没有上下文切换。

通常,第二种配置会产生更短的执行时间,但支持 HT 的内核上的任务之间可能的交互过于复杂,无法确定。例如,您提到这两个任务可能在私有数据缓存上发生冲突,但也有共享数据的机会。此外,系统其余部分发生的情况可能会影响您通过禁用超线程获得的加速。

您可能需要稍微回溯一下,并首先确定是否需要进行这种比较。如果处于可运行状态的任务总数不大于物理内核的总数,您的管理程序是将 vCPU 安排在不同的物理内核上还是选择将它们更紧密地打包在较少数量的物理内核上以放置其他内核处于睡眠状态?例如,Liunx 内核通常更喜欢在每个物理内核上调度一个线程,然后再利用每个内核的另一个逻辑内核。如果任务的数量大于物理内核的数量,您需要进行不同的比较,其中超标题可能会给您带来避免上下文切换的优势。这是超线程可以提高整体性能的主要情况。您甚至可以通过确定哪些任务对是良好的“兄弟姐妹”并更改它们的亲缘关系来实现更高的加速,以便将每个友好的任务对安排在同一个物理核心上。您必须手动执行此优化,因为大多数操作系统和管理程序无法自动执行此优化(但对此有研究建议)。

超线程的另一个巨大优势是它可以产生更好的每能源性能,如果能耗对性能同样重要,这是一个更好的指标。例如,如果只有两个可运行的任务,与在不同的物理内核上运行它们相比,如果这两个任务在同一物理内核的逻辑内核上运行,您可能能够实现更高的性能功耗比,即使有丰富的物理核心。

一般建议是保持启用超线程,除非您有强有力的经验证据或与安全相关的原因可以证明禁用它是合理的。


推荐阅读