超线程的原理一句话来说,就是CPU的一个核心执行一个线程的时候,通常会有部分处理单元闲置;超线程就是同时运行更多的线程,来把闲置的处理单元利用上。很显然,如果一个CPU可以同时工作的处理单元越多,单线程时闲置的概率越大,超线程的时候性能提升的幅度也越大。
对比一下Sky Lake(SKL)架构(Intel Core系列从6代到9代,以及目前发布的Comet Lake的10代都是一样的)和Zen/Zen+的处理单元部分:
可以看到,SKL是8发射,但其中4路(Port 2-4、7)只能处理地址生成指令(Address Generation Unit,AGU)或者存取内存数据的指令(Load/Store Data)。真正用于数据处理的只有4路(Port 0、1、5、6)。而Zen是10发射,AGU和存储数据只有两路,其余8路都可以执行运算指令,比SKL足足多了一倍。
即使是Intel最新的Ice Lake(ICL)架构,提升到10发射,但运算指令也还是只有4路,增加的两路也还是只能执行地址生成和内存数据存取指令:
当然,实际上双方的CPU有更多的细节,例如ICL可以执行AVX512指令,一个指令等效于Zen/Zen+的4个指令,Zen2的两个指令——但前提是应用程序作出优化;运行一个多线程优化的并行计算应用的时候,往往同时都是运行整数指令或者同时运行浮点指令,Zen的8路分成4路整数、4路浮点不见得比Intel的混合4路高效——但反过来如果每个线程都是相对独立的任务,例如同时运行多个应用,又或者网站服务器有多个worker线程这种情况,很可能不同线程整数浮点指令错开的,Zen会更高效。
最终的结果,就是同样是8核16线程,在CineBench R15这样不涉及AVX指令、对内存/核心互联的延迟/带宽不敏感的应用中,i9-9900K的单线程性能秒天秒地,但多线程性能要低于3700X,即使和2700X/1800X相比,领先幅度也比单线程性能的领先幅度低些(表中数据来自于Anandtech CPU Bench 2019)。