CPU 未来会朝什么方向发展?

CPU 未来会朝什么方向发展?

木头龙,开了个新专栏,收录些老回答

更多核心大概率还是主流方向

从过往的 CPU 发展路线来看,提升整体性能一直是首要目标。要达成这个目标,下面几个大方向是比较有效的:

  1. 提升单线程性能;
  2. 加入新指令;
  3. 增加核心数量;
  4. 集成专用单元。

其中,第三点的更多核心数量,目前来说是比较符合 CPU 硬件厂商和软件开发商一致利益的方向。因此,我认为在可以预期的未来,这是 CPU 的主流发展方向。

提升单线程性能

提升单线程性能其实是最符合软件开发商利益的,理论上任何应用无需任何改动(包括重新编译),就能获得更高的运行性能。但 CPU 发展到了今天,对于 CPU 厂商来说,这是效益比最低的方向。

CPU 性能=IPC(Instructions Per Cycle,每时钟周期执行指令数)×频率,因此这个方向可以细分为提升 CPU 的工作频率和提升 IPC 两个小方向。

今天的硅半导体工艺,一般来说 2.5 GHz 和 5 GHz 是两个分界点。CPU 的频率 - 功耗曲线是一条近似于三次方关系的曲线,频率越高,提升同等频率导致的功耗增加越大。2.5 GHz 以下,提升频率导致的功耗提高很小;5 GHz 以上,继续提升频率会导致的功耗大幅提升。目前最先进的工艺是台积电的 5nm 工艺,相比于之前的 7nm 工艺,据说能效比提升 15%。所以理论上 CPU 架构不变,功耗限制不变,CPU 频率可以提升 15%。但这个 15%大概率是指追求能效比的手机 CPU,7nm 工艺的工作频率在 2.5 GHz 附近,可以提升到 2.875 GHz 而功耗没有明显提升。但是,对于最高睿频 4~5 GHz 的 PC CPU 来说,这个能效比提升大概只有 5%左右,也就是 5 GHz 提升到 5.25 GHz。耗费庞大资金投资升级制程只能带来 0.25 GHz 的频率提升,对于 CPU 厂商来说显然很不合算。除非是材料层面的更新,例如据说碳纳米管工艺,可以让晶体管速度提升 3 倍的同时,功耗还可以大幅下降,但新材料的应用和量产,乐观来看的话,还需要 5~10 年时间。

提升 IPC 的方向,最常用有效的方法是实现更宽的架构,如苹果的 A 系列 /M1、IBM 这几代的 POWER。更宽的架构需要用更多的晶体管实现:更宽的指令通道,更多的解码、执行单元,更多的寄存器等等。但因为指令数据依赖、缓存命中失败、分支预测错误等种种原因,性能提升幅度往往远低于增加的晶体管数量。这也是 POWER 9/10 都有 SMT 4/8 两种配置的原因之一——这么宽的架构(尤其是 SMT 8 的)给单个线程用,各种模块闲置率太高了。

除了加宽架构外,应用新的分支预测算法、乱序执行算法、优化执行单元电路等方法也可以提升 IPC,只是这些方法往往需要有新的理论出现或者有足够的条件去实现已有理论,并非每次更新架构都可以使用。所以总的来说,对于 CPU 厂商来说,耗费大量晶体管去提升 IPC 的效益也不高。

加入新指令

为了让 CPU 可以工作在以 GHz 计的频率,现代 CPU 都使用了多级流水线。真正的指令执行只是其中一级,比较常见的简单指令,执行阶段消耗的功率通常只有整个 CPU 核心的 1/20 左右。在 CPU 性能往往受限于功耗的今天,让单一指令完成更复杂的计算,或者对更多数据进行计算是非常有效的提高性能的方法。例如一条 FMA 指令,完成类似 A=A×B+C 两步计算;或者一条 SIMD 指令,同时完成 A.x=A.x+B.x,A.y=A.y+B.y,A.z=A.z+B.z,A.w=A.w+B.w 这样一组多个数据的运算,对于提升 CPU 性能非常有效。因为指令的其它阶段消耗的功耗几乎不变,但执行阶段更复杂,使用了更多晶体管功耗更高,用于计算的功耗占比更高。这是对 CPU 厂商最有利的方案,因为加入 FMA,理论性能直接翻倍;AVX 加宽一倍成 AVX512,又翻一倍。晶体管虽然也有一定幅度的增加,但绝对没有增加 4 倍,就达成了 4 倍性能。

