本小节有点像大学本科的课程《计算机组成原理》,其实很多东西在本科的基础课程上都已经涉及了,后续的技术发展只是把这些基础理论进行东拼西凑,然后就可以实现功能了。
计算机体系结构看似很高大上,但是其基础就是这个《计算机组成原理》,或许几十年前发明这个学科的时候,当时最聪明的人已经把这个方向的基础东西都想完了,后续就只剩排列组合了。 本文主要参考《ZOMI酱:AI系统》:chenzomi12.github.io/02Hardware0…
1.CPU介绍
上图可知,CPU可以划分成三大部分:算术逻辑单元、存储单元和控制单元。
1.1 算术逻辑单元ALU
算术逻辑单元(ALU,Arithmetic Logic Unit)执行的操作是:
- 逻辑运算:逻辑运算包括 NOR、NOT、AND、NAND、OR、XOR 等。
- 移位操作:它负责将位的位置向右或向左位移一定数量的位置,也称为乘法运算。
- 算术运算:虽然它执行乘法和除法,但这是指位加法和位减法。但是乘法和除法运算的成本(逻辑复杂度和面积)更高。在乘法运算中,加法可以用作除法和减法的替代。
1.2 寄存器MU
存储单元(MU,Memory Unit)也可以称为寄存器,为什么会出现寄存器?因为我们知道,程序在内存中装载,由 CPU 来运行,CPU 的主要职责就是用来处理数据。那么这个过程势必涉及到从存储器中读取和写入数据,因为它涉及通过控制总线发送数据请求并进入存储器存储单元,通过同一通道获取数据,这个过程非常的繁琐并且会涉及到大量的内存占用,而且有一些常用的内存页存在,其实是没有必要的,因此出现了寄存器,存储在 CPU 内部。
没有寄存器的话,CPU 将需要不断地从内存中读取和写入数据,这将严重降低计算机的性能。因为寄存器比内存更快,所以使用寄存器可以加速计算机的操作和计算。
寄存器主要分为两种指令寄存器和数据寄存器,负责暂存指令、ALU 所需操作数、ALU 算出结果等。
常见寄存器的功能:
- 数据寄存器(DR) :数据寄存器(Data Register,DR)又称数据缓冲寄存器,数据寄存器用于存放操作数,其位数应满足多数数据类型的数值范围,其主要功能是作为 CPU 和主存、外设之间信息传输的中转站,用以弥补 CPU 和主存、外设之间操作速度上的差异。
- 地址寄存器(AR) :地址寄存器(Address Register,AR)用来保存 CPU 当前所访问的主存单元的地址。其本身可以具有通用性,也可用于特殊的寻址方式,如用于基址寻址的段指针(存放基地址)、用于变址寻址的变址寄存器和用于堆栈寻址的栈指针。
- 累加寄存器(AC) :累加寄存器通常简称累加器(AC),是一个通用寄存器。为 ALU 暂时保存一个操作数或运算结果。
- 程序计数器(PC) :程序计数器(PC),具有寄存信息和计数两种功能,一般用来存放下一条指令在主存储器中的地址。
- 指令寄存器(IR) :指令寄存器(Instruction Register,IR),用来保存当前欲执行的指令。
CPU 内部存储单元的容量极为有限,大量数据只能保存在 CPU 之外的 RAM(随机存取存储器)芯片中,就是我们平常所说的内存,也被称之为主存。存储器单元负责从主存中检索并临时存储数据,负责管理 CPU 和主存之间的数据流。
控制单元(CU,Control Unit)的主要工作用一句话概括就是告知最有效的工作方法。控制单元从主存中检索和选取指令,对其进行解码,然后发出适当的控制信号,指导计算机的其他组件执行所需的操作。控制单元自身并不执行程序指令,它只是输出信号指示系统的其他部分如何做。
1.3 控制单元CU
如果说 CPU 是计算机的大脑,那么控制单元就是 CPU 的大脑,也是 CPU 中最重要的部分。控制单元的任务可以分为解码指令、生成控制信号,并将这些信号发送给其他组件。主要功能如下:
- 指令解码:控制单元负责从存储器中读取指令,并对其进行解码。指令解码是将二进制指令转换为对计算机各个部件的控制信号的过程。通过解码,控制单元能够识别指令的类型、操作数和执行方式,并为后续的执行步骤做好准备。
- 控制信号生成:控制单元根据解码的指令类型和操作数,生成相应的控制信号,以控制计算机中各个部件的操作。这些控制信号包括时钟信号、读/写信号、地址选择信号、操作数选择信号等。控制单元会根据指令的需求生成适当的控制信号,确保计算机的各个部件按照指令的要求进行操作。
- 指令执行顺序:控制控制单元还负责管理指令的执行顺序。它会按照指令序列的顺序,逐条调度指令的执行,并确保每条指令的操作在正确的时钟周期内完成。控制单元能够根据不同指令的需求,控制指令的跳转、分支和循环等控制流程。
CU 所接收的输入有三个:节拍发生器(Step Counter)、操作译码器(Instruction)、标志信号(Condition Signal)
- 节拍发生器:时钟会给节拍发生器发出一定频率的时钟脉冲,节拍发生器根据时钟脉冲的次数,向 CU 循环发送节拍信号。
- 操作译码器:寄存器 IR 会将指令中的 n 位二进制操作码发送给操作译码器——n 位二进制对应着 (2^n) 种状态,译码器需要与 CU 连接 (2^n) 根线,每一种状态对应一根线,使得 CU 可以识别该操作码。
- 标志信号:标志是接收反馈的信号——经过 ALU 处理后的数字是正数还是负数、数字有没有溢出、鼠标有没有点击、哪个键盘敲击了等等,都是反馈信号。
CU 接收这三个外部参数后,就能够发出控制信号——微命令(Control Signals),来指挥 CPU 做出微操作。
1.4 CPU工作流
CPU 的工作流,主要分为 4 步:
- 取指:从内存提取指令的阶段,是将内存中的指令读取到 CPU 中寄存器的过程,程序寄存器用于存储下一条指令所在的地址
- 解码:解码指令译码阶段,在取指令完成后,立马进入指令译码阶段,在指令译码阶段,指令译码器按照预定的指令格式,对取回的指令进行拆分和解释,识别区分出不同的指令类别以及各种获取操作数的方法。
- 执行:执行指令阶段,译码完成后,就需要执行这一条指令了,此阶段的任务是完成指令所规定的各种操作,具体实现指令的功能。根据指令的需要,有可能需要从内存中提取数据,根据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数用于运算。
- 写回:结果写回阶段,作为最后一个阶段,结果写回(Write Back,WB)阶段把执行指令阶段的运行结果数据写回到 CPU 的内部寄存器中,以便被后续的指令快速地存取;
结合下图简单解释,第一步就是从内存里面去读取一些指令,给到控制单元 CU,而控制单元就会对刚才读取的一些指令来进行解码,变成正式的一些 command 命令,然后 ALU 就会去执行这些 command,这些命令执行完之后就会存储回来内存进行汇总也就是写回。
接下来我们就从编程的视角去理解 CPU 的工作流。平时我们变成使用 C++、Java、Python 等编程语言编译好的程序文件(机器码),保存在硬盘等存储介质上,当操作系统运行这些程序的时候,首先会将它们加载到系统内存中。
程序文件实际就是一系列的指令,CPU 从内存中检索并读取程序指令,然后通过控制单元对程序指令进行译码操作,使其转化为 CPU 能够“读懂”的指令格式。
接下来控制单元向算术逻辑单元 ALU 发送信号,ALU 即依据指令读取操作数并进行相应计算,其计算结果经由 CPU 内的存储单元返回内存中。
在以上过程中,CPU 执行了四个重要步骤:1)从内存提取指令;2)解码;3)执行;4)写回。这四个步骤是完整执行一条指令的过程,称之为指令周期(Instruction Cycle)。
这一过程循环往复地进行,直到程序结束。说起来简单,实际过程却很复杂。单以取指令这一步骤来说,它本身就又由多个微操作组成:
- 程序计数器初始化指针指向内存地址;
- 内存地址被装载到 CPU 的地址寄存器中;
- CPU 接下来检索该内存地址中的数据,并将其载入数据寄存器中;
- 如果数据包中包含的是指令,将其装载到指令寄存器中;
- 程序计数器递增加 1,指向下一个内存地址;
- 指令寄存器中的指令被传入 CPU 的控制单元中;
- 以上步骤循环往复地进行。
接下来的译码、执行等阶段,也都有着各自复杂的操作,感兴趣的伙伴可以详细学习计算机组成原理(计算机必修课)。
依照冯·诺依曼架构针对指令的“顺序执行”的原则,CPU 只能执行完一条指令再来下一条。这样可以提高频率和多核来增强计算能力,但是还是有限。所以就大算力场景,例如AI计算就需要GPU、NPU出场了。
1.5 CPU应用场景
服务器领域:x86 架构服务器广泛用于云计算、高性能计算(HPC)、大数据分析等应用场景。ARM 架构在服务器市场的渗透率较低,但近年来有所增长,主要得益于其低功耗、高效率的优势。
PC领域:x86 架构在个人电脑领域是主流,x86 架构的优点包括高性能和广泛的软件兼容性,适合各种复杂应用和游戏。缺点是功耗高和散热需求高。ARM 架构的优点是低功耗和高集成度,特别适合移动设备,续航时间长。缺点包括软件兼容性差和在某些高性能需求场景下表现不如 x86。
嵌入式领域:手机市场几乎完全由 ARM 架构主导,所有主流智能手机处理器(如 Apple A 系列、Qualcomm Snapdragon、Samsung Exynos 等)都基于 ARM 架构。在其他嵌入式领域,ARM(例如 Cortex-M 系列、Cortex-R 系列和 Cortex-A 系列)同样占据主导地位。ARM 处理器广泛用于物联网设备、智能家居、可穿戴设备、工业控制器、车载信息娱乐系统、仪表盘、智能家电、便携式医疗设备等。其低功耗、高集成度的特性使其在这些应用中非常受欢迎。此外,RISC-V 架构的开源特性、定制化优势和适应新兴应用的灵活性,使其在物联网、智能家居和传感器网络等领域受到越来越多的关注和应用。相比之下,x86 架构在嵌入式领域的应用相对较少,主要出现在一些需要高性能计算和复杂数据处理的场景,如高端工业控制系统、高性能网关、某些车载信息娱乐系统和高级医疗设备等。
看完上面的介绍,其实有时候一种指令集架构不能满足我们日益复杂的产品需求,例如汽车芯片,那么解决方法就是SoC,上面集成了各种异构核,而且是多核。但是自己做SoC是集成不了X86的核的,因为其不授权。所以更多采用了ARM授权和免费的RISC-V,以及我们自己设计NPU核心等。
2. CPU指令集
指令集架构(Instruction Set Architecture,ISA),就像任何语言都有有限的单词一样,处理器可以支持的基本指令/基本命令的数量也必须是有限的,这组指令通常称为指令集(Instruction Set),基本指令的一些示例是加法、减法、乘法、逻辑或和逻辑非。
2.1 指令集介绍
指令集架构是软件感知硬件的方式,我们可以将其视为硬件输出到外部世界的基本功能列表。Intel 和 AMD CPU 使用 x86 指令集,IBM 处理器使用 PowerPC R 指令集,HP 处理器使用 PA-RISC 指令集,ARM 处理器使用 ARMR 指令集(或其变体,如 Thumb-1 和 Thumb-2)。
我们经常看芯片手册的时候,就需要去关注寄存器和指令集。因为软件最终是要去操作这些东西的。可能高级语言的编译器已经把底层的过程屏蔽了,但是一些底层软件的问题还是需要汇编实现,其实汇编语言就是指令集的运用。
指令集的分类:
- 运算指令:在 ALU 中执行的计算操作
- 数据移动指令:读写存储操作(包括寄存器读写)
- 控制指令:更改指令执行顺序,进行程序跳转,实现 if/else,循环等
常见的指令集架构简要介绍:
- x86 架构:封闭架构,由英特尔和 AMD 牢牢掌握话语权,AMD 给 HG 授权 zen1 架构;VIA(台湾威盛)曾获得 x86 架构 Licence 授权,后来被 Z 芯收购;20 多年来没有第四家授权,其他芯片公司想用也用不了。
- Arm 架构:开放架构,虽然由 Arm 公司所有,但授权开放,需要花钱购买。目前,华为和飞腾拥有 ARM v8 架构永久性授权;阿里平头哥、中兴等国内厂商购买了 ARM v9 架构 IP 授权。
- MIPS 架构:开放架构,目前已开放了 MIPS 指令集的 R6 版本,以 Wave Computing 管理,但也难挽颓势,最后宣布终止开发,加入 RISC-V 基金会。LX 前期基于 MIPS 架构授权研发,后衍生出 LoongArch 自主架构。
- Alpha 架构:开放架构,目前已经无实体主张该指令集的权利,但相关专利已被 HP、Intel 等瓜分。我国的申威前期基于 Alpha 架构,后衍生出 SW64 自主架构。
- RISC-V 架构:开源架构,最特殊,不属于任何机构或国家,开源免费,想用就用,运营成本全靠基金会的兄弟们帮衬。由阿里平头哥主导,越来越多的创业公司加入 RISC-V 架构阵营。
2.2 精简指令集RISC
精简指令集(RISC),一个典型就是MIPS
精简指令集(RISC)的处理器架构:1981 年出现,由 MIPS 科技公司开发并授权,广泛被使用在许多电子产品、网络设备、个人娱乐设备与商业设备上。最早的 MIPS 架构是 32 位,最新的版本已经变成 64 位,RISC 指令集架构将在后面内容详细说明。
MIPS32 指令集由三类指令构成:R 型(寄存器型)指令、I 型(立即数)型指令和 J 型(转移型)指令。
- R 类型:R 型指令使用三个寄存器作为操作数,它们是 MIPS32 中最常用的指令类型。R 型指令的格式包括操作码(OP)、寄存器地址码(rs、rt、rd)以及移位量(shamt)和功能辅助说明(func)字段。R 型指令的例子包括算术逻辑指令(如 add、sub、and、or 等)、分支指令(如 beq、bne 等)、以及一些特殊的系统控制指令。
- I 类型:具体操作由 op 指定,指令的低 16 位是立即数,运算时要将其扩展至 32 位,然后作为其中一个源操作数参与运算。I 型指令的例子包括加法指令 addi、减法指令 subi、分支指令(如 beqz、bnez 等)以及加载和存储指令(如 lw、sw 等)
- J 类型:具体操作由 op 指定,一般是跳转指令,低 26 位是字地址,用于产生跳转的目标地址。J 型指令的例子包括无条件跳转 j、条件跳转 jal(跳转并链接)等。
例如一个addi指令:
addr1 = addr2 + Immediate Value,其为I类型指令。
另外ARM和RISC-V都是精简指令集,其执行效率高、功耗小。X86为代表是的复杂指令集CISC,其在商业上做到了更好的兼容,但是历史包袱也比较大,可以实现更复杂的定制指令操作,但是其执行效率一般,所以其后期的发展就是升频和多核。
- RISC 架构优点:包括指令执行速度快、硬件设计简单和高效的能量使用。由于每条指令执行一个操作且指令长度固定,指令解码和执行过程非常高效,允许处理器以更高的时钟速度运行。简化的指令集和固定长度的指令使得硬件设计更为简单,降低了设计复杂性和成本。由于指令执行效率高,RISC 处理器通常具有更高的能效,适用于需要低功耗和高性能的应用场景。
- RISC 架构缺点:包括程序代码长度较长和对编译器优化的依赖。由于每条指令执行的操作较少,实现同样功能的程序可能需要更多的指令,从而增加了程序代码的长度。RISC 架构依赖编译器生成高效的机器代码,这要求编译器具备较高的优化能力,以充分发挥处理器的性能。
2.3 复杂指令集CISC
CISC 架构旨在通过提供大量的指令来减少程序的指令总数,从而减少执行特定任务所需的指令数量。
CISC 的设计原则主要强调通过复杂的指令集和多样的寻址模式来简化编程,减少程序指令数量,从而提高编程效率和代码密度。利用微代码控制来实现复杂指令则是为了在简化硬件设计的同时,确保复杂指令的执行。向后兼容性的设计思想则保证了新旧处理器之间的软件兼容性,使得 CISC 架构能够在长时间内维持其市场地位和应用广泛性。
- CISC 架构优点:在于编程简便、代码密度高以及向后兼容性强。由于每条指令可以执行多个操作,程序员可以用较少的指令完成更多的任务,从而简化了编程过程。复杂指令减少了程序中的指令数量,提高了代码密度,节省了内存空间。此外,注重向后兼容性的新处理器可以运行旧的软件和操作系统,保护了现有的软件投资。
- CISC 架构缺点:由于指令复杂且不定长,解码和执行过程相对较慢,影响了整体性能。复杂的指令集和解码逻辑增加了硬件设计的复杂性和成本。相较于 RISC 处理器,CISC 处理器的能效较低,难以在高性能和低功耗之间取得平衡。
2.3 CPU并行处理架构
1966 年,MichealFlynn 根据指令和数据流的概念对计算机的体系结构进行了分类,这就是所谓的 Flynn 分类法。Flynn 将计算机划分为四种基本类型,如下所示:
- 单指令流单数据流(SISD)系统:只有一个处理器和一个存储器,每个指令部件每次仅译码一条指令,而且在执行时仅为操作部件提供一份数据,串行计算,硬件不支持并行计算;在时钟周期内,CPU 只能处理一个数据流
- 单指令流多数据流(SIMD)系统:采用一个控制器控制多个处理器,同时对一组数据中每一个分别执行相同操作,SIMD 主要执行向量、矩阵等数组运算,处理单元数目固定,适用于科学计算。特点是处理单元数量很多,但处理单元速度受计算机通信带宽传递速率的限制。
- 多指令流单数据流(MISD)系统:多个指令流来处理单个数据流,这种方式没什么必要,所以仅作为理论模型出现
- 多指令流多数据流(MIMD)系统:多个数据集上执行多个指令的多处理器机器,共享内存 MIMD 和分布式内存。特性是各处理器之间,可以通过 LOAD/STORE 指令,访问同一个主存储器,可通过主存相互传送数据。硬件组成为:一台计算机内,包含多个处理器加一个主存储器。多个处理器共享单一的物理地址空间。
GPU的工作就是把一个指令让多个处理单元PE进行处理,那其实就是把SISD变成了SIMD,这种技术就是单指令多线程(SIMT)
英伟达提出 SIMT 的初衷是希望硬件像 SIMD 一样高效,编程起来又像多核多线程一样轻松。
3. CPU的重要指标
3.1 算力
算力(Computational Power),即计算能力,是计算机系统或设备执行数值计算和处理任务的核心能力。提升算力不仅仅可以更快地完成复杂的计算任务,还能够显著的提高计算效率和性能,从而直接影响应用加载速度,游戏流畅度等用户体验。
其实算力这个词很不专业,给外行描述看的,就像什么云计算、数据湖等,让高深的东西具现化,但是对应学术专业上就很模糊。
对于CPU来说完成复杂任务,大多数情况CPU利用率都不是很高,所以在响应用户需求和计算能力上需要取中,并不是算力越大越好。
其实操作系统的诞生就是为了尽可能的榨干计算机硬件的资源,协调CPU、内存、硬盘、各种外设进行协调工作,达到最大的效率。就像我们说用安卓有点卡,但是快,苹果不卡,但是可能运行慢,这就是操作系统设计的风格。
影响 CPU 算力因素:
- 核心数量:核心数量是衡量 CPU 并行处理能力的重要指标之一。每个核心可以独立执行任务,更多的核心意味着 CPU 可以同时处理更多的任务,从而显著提升并行计算的能力。现代 CPU 通常设计为多核心架构,这使得它们在处理复杂的、多线程任务时具有明显的优势。
- 时钟频率:时钟频率指的是 CPU 每秒钟可以执行的周期数,通常以 GHz(千兆赫兹)为单位。更高的时钟频率意味着 CPU 可以在更短的时间内完成更多的计算任务。
- 每个时钟周期的浮点运算次数:现代 CPU 架构采用超标量设计和向量化技术来增加每个时钟周期内可以执行的浮点运算次数。浮点运算是处理复杂计算任务的关键,特别是在科学计算和图形处理领域。
- 缓存和内存带宽:缓存和内存带宽是影响 CPU 数据访问速度的关键因素。高效的缓存系统和足够的内存带宽可以显著减少数据传输的延迟,提高整体计算效率。
- 指令集架构:指令集架构(ISA)是 CPU 如何执行指令的基础。不同的 ISA(如 x86、ARM、RISC-V)对浮点运算的支持和优化程度有所不同,直接影响 CPU 的算力表现。
纵轴表示性能倍数(如 1.00X 和 10.00X),而横轴表示时间,从 2006 年到 2026 年,展示了 20 年的技术变化。图中的蓝色圆点代表每次操作的能耗(Energy per operation),而橙色三角形代表密度(Density)。红色虚线表示密度随时间的增长趋势,绿色虚线表示每次操作能耗随时间的变化趋势。体现了逻辑电路技术在过去 20 年间取得了显著进步,随着工艺节点的缩小,每次操作的能耗不断降低,而晶体管的密度不断增加。
3.2 计算时延
CPU 计算时延是指从指令发出到完成整个指令操作所需的时间。
在讨论 CPU 计算时延时,我们需要深入理解内存、带宽和时延之间的关系,因为它们共同影响着计算机系统的性能表现。
内存和带宽的关系:内存的速度和系统带宽共同决定了数据在 CPU 和内存之间的传输效率。更高的内存带宽允许更多的数据在单位时间内传输,从而减少内存的访问时延。
带宽和时延的关系:高带宽通常能够减少数据传输所需的时间,因此可以间接降低时延。然而,增加带宽并不总是能线性减少时延,因为时延还受到其他因素的影响(如数据处理的复杂度和传输距离)。在低带宽环境下,时延会显著增加,因为数据需要更长时间才能传输到目的地,尤其在需要传输大数据量时更为明显。
内存和时延的关系:内存的速度和延迟直接影响 CPU 的访问时间。低延迟的内存允许更快的数据传输和指令处理,从而减少了 CPU 的等待时间和总体计算时延。内存的类型和架构(如 DDR 与 SRAM,单通道与双通道)也会影响访问延迟。优化内存配置可以显著降低时延,提高系统性能。
CPU 计算时延主要由以下几个部分组成:
指令提取时延(Instruction Fetch Time) :指令提取时延是指从内存中读取指令到将其放入指令寄存器的时间。这个时延受内存速度和缓存命中率的影响。内存的速度决定了从内存中读取指令的时间。更高速度的内存能够减少提取指令的时间。缓存层次结构(L1, L2, L3 缓存)会极大地影响提取时间。如果指令在缓存中命中,则可以快速获取,否则必须从较慢的主存储器中读取。
指令解码时延(Instruction Decode Time) :指令解码时延是指将从内存中读取的指令翻译成 CPU 能够理解的操作的时间。这个时延受指令集架构和解码逻辑复杂性影响。复杂指令集架构(CISC)通常有更长的解码时延,因为指令更复杂;相比之下,精简指令集架构(RISC)由于指令简洁,解码时延较短。解码单元的设计和复杂性也影响解码时延。更复杂的解码逻辑可能处理更多指令类型,但会增加时延。
执行时延(Execution Time) :执行时延是指 CPU 实际执行指令所需的时间。这个时延取决于指令的类型和 CPU 的架构,指令类型中不同的指令需要不同的执行时间。例如,简单的算术运算可能只需一个时钟周期,而复杂的浮点运算可能需要多个周期。而 CPU 架构中流水线深度、并行处理能力和指令重排序等技术都会影响指令的执行时延。
存储器访问时延(Memory Access Time) : 存储器访问时延是指 CPU 访问主存储器或缓存所需的时间。这个时延受缓存层次结构(L1, L2, L3 缓存)和内存带宽的影响。多级缓存(L1, L2, L3)可以减少访问主存储器的次数,从而降低访问时延。较高的缓存命中率会显著减少时延。内存带宽中高内存带宽支持更快的数据传输,减少访问时延。
写回时延(Write-back Time) :写回时延是指执行完指令后将结果写回寄存器或存储器的时间。这一过程也受缓存的影响。CPU 使用写回策略时,数据在更高级别的缓存中更新,而不是立即写入主存储器,从而减少写回时延,而且在多处理器系统中,缓存一致性协议确保各处理器的缓存一致性,这也会影响写回操作的时延。
影响计算时延因素:
CPU 时钟频率(Clock Frequency) :时钟频率越高,CPU 处理指令的速度越快,从而减少计算时延。然而,增加时钟频率会增加功耗和发热,需要有效的散热机制。
流水线技术(Pipelining) :流水线技术将指令执行分为多个阶段,每个阶段可以并行处理不同的指令,从而提高指令吞吐量,降低时延。但流水线的深度和效率对时延有直接影响。
并行处理(Parallel Processing) :多核处理器和超线程技术允许多个指令同时执行,显著降低计算时延。并行处理的效率依赖于任务的可并行性。
缓存命中率(Cache Hit Rate) : 高缓存命中率可以显著减少存储器访问时延,提高整体性能。缓存失效(Cache Miss)会导致较高的存储器访问时延。
内存带宽(Memory Bandwidth) :高内存带宽可以减少数据传输瓶颈,降低存储器访问时延,提升计算性能。
对于时延的产生,首先的因素就是CPU和内存之间的距离,图中显示了 CPU 和 DRAM 之间存在一定的物理距离。
- 电信号在 50 毫米的距离上传播的延迟约为 0.833 纳秒
- 电信号在 100 毫米的距离上传播的延迟约为 1.667 纳秒
计算速度由多个因素决定,包括内存时延、缓存命中率、计算操作效率和数据写回速度。在图中,决定性因素是内存时延(Memory Latency)。内存时延是指从主存储器(DRAM)读取数据到缓存的固有延迟。由于主存储器的速度远低于缓存和 CPU 寄存器,这一过程通常是最耗时的部分。
后记:
为什么讲NPU前要说下CPU的基础,因为NPU说到底没有本质的创新,只是把CPU的一部分技术给扩大了,具体就是多核,定制运算单元,增大寄存器SRAM,一切只是为了更加快速并行的运算,就连配套的编译器也是从通用编译器里面阉割衍生出来的,这就是计算机体系结构的魅力。
以前为什么计算机体系结构发展的慢,首先就是x86这种闭源一家独大,只能他自己卖芯片,自己造定制芯片技术垄断不可能,成本也高,市场小也养不起几家。现在技术和生产成本都降低了,是个产品都想定制自己的芯片了,这东西也慢慢普及了。其实技术老早都有,只是成本和大规模商业应用的问题。