目录

为什么 CPU 的线程数是核心数的两倍?

4 核 8 线程,8 核 16 线程是啥意思?

为什么不是 4 核 4 线程或 8 核 32 线程?

一、关于超线程

超线程是英特尔公司命名的技术(HT, Hyper-Threading),但是这项技术最早起源于 IBM ,学术一些的名字叫同时多线程(SMT,Simulate Multi-Threading)。

超线程技术其实是把一个 CPU 的物理核模拟成两个虚拟核用,通过此技术,英特尔实现在一个实体 CPU 物理核中,提供两个逻辑线程。让单个物理核心就能使用线程级的并行计算,进而兼容多线程操作系统和软件。超线程技术充分利用空闲 CPU 资源,在相同时间内完成更多工作。

虽然采用超线程技术能够使得单个物理核心同时执行两个线程,但是当两个线程同时需要某个资源时,其中一个线程必须让出资源暂时挂起,直到这些资源空闲以后才能继续。因此,超线程的性能并不等于两个物理核心的性能。而且,超线程技术的 CPU 需要芯片组、操作系统和应用软件的支持,才能比较理想地发挥该项技术的优势。

二、为什么超线程只虚拟出两个逻辑核?

先说一些耳熟能详的数字:四核八线程、八核十六线程等。这是典型的超线程技术应用,一个物理核心虚拟出两个逻辑核。

超线程的基本原理,用大白话讲就是:单核心工作量不饱满,给两个线程能提高利用率。就好比有的打工人业余时间能搞个副业一样,但可以压榨的工作量显然是有限的。

每个 CPU 核心里的 ALU,FPU 这些运算单元的数量是有限的,而超线程的目的之一就是在一个线程用运算单元少的情况下,让另外一个线程跑起来,不让运算单元闲着。但是现在的CPU那么发达,有分支预测乱序执行等技术,内存,IO的频率正在逐渐提高,已经可以让CPU的核处于忙碌状态,2 个已经差不多,无需搞出更多个线程了。

对于计算密集的程序,超线程甚至会拖累性能。

如果当一个线程整数,浮点运算各种多,当前核心运算单元没多少空闲了,这时候你再塞进了一个线程,这下子资源就紧张了。两线程就会互相抢资源,拖慢对方速度。所以,如果你的程序是单线程,关了超线程,免得别人抢你资源,如果是多线程,每个线程运算不大,超线程比较有用。

补充:

超线程并不仅限于两个逻辑核,如果想的话可以搞出来更多,代表是IBM的power系列:SMT8(每核8线程)的设计,也是相当恐怖了。但是这种设计其实并不是符合大部分通用应用的需求。

SMT的出发点还是还是处理器内部的执行指令的时候,因为许多原因(比如等待内存IO),导致CPU中的许多资源空闲,所以可以让CPU跑多个线程,进而提高资源利用率,提升性能。这种方法还有一个优点,对于一些存在缓存共享,负载不高的线程,通过这种方式,分配到相同核心的不同超线程下,可以节约切换开销。

但是这些自然不是免费,超线程的副作用存在于很多方面。

首先很明显,处理器核心中各种执行资源都是有限的,某些资源(比如ALU)在几个线程之间争用,一些资源需要直接平分给几个个线程。结果可能导致两个线程执行的速度都下降,甚至不如单线程运行,这在一些本身优化较好的SIMD程序中比较常见。所以我们很多日常用支持SMT的处理器,即使bios开启SMT,很多时候,尤其是低载情况下都是运行在1T模式的(也就是核心只有一个线程运行)。

各个线程的任务虽然跑在一个物理核心上,但是他们的指令,寄存器等等仍是需要分开的,处理器核心内部的其他执行资源也需要进行动态或者静态的分配,这些都需要在处理器中添加额外的调度,增加晶体管。与之对应,一个超频爱好者比较熟悉的现象就是关超线程超频,可能更凉快,同时频率更高。

这些多余的晶体管花在SMT上是否值得,拿来提升处理器单线程执行资源的利用率或者堆更多资源提升单线程性能,是不是会有更多收益就变成了一个值得权衡的问题。

对于Power这种SMT8的怪物,上面两个问题会因为SMT线程数增多而加剧,为了缓解这种情况需要堆更多的资源,这又会增加调度复杂度,需要更多的晶体管,为了解决只好把部分资源按超线程进行直接划分,这部分资源在单线程模式下也会无法利用,导致单核性能偏弱,这在很大程度不符合大部分通用应用中的需求(这个其实挺显然,很多时候都能体会到,一部分在于很多程序并没有很好的多线程优化而依赖于单线程性能,同时并行化到最后实际的瓶颈也在单线程。

REF

https://www.zhihu.com/question/444841440/answer/1745910660

https://www.cnblogs.com/jiading/articles/12588488.html

https://baike.baidu.com/item/%E8%B6%85%E7%BA%BF%E7%A8%8B