然而对于软件开发商来说,这是最麻烦的方案之一。除了极个别的新指令,可以在 CPU 的解码阶段可以对特定的指令序列进行融合(例如碰到 A=A×B,A=A+C 这样的指令序列可以直接融合为 A=A×B+C,不过即便这样也会浪费 CPU 的解码性能)后直接执行也能发挥新指令的性能外,对于现有应用来说,最起码也需要用新版的编译器重新编译、打包、分发、部署——可能还要经历完整的测试流程,才能利用上新硬件的性能。某些新指令,很可能还需要重新组织数据结构。例如 256 bit 宽的 AVX 指令,如果应用本身不需要使用 64bit 的双精度浮点数,只用到 32bit 的单精度浮点数,需要凑够一组 8 个数据才能完全利用上 AVX 指令的性能。对于一些通用性的应用,还要兼顾在不支持新指令的旧硬件上执行,软件开发商不得不维护多个版本的代码,根据 CPU 支持的指令执行不同的分支。万一需要调整算法,需要对多个分支的代码进行更新和测试。可以说,除了极其渴求性能,用户单一且代码经常需要根据计算任务调整的 HPC 应用,没几个软件开发商喜欢这个方向。

增加核心数量

这个就不用解释了吧?设计电路的时候 Ctrl+C,然后 Ctrl+V 一下就多一个核心,再 Ctrl+V 两下就多两个核心了……开个玩笑,当然没有那么简单,例如核心数量多了,就需要考虑核心间互联,缓存一致性机制的性能,内存访问带宽等一系列问题。不过除非是例如 Intel 的 Xeon 从 Ringbus 更换到 Mesh 这样的大升级,否则这些问题解决起来还是相对简单很多的。而且晶体管效率基本上可以保持原有水平,除了因为核心增加后功耗也增加了需要稍微降低全部核心满载频率导致性能稍有损失。对于 CPU 厂商来说,这个方向实现起来虽然有点亏,因为需要更多晶体管更大的晶片,成本提高了,但这是可以通过工艺升级来抵消的。

而对于软件开发商来说,需要计算性能的应用,大部分已经对多线程进行优化了。尤其是一些对于大量数据进行分组计算的应用如 3D 渲染,多分几组的事;对于一些天然就是多任务的应用,如网站服务器一个线程响应一个请求、大型软件编译一个线程编译一个文件,多启用几个线程就好。这类应用完全可以不做任何更改,或者仅仅改一下配置文件就可以利用上增加核心带来的性能提升。

只有像大型游戏这种,随着画面分辨率的提高,单线程性能不够,适合多线程的计算往往又已经交给 GPU 处理,要利用上新增加的核心,需要对 CPU 处理的任务做更细的切分和分配,但又需要顾及原有主流型号的核心数量不多,通常要等一段时间,主流型号 CPU 的核心数量上去了,新开发的游戏才会利用上增加的核心。

但总的来说,这个方向是 CPU 厂商和软件开发商都比较接受的,例如 AMD 就玩命把核心堆到 64 核,Linus 就很高兴的配了台 32 核的 3970X 的电脑……

PS:Intel 说,你们不是喜欢多核么,我给你一堆……小核,这就是 Field Lake、Alder Lake 的混合架构路线……

集成专用单元

这个就不多说了,针对特定算法的专用电路效率是最高的。但用途过于单一,用得上的应用也需要做相应的调整,并不比使用新指令好多少甚至更麻烦——可能需要考虑数据在 CPU 与 xPU 之间的传递。用不上的应用更是完全无感。当然,还是有一些单元是通用性很高的,例如浮点计算的 FPU(不过因为过于通用,FPU 现在已经成为 CPU 的一个执行单元了),图形处理的 GPU,视频编码解码,面向未来的 TPU,高性能计算一般都用到的矩阵计算,加密解密,压缩解压缩等,很多应用都会用到。对于 CPU 厂商来说,集成哪些单元,集成的专用单元的规模做到多大,往往也是一个很难平衡的事情,也是因此,Intel 的 EMIB、台积电的 LSI 这样把多个不同功能的晶片封装起来并且提供同晶片相近的性能的封装技术会越来越流行,CPU 厂商可以根据不同的客户需求集成不同种类、不同规模的专用单元或者 FPGA。只是这样一来,一款 CPU 满足不同行业不同应用需求的日子,可能再不会回来了……