Multithreading 超线程处理器核心能否同时执行两个线程?

Multithreading 超线程处理器核心能否同时执行两个线程?,multithreading,multiprocessing,cpu-architecture,hyperthreading,Multithreading,Multiprocessing,Cpu Architecture,Hyperthreading,我很难理解超线程。如果逻辑核心实际上不存在,那么使用超线程有什么意义呢?。该条规定: 对于物理上存在的每个处理器内核,操作系统寻址两个虚拟(逻辑)内核,并尽可能在它们之间共享工作负载 如果两个逻辑内核共享同一个执行单元,这意味着其中一个线程将被搁置,而另一个线程将被执行,也就是说,我不明白超线程如何有用,因为您实际上并没有引入新的执行单元。关于现代CPU如何通过一次运行多条指令来查找和利用这些指令的详细信息,我无法对此进行概括。(包括Intel Haswell管道的框图,以及指向更多CPU微体系

我很难理解超线程。如果逻辑核心实际上不存在,那么使用超线程有什么意义呢?。该条规定:

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

如果两个逻辑内核共享同一个执行单元,这意味着其中一个线程将被搁置,而另一个线程将被执行,也就是说,我不明白超线程如何有用,因为您实际上并没有引入新的执行单元。关于现代CPU如何通过一次运行多条指令来查找和利用这些指令的详细信息,我无法对此进行概括。(包括Intel Haswell管道的框图,以及指向更多CPU微体系结构详细信息的链接)。也

你有一个有很多执行单元的CPU和一个前端,可以让它们大部分都有工作要做,但只有在良好的条件下。诸如缓存未命中或分支预测失误之类的暂停,或者只是有限的并行性(例如,一个循环执行一个长的FP添加链,每4或5个时钟增加一个(标量或SIMD)FP延迟瓶颈,而不是每时钟增加一个或两个),将导致每个周期的吞吐量远远低于4条指令,并使执行单元处于空闲状态

HT(通常)的要点是让那些饥饿的执行单元有工作要做,即使在运行低ILP或大量暂停(缓存未命中/分支预测失误)的代码时也是如此

SMT只向管道添加了一点额外的逻辑,因此它可以同时跟踪两个独立的体系结构上下文。因此,与两倍或四倍的全内核相比,它的芯片面积和功耗要少得多。(Knight的Landing Xeon Phi每核运行4个线程,主流Intel CPU运行2个。一些非x86芯片每核运行8个线程,用于数据库服务器类型的工作负载。)


常见的误解

超读不仅仅是优化的上下文切换。在缓存未命中时切换到另一个线程的简单设计是可能的,但HT比这更高级

在两个线程处于活动状态的情况下,前端在每个周期(在获取、解码和发布/重命名阶段)的线程之间交替,但故障内核实际上可以在同一周期内从两个逻辑内核执行UOP

在通常交替进行的管道阶段中,每当一个线程暂停时,另一个线程将获得该阶段中的所有周期。HT比固定交替要好得多,因为一个线程可以完成大量工作,而另一个线程正在从分支预测失误或等待缓存丢失中恢复

请注意,一次最多可有10次缓存未命中(来自Intel CPU中的L1D缓存:这是LFB(行填充缓冲区)的数量,内存请求是流水线的。但是如果下一次加载的地址取决于先前的加载(例如,通过树或链表的指针跟踪),CPU不知道从何处加载,也无法保持多个请求的运行。因此,两个线程并行等待缓存未命中是非常有用的

当两个线程处于活动状态时,有些资源是静态分区的,有些是竞争性共享的。有关详细信息,请参阅。(有关如何为Intel和AMD CPU实际优化asm的更多详细信息,请参阅。)


当一个逻辑内核“休眠”(即内核运行
HLT
指令或任何
MWAIT
进入深度休眠)时,物理内核将转换为单线程模式,并让仍处于活动状态的逻辑内核拥有所有资源(包括完全重新排序缓冲区大小和其他静态分区的资源),因此,它在仍在运行的单个线程中查找和利用ILP的能力比在另一个线程因缓存未命中而暂停时增加更多


顺便说一句,使用HT时,某些工作负载的运行速度实际上较慢。如果您的工作集几乎不适合二级或L1D缓存,那么在同一个核心上运行两个工作集将导致更多的缓存未命中。对于已经可以保持执行单元饱和的经过良好调优的高吞吐量代码 (就像高性能计算中的优化矩阵乘法),禁用HT是有意义的。始终使用基准测试

在Skylake上,我发现视频编码(使用x265
-preset sleer
,1080p)在我的四核i7-6700k上,使用8个线程比使用4个线程快15%左右。我实际上没有为4个线程测试禁用HT,但Linux的调度程序擅长在有足够多线程的情况下不跳转线程并在单独的物理核上运行线程。考虑到x265有大量的手写操作,15%的加速相当不错n asm并在每个周期运行非常高的指令,即使它本身有一个完整的内核。(我使用的较慢的预设往往比内存更受CPU限制。)

有关现代CPU如何通过一次运行多条指令来发现和利用这些指令的详细信息,请参阅。(包括Intel Haswell管道的框图,以及指向更多CPU微体系结构详细信息的链接)

您的CPU有很多执行单元,前端可以让它们大部分时间都有工作要做,但只能在良好的条件下进行。缓存未命中或分支预测失误之类的暂停,或者只是有限的并行性(例如,一个循环执行一长串FP添加,一次(标量或SIMD)限制FP延迟)每4或5个时钟添加一个(而不是每时钟添加一个或两个)将导致每个周期的吞吐量远小于4条指令,并使执行单元处于空闲状态

HT(通常)的要点是让那些饥饿的执行单元有工作要做,即使在运行低ILP或大量暂停(缓存未命中/分支预测失误)的代码时也是如此

SMT只增加了一点ex