dev*_*ium 2 performance x86 cpu-architecture hyperthreading
工作中有一个与超线程至强机器相关的讨论。我对超线程如何工作的(肤浅的)理解是 CPU 在物理上多路复用来自两个“线程”的指令。也就是说,执行单元是共享的,但是有两个不同的架构集(寄存器集、指令队列,甚至可能是分支预测器等)——每个线程一个。执行单元及其缓冲区/队列总是准备好接收新的指令/数据,从这个角度来看,禁用一个线程而不是保留两个线程没有任何优势。
我的同事暗示通过关闭超线程我们可以实现加速,因为运行单线程的 CPU 不再需要“查看”另一个线程是否也有一些工作要做。我的理解是,所有这些电路都已经硬连线以多路复用来自两个线程的传入数据/指令,并且禁用超线程只会关闭其中一个线程,不允许它接收任何指令/数据,但实际上没有其他不同。这是超线程如何工作的一个很好的心理模型吗?
我确实理解有很多因素在起作用,例如内存工作集、共享缓存的问题等,可能会影响 2 线程超线程 CPU 与禁用超线程的同一 CPU 相比的表现,但是我的问题更多地是针对禁用超线程是否以某种方式使整个数据/指令流通过管道更快?例如,在尝试填充后端前端的缓冲区时是否会出现争用问题?
我同事的解释也以某种方式包括管理程序,但我看不到两者之间的关系?它们似乎是正交的概念。
谢谢!
没错,超线程的工作原理是在管道的前端阶段和退休阶段复用每个线程的指令流。在 RS 和 MOB 单元中,来自不同线程的 uops 可以在同一周期内分派到执行单元或缓存管道。管道的这两个区域大多没有注意到超线程。此外,如果一个线程在特定周期的管道的任何阶段停顿,则其他超线程可以利用该周期的该阶段的全部带宽。如果一个或多个线程进入 C1 或更深的睡眠状态,或者如果超线程被禁用,则由于分区而专用于一个线程的资源(即缓冲区条目)可用于其他线程。
每个线程都有自己的架构状态,如题为“逻辑处理器状态”的 Intel 手册第 8.7.1 节所述。大多数架构寄存器都是为每个线程复制的。这是通过在管道中复制 RAT 结构来实现的。内存也是架构状态的一部分,但英特尔处理器都是共享内存处理器,这意味着内存在系统的所有内核之间共享。
在“关闭超线程我们可以实现加速”这句话中,我不清楚正在使用什么性能指标和参考系统来进行这种比较。如果要比较以下两种配置中两个任务的挂钟执行时间:
通常,第二种配置会产生较短的执行时间,但在支持 HT 的内核上的任务之间可能的交互太复杂而无法确定。例如,您提到这两个任务可能会在私有数据缓存上发生冲突,但也有共享数据的机会。此外,系统其余部分发生的事情可能会影响您从禁用超线程中获得的加速。
您可能需要稍微回溯一下,并首先确定是否需要进行这种比较。如果处于可运行状态的任务总数不大于物理内核总数,您的虚拟机管理程序是将 vCPU 调度在不同的物理内核上还是选择将它们更紧密地打包在较少数量的物理内核上以放置其他内核处于睡眠状态?例如,Liunx 内核通常更喜欢在每个物理内核上调度一个线程,然后再使用每个内核的另一个逻辑内核。如果任务数大于物理内核数,则需要进行不同的比较,其中超标题可能为您提供避免上下文切换的优势。这是超线程可以提高整体性能的主要情况。您甚至可以通过确定哪些任务对是好的“兄弟”并更改它们的亲和度,以便每个友好的任务对都安排在同一个物理核心上,从而实现更高的加速。您必须手动执行此优化,因为大多数操作系统和虚拟机管理程序无法自动执行此优化(但有关于此的研究建议)。
超线程的另一个巨大优势是它可以产生更好的每能量性能,这是一个更好的指标,用于能量消耗对性能同样重要的情况。例如,如果只有两个可运行的任务,与在不同的物理内核上运行相比,如果这两个任务在同一物理内核的逻辑内核上运行,您可能能够实现更高的每能量性能,即使有大量的物理核心。
一般建议是保持启用超线程,除非您有强有力的经验证据或与安全相关的原因可以证明禁用它是合理的。