IBM的POWER已经有SMT4甚至SMT8了,但这是有前提的:超宽架构。如果CPU的超流水线只能同时并行处理6条指令,那么SMT4还是可以做的,但做SMT8就完全没意义了。
然而做一个并行处理8条指令的CPU核心,然后让它可以配置为SMT4,和做两个只能并行处理4条指令并且配置为SMT2的核心,消耗的晶体管大致上是一样的,而1×4和2×2的多线程性能理论上也是相近的。那么做SMT4有什么好处呢?起码有两个:
更高的指令并行度有助于提升单线程性能。跟据不同应用中指令可并行度不同,SMT4的单线程性能通常会比SMT2高25%~75%。此外,单个核心使用双倍的缓存容量,也有助于提升性能,这个也是要看具体应用的缓存命中率的。
但这有个前提,解码单元的性能跟得上。近几年的CPU,引入了μOP cache,可以把指令解码后的微操作缓存起来备用,也最高6条指令并行处理,解码单元也要并行处理5(Intel)/4(AMD)条指令。所以8指令并行,对应的解码单元每时钟周期应该有6~7解码能力。
这对于定长的RISC指令来说,很简单:一次抓取一大段指令,然后数位截出来给多个解码器处理就是了。但对于x86这样的变长CISC指令来说,这就要了命了。在解析完毕前一条指令之前,你根本不知道后一条指令的开始地址在哪,解码单元只能一条一条指令来处理。这个前提下,解码单元能做到每周期3解码都很厉害了。
幸好还会碰到跳转、CALL这样直接带地址操作数的指令,解码单元直接抓取对应地址的指令来并行解码。题外话,解码处理AMD和Intel的处理不同:Intel是一个复杂解码器加若干个简单解码器,AMD是多个复杂解码器。所以Intel从Skylake可以做到1+4解码,AMD则是从Zen开始4解码。但如果要做更宽的6~7解码,这个我只能说我想不到如何处理这个变长指令的问题,首先是没见过。从现有情况去推测的话,跳转指令的密度是有限的,即便加大L1I、μOP Cache,可以根据更多跳转指令的地址并行进行更多解码,很可能解码出来的分支在很多个时钟周期内都用不上,结果就是超流水线虽然可以并发8指令,但因为从解码单元开始就无法填满流水线,实际单线程性能提升很小。
当CPU核心数量达到一定数量后,用于内核间以及其它模块如共享的末级缓存、内存控制器、PCIe控制器等的内部互联,开销也是非常大的。例如至强随着核心数量的增加,内部互联结构从单环到双环到现在的Mesh,晶体管开销、功耗占用都相当不小(AMD很鸡贼的做SMP on Package,最新的Zen3也不过8 Core/CCX,先不提)。所以你可以看到50~70核心的Xeon Phil采用了SMT4,50核心的互联比200+的互联简单方便多了。
那么回到问题本身,对于现在单线程性能说不上强但其实也够用,反倒随着智能设备普及、网络提速,要处理的数据越来越多,也越来越多的应用对多线程优化;而功耗限制、晶体管规模限制了单个CPU可以容纳多少核心的x86市场。那么CPU厂家到底是费心费力去做超宽架构顺手做个SMT4,还是对内核稍作小幅优化,然后多放几个SMT2的核心进去好呢?