这篇文章主要是介绍CPU技术的发展,包括最近几十年CPU性能提升和半导体工艺发展,当前技术发展方向。希望可以帮助软件开发者理解CPU指令集和组成运行原理、CPU性能提升的现状和瓶颈、CPU技术发展方向会如何影响软件开发/设计的框架和编程思想。
CPU 指令集和运行原理当前使用最广泛的指令集是x86、ARM、RISC-V,指令集对于CPU性能和软件开发有多大的影响,指令集的发展方向是什么。现代CPU内部微架构、流水线是如何设计的,为什么CPU的控制单元和缓存相比GPU复杂很多。
CPU 性能提升和未来方向近些年CPU性能提升遇到了功耗墙的问题导致提升速度放缓,为什么以前的优化技术都遇到了瓶颈,同时当前有哪些新的技术方向用于提高CPU的性能。
CPU 技术方向对软件开发技术的影响软件最终会在CPU上运行,更好的利用CPU提供的能力进行编程才能带来更好的性能。一部分CPU优化技术是内部微架构调整对软件开发者是透明的,例如时钟频率和IPC的提升。但是另一些优化技术需要软件开发者进行优化,例如多核心、SIMD、DSA等。这些需要软件开发者改造的技术会如何影响编程语言和系统框架的设计,从而影响软件开发者的编程方式。
CPU 结构和原理计算机结构1945 年冯诺依曼提出了一种计算机实现的结构设计,现代的计算机和CPU基本上依然是基于冯诺依曼结构的思想进行实现。冯诺依曼结构定义了计算机的5个组成部分,分别是内存、控制单元、运算单元、输入、输出:
模块
功能
内存
内存是一个存储器。操作指令和数据以二进制的形式存储在内存中。
控制单元
控制单元是一个协调者。控制单元按照程序指令顺序从内存中读取指令进行执行,将指令发送到运算单元进行计算。同时控制单元也会协调内存和输入/输出设备之间的数据传输。
运算单元
计算单元包含加减乘除等计算器。运算单元根据控制单元发送的指令,从内存中读取数据进行计算,计算完成后重新写回到内存中。
输入/输出
输入/输出设备主要是外部的一些设备进行数据交换。输入设备将数据和指令输入到计算机中,常见的输入设备有键盘、鼠标。计算机处理后将数据输出到外部设备中,常见的输出设备有显示器。
CPU 结构现代CPU虽然使用冯诺依曼架构思想进行设计,但是经过几十年技术的发展非常复杂。因为内存不属于CPU内部结构,现代CPU主要分为4个组成部分,分别是高速缓存、控制单元、运算单元、寄存器。这里先简单介绍一下各个组成部分的功能,后面流水线实现的部分会更详细的介绍。
高速缓存高速缓存将内存中更频繁使用的程序指令和数据保存在高速缓存中,避免每次都从内存读取降低数据读写延迟。
多级缓存 - 现代CPU通常有2-3级缓存,离CPU更近的缓存速度更快但是容量更低。控制单元控制单元是CPU中最复杂的部分,负责调度和协调其他部分进行运行。调度流水线执行、异常处理等。
流水线调度 - 分支预测、高速缓存读写、指令读取、指令解码、指令调度执行、乱序执行、指令发射、更新寄存器异常处理 - 处理 CPU 运行时的各种异常运算单元运算单元包含大量的运算器执行计算任务,包括逻辑运算、分支、内存读写单元。
ALU - 算数逻辑单元负责整数加减乘除和位运算FPU - 浮点单元负责浮点数运算Branch - 分支单元用于分支判断,当 CPU 支持分支预测时还需要更新分支预测缓存和分支预测错误回滚执行SIMD - 向量单元负责向量运算内存读写 - 内存单元负责内存读写,从缓存中读取数据或将数据写回缓存寄存器寄存器用于保持运行时的临时数据和CPU自身的一些状态值。
通用寄存器 - 用于存储临时数据,局部变量/函数参数/返回值等数据PC - 程序计数器存储下一条指令的地址IP - 指令指针用于存储当前执行的指令地址SP - 堆栈指针用于存储栈的地址指令集架构ISA(指令集架构)是一种处理器基本功能和指令集架构规范。它定义了CPU硬件可以执行的所有操作指令,指令的编解码格式、指令类型、寄存器、内存寻址、异常处理、权限级别等内容。编译器和CPU选择一种指令集规范作为标准进行实现,这样可以保证任意符合指令集规范编译的代码都可以相同指令集规范的CPU上正常运行。ISA主要有指令集、寄存器、内存模型、异常中断处理等规范定义。
指令集架构规范组成指令集 - 支持的操作指令、指令的编解码格式、指令长度寄存器 - 支持的寄存器类型、寄存器数量内存模型 - 支持的内存访问方式、内存寻址方式、内存一致性规则异常/中断处理 - 定义了处理器如何处理异常和终端事件指令集指令集定义了处理器可以执行的所有操作指令和指令的编解码格式。目前常见的指令集主要分为两种类型,复杂指令集和精简指令集。复杂指令集CISC主要是以x86为代表,精简指令集RISC主要是以ARM/RISC-V为代表。
x86x86指令集架构最早使用在Intel在1978年推出8086处理器,指令集专利由Intel和AMD拥有。目前主要是在PC/笔记本和服务器市场使用,x86的优势在于软件生态/兼容性和高性能,劣势在高能耗和开放性:
特点
说明
软件生态
发展时间最久技术最成熟,积累了大量的技术和软件。一直很注重兼容性帮助它占有了更多的市场份额,但是兼容性也限制了技术升级和大量的历史包袱需要兼容增加了复杂性
性能高
高性能场景占有大部分的份额
能耗高
同样性能下x86相比RISC指令集需要更多的能耗,限制了在低功耗设备上使用
开放性低
专利主要由Intel所有,其它厂商授权使用
芯片厂商
Intel、AMD
主要领域
80%+ PC/笔记本、90%服务器市场
x86 指令集发展x86包含多个扩展指令集,指令长度至少8位可变长度。以下是x86指令集的一些重要版本更新:
特性
年份
说明
16 位
1978
Intel 在 1978 年推出16位指令集使用在8086处理器
32 位
1985
Intel 公司推出了 x86 指令集的32位扩展,可支持 32 位软件运行
64 位
2003
AMD 公司推出了 x86 指令集的64位扩展,可支持 64 位软件运行
SSE
1999
Intel 推出了 第一代 SIMD 指令集扩展 SSE,可支持固定 128 位数据的向量计算
AVX
2011
Intel 推出了 第二代 SIMD 指令集扩展 AVX,可以支持 256-512 位数据的向量计算
x86s
2023
Intel 推出的纯 64 位架构的白皮书,希望可以减少对于 16、32 位的支持降低兼容性包袱
ARMARM指令集架构是英国 ARM 公司开发的一种RISC指令集架构,指令集专利由ARM公司拥有。ARM诞生于1980年代,当时的处理器都是基于CISC设计复杂度高、功耗大,ARM公司希望使用精简的指令集实现低功耗和高性能,可以应用在嵌入式设备和移动设备中。
因为ARM有非常好的能效优势,目前主要是使用在追求功耗比的嵌入式和移动设备。ARM设备几乎占据所有的手机和Pad市场。在笔记本市场因为苹果切换到ARM,同时高通和INVIDIA开始布局ARM桌面端芯片未来也会推动ARM份额的提升,目前已经占据了15%+的笔记本市场份额。近年ARM性能和芯片设计水平逐渐提高,ARM在服务器市场的份额逐渐提升。
不过ARM也有和x86同样的问题就是开放性,导致ARM受到了RISC-V的挑战。ARM指令集专利属于ARM公司,同时ARM公司对使用指令集会有一些限制。
特点
说明
软件生态
手机/Pad移动设备和 Mac 系统比较完善,但是Windows平台还是会有兼容性问题使用率很低
性能高
峰值性能相比x86竞品性能略低,不过近年也在高速发展
能耗低
因为ARM追求低功耗比的设计,同时大量低功耗设备厂商的硬/软件优化,能耗比一直领先
开放性中
专利由ARM所有。虽然比x86开放性会好一些,但也导致部分厂商开始尝试完全开源的RISC-V。同时由于RISC-V的竞争,ARM也适当放宽了对于自定义指令集的限制
芯片厂商
Apple、高通、华为、联发科
主要领域
几乎所有移动设备、14%笔记本市场、7%服务器市场、嵌入式
ARM 指令集发展
ARM包含多个扩展指令集,指令长度为固定32位。以下是ARM的一些重要版本更新:
指令集
版本
说明
32 位
Armv1
1985 年 ARM 推出了32位架构的指令集
NEON
Armv7
2004 年 ARM 推出了第一代 SIMD 指令集扩展NEON,可支持固定 128 位数据的向量计算
硬件虚拟化
Armv7
可支持在同一台物理机上运行多个虚拟机的硬件虚拟化扩展
64 位
Armv8
2011 年推出了64位扩展,可支持 64 位软件运行,有31个 64 位通用寄存器
SSE
Armv8.2
2014 年 ARM 推出了第二代 SIMD 指令集扩展SSE,可支持可变长度 128-2048 位数据的向量计算
RISC-VRISC-V架构是2010年由加州大学伯克利分校发起的开源RISC指令集架构标准。RISC-V有以下几个优势:
精简设计 - 设计非常简单,相比x86和ARM指令集设计更加精简,降低了复杂度和指令数量。模块化设计 - 采用模块化设计思想。提供精简的基础指令集实现基础能力,其它包括浮点、SIMD、原子操作、位运算等指令都是通过扩展指令集提供。芯片设计厂商可以基于自身需求将各种指令集扩展模块进行组合应用到不同的场景。开源 - x86/ARM都需要授权才能使用,RISC-V完全开源可以免费使用不用担心版权和专利费的问题。RISC-V的优势在于更先进的设计和开源,劣势在软件生态和芯片厂商的设计能力还需要进步:
特点
说明
软件生态
比较弱。目前更多是用在一些嵌入式设备或协处理器中,操作系统、软件开发、用户级软件还在起步阶段
性能中
峰值性能相比x86/ARM性能差一些,更多是因为x86/ARM芯片厂商的技术更成熟
能耗中
和ARM差不多,更多是因为ARM芯片厂商的技术更成熟
开放性高
由于开源吸引了大量芯片设计厂商的加入,支持添加自定义指令集,不过也导致了一些生态兼容性问题
芯片厂商
主要是新型芯片设计商,所以设计能力上相比差一些
主要领域
1%处理器市场、嵌入式、协处理器(手机上目前已经有不少使用RISC-V指令集设计的协处理器)
RISC-V 指令集RISC-V有3个基础指令集和多个扩展指令集,指令长度为固定32位。以下是RISI-V常见的指令集:
指令集
类型
说明
RV32I
基础指令集
32位整数指令集,包含 32 个 32 位的通用寄存器
RV32E
基础指令集
低功耗嵌入式32位整数指令集,包含 16 个 32 位的通用寄存器
RV64I
基础指令集
64位整数指令集,包含 32 个 64 位的通用寄存器
F/D/Q
浮点扩展指令集
单精度 32 位、双精度 64 位、四倍精度 128 位
M
整数扩展指令集
整数乘法除法指令集
A
原子操作扩展指令集
原子操作指令集
B
位操作扩展指令集
位操作指令集
P
SIMD 扩展指令集
固定长度的SIMD 运算
V
向量运算扩展指令集
可变长度的向量运算
C
压缩指令扩展指令集
可将指令长度压缩位 16 位用于低功耗场景
RISC-V 寄存器RISC-V 汇编语言指令编码格式指令集规范定义了指令的二进制格式。以ARM指令集为例,编译器在编译时按照指令集规范将每一个汇编指令编码成32位的二进制指令,CPU在运行时通过解码器按照指令集规范将二进制指令解码成特定的指令进行执行。
x86指令集更复杂,ARM和RISC-V更精简。x86使用可变长度指令,至少8位+,同时x86支持更多的内存寻址模式。ARM使用固定32位指令,至少少数几种内存寻址模式。
ARM指令编码格式指令集对比复杂指令集和精简指令集x86是复杂指令集,主要是因为x86指令数量多、复杂指令、内存寻址方式多、指令长度不同等原因,导致硬件设计实现更复杂。使用复杂指令集主要是行业早期技术限制和兼容性原因导致的:
原因
说明
编译器技术落后
程序大多数都是以汇编语言或二进制码进行编写。提供一条复杂高级指令执行多个指令操作,可以使程序开发更加便利。
内存紧张
程序需要加载到内存中执行,内存不足导致需要尽可能降低程序的二进制大小减少内存占用。复杂指令是可变长度,大部分指令的二进制位数更短,只有复杂指令会使用更长的二进制位数,这样可以增加指令的存储密度降低大小。
通用寄存器少
由于晶体管的成本导致通用寄存器数量很少,指令会更多的直接访问内存。导致更多的指令支持内存寻址,内存寻址方式更复杂。
兼容性
不断增加新的指令,同时还需要完全兼容老的指令,导致指令数量越来越多。
以上这些原因导致早期使用CSIC将更多的复杂性转移到CPU处理,导致CPU设计复杂成本高。之后随着半导体技术的发展可以集成更多晶体管和内存以及编译器技术的发展可以更好的生成机器代码,1979年开始行业逐渐发现CISC有以下这些缺点:
原因
说明
通用寄存器数量少
更多的使用寄存器可以减少对内存的访问同时指令执行平均周期差异小也有利于流水线执行。
实现复杂度高
指令数量多/复杂指令,导致处理器实现复杂成本更高。同时也会增加编译器的复杂度
不利于流水线的设计
处理器流水线技术可以使处理器同一个周期内并行执行多个指令和操作流程,例如指令解码/内存读写/计算。指令长度不同和复杂指令会使解码器更复杂,指令执行周期差异大也不利于流水线并行执行
指令使用率低
程序的常用指令只占整个指令集的20%,造成了很多浪费
能效高
由于复杂度高需要使用更多的晶体管和复杂度,导致产生更多的功耗无法应付低功耗场景
以上这些缺点推动了新的指令集都使用RISC设计更有利于提高处理器的性能和能效。但是Intel因为兼容性和软件生态的考虑选择继续使用x86。经过这些年处理器技术的发展,x86也做了非常多的技术改进提高性能,不过由于兼容性约束指令集很难缓慢的进行改进。
x86的一些技术改进:
降低指令复杂度 - 持续减少对一些老旧指令的兼容减少指令数量内部使用精简指令集的设计 - 由于半导体工艺的发展芯片可以集成更多晶体管提高性能。增加了通用寄存器的数量、内部将复杂指令解码为多条简单指令用于流水线执行。更多技术支持 - 提供了很多基于Intel平台的指令集扩展和开发框架,操作系统和软件开发者可以利用这些技术提高性能。指令差异以下面的汇编为例。RISC指令集必须将内存数据加载到寄存器以后才能计算,CISC指令集可以支持指令内存寻址。所以RISC会生成更多的指令数量。
CISC从功耗公式可以看出功耗和晶体管数量、电容、电压、时钟频率成正比,增加晶体管数量和提高频率都会增加处理器的功耗。
早期半导体工艺发展通过不断降低晶体管的尺寸可以减少电容的大小、以及降低晶体管开关切换时间,芯片可以使用更低的电压运行,通常每次工艺提升可以使电压降低15%。处理器制造商可以不断在芯片上增加晶体管数量以及提高时钟频率,同时控制功耗的增长速度。
半导体工艺发展带来的提升增加晶体管数量 - 在同样尺寸的芯片中集成更多数量的晶体管,这些增加的晶体管可以用于增加缓存大小、控制单元等模块提高处理器的性能。同时也推动了 SOC 芯片的发展,在芯片内集成多核心、GPU 等单元。提高时钟频率 - 提高时钟频率可以使处理器执行的更快降低电压 - 使用更低的电压进行运行,在同样的性能下可以降低能耗。同时更好的晶体管设计可以降低漏电。技术定律功耗墙从2004年开始登纳德缩放定律失效。缩短晶体管栅长本来能降低电压、提高晶体管开关频率,但在栅长缩短到65nm左右时,晶体管开关频率增加导致芯片功耗和温度急剧上升。同时,栅长缩短导致漏电流急剧增加,这些电能也会转化为热量。目前大概40%的功耗是由于漏电导致的,即使晶体管处于关闭状态也会增加漏电能耗。早期每一代新工艺至少可以让晶体管栅长缩小30%,虽然现在半导体制造商继续使用现有工艺节点乘以0.7作为下一代的节点名称,例如 10nm、7nm、5nm、3nm,然而栅长缩小尺寸已远远达不到这个要求,需要二十年左右才能使晶体管数量翻一番。同时每一代新技术节点的制造成本越来越高,每代制造成本相比前一代高几倍。
小结由于功耗墙的限制,相同电压和电容条件下增加晶体管数量提高核心数量相比增加时钟频率带来的功耗影响更小。同时晶体管尺寸减少速度变缓,增加晶体管数量可能需要增加芯片的面积,但是增加芯片的面积会导致生产良率更低成本更高。处理器设计不再追求单核时钟周期快速提升,朝着多核心方向发展通过增加核心数提高指令吞吐量并行执行提高性能。
CPU能效曲线更高的性能需要更高的时钟频率和电压运行,导致能效急剧提升时钟频率发展处理器时钟频率提升幅度逐渐放缓半导体工艺发展
半导体工艺发展主要是依赖光刻技术进步以及更优秀的晶体管设计,下面简单列一下最近10年半导体工艺发展的重要节点:
本章节我们主要讲解CPU的结构和原理,以及处理器基本功能和指令集架构规范、指令集架构等内容,下一章我们聊一聊微架构和IPC提升,主流CPU核心的微架构设计以及对开发者的影响。
作者:京东零售 何骁
来源:京东云开发者社区 转载请注明来源
微软资讯推荐
win10系统推荐
系统教程推荐