Skip to content

第五章:中央处理器(CPU)

中央处理器(CPU)是计算机系统的核心,负责执行指令、处理数据和控制整个系统的运行。CPU的设计直接影响着计算机的性能、功耗和成本。

5.1 CPU概述

5.1.1 CPU的定义与功能

**中央处理器(Central Processing Unit, CPU)**是计算机的核心部件,负责:

  • 指令执行:执行程序中的指令
  • 数据处理:进行算术和逻辑运算
  • 系统控制:控制整个计算机系统的运行
  • 内存管理:管理内存的访问和分配

生动比喻:CPU就像人的大脑

  • 接收信息(取指令)
  • 思考处理(执行指令)
  • 做出反应(写回结果)
  • 控制身体各部分(控制其他部件)

5.1.2 CPU的基本组成

CPU主要由以下几个部分组成:

  1. 运算器(ALU):执行算术和逻辑运算
  2. 控制器(CU):控制指令的执行流程
  3. 寄存器组:存储临时数据和状态信息
  4. 内部总线:连接CPU内部各部件

5.2 CPU结构与功能

5.2.1 运算器(Arithmetic Logic Unit, ALU)

运算器是CPU的核心计算部件,负责执行各种算术和逻辑运算。

ALU的基本功能

  1. 算术运算

    • 加法、减法
    • 乘法、除法
    • 比较运算
  2. 逻辑运算

    • 与(AND)、或(OR)
    • 非(NOT)、异或(XOR)
    • 移位运算
  3. 标志位设置

    • 零标志(Z):结果为0时置1
    • 进位标志(C):有进位时置1
    • 溢出标志(V):溢出时置1
    • 符号标志(S):结果为负时置1

ALU的内部结构

输入A ──┐
        ├──→ ALU ──→ 输出结果
输入B ──┘     │
              └──→ 标志位

例子:8位ALU执行加法运算

  • 输入A:00001010(十进制10)
  • 输入B:00000101(十进制5)
  • 输出:00001111(十进制15)
  • 标志位:Z=0(非零),C=0(无进位),V=0(无溢出),S=0(正数)

5.2.2 控制器(Control Unit, CU)

控制器是CPU的指挥中心,负责控制指令的执行流程。

控制器的基本功能

  1. 指令译码:分析指令的操作码和操作数
  2. 时序控制:控制指令执行的时序
  3. 微操作控制:产生控制各部件工作的微操作信号
  4. 中断处理:处理各种中断请求

控制器的实现方式

硬连线控制

  • 用逻辑电路直接实现控制功能
  • 速度快,但灵活性差
  • 适用于RISC处理器

微程序控制

  • 用微程序实现控制功能
  • 灵活性好,但速度较慢
  • 适用于CISC处理器

5.2.3 寄存器组

寄存器是CPU内部的高速存储单元,用于存储临时数据和状态信息。

通用寄存器

用于存储操作数和中间结果。

例子:x86-64架构的通用寄存器

  • RAX、RBX、RCX、RDX:64位通用寄存器
  • EAX、EBX、ECX、EDX:32位通用寄存器
  • AX、BX、CX、DX:16位通用寄存器

专用寄存器

程序计数器(PC)

  • 存储下一条要执行指令的地址
  • 每执行一条指令自动递增
  • 分支指令会修改PC的值

指令寄存器(IR)

  • 存储当前正在执行的指令
  • 指令译码器从IR读取指令内容

状态寄存器(PSW)

  • 存储CPU的状态信息
  • 包括标志位、中断使能位等

栈指针(SP)

  • 指向栈顶的地址
  • 用于函数调用和局部变量存储

5.3 指令流水线

5.3.1 流水线的基本概念

指令流水线是将指令执行过程分解为多个阶段,多个指令可以同时在不同阶段执行,从而提高CPU的吞吐量。

基本流水线阶段

  1. 取指(IF, Instruction Fetch):从内存中取出指令
  2. 译码(ID, Instruction Decode):分析指令的操作码和操作数
  3. 执行(EX, Execute):执行指令指定的操作
  4. 访存(MEM, Memory Access):访问内存(如果需要)
  5. 写回(WB, Write Back):将结果写回目标位置

流水线执行示例

无流水线(串行执行):

指令1: IF → ID → EX → MEM → WB
指令2:           IF → ID → EX → MEM → WB
指令3:                     IF → ID → EX → MEM → WB

有流水线(并行执行):

时钟周期: 1  2  3  4  5  6  7  8
指令1:    IF ID EX MEM WB
指令2:       IF ID EX MEM WB
指令3:          IF ID EX MEM WB
指令4:             IF ID EX MEM WB

性能提升:理论上,5级流水线可以将吞吐量提高5倍。

5.3.2 流水线冒险(Pipeline Hazards)

流水线冒险是指流水线执行过程中出现的冲突,导致流水线无法正常工作。

数据冒险(Data Hazard)

后续指令需要前面指令的结果,但结果还没有写回。

例子

text
ADD R1, R2, R3    ; R1 = R2 + R3
SUB R4, R1, R5    ; R4 = R1 - R5(需要R1的值)

解决方案

  1. 数据转发(Data Forwarding):将结果直接转发给需要的指令
  2. 流水线停顿(Pipeline Stall):暂停后续指令的执行
  3. 编译器优化:重新排列指令顺序

控制冒险(Control Hazard)

分支指令改变了程序执行顺序,导致取到的指令不正确。

例子

text
BEQ R1, R2, label ; 如果R1==R2,跳转到label
ADD R3, R4, R5    ; 这条指令可能不应该执行

解决方案

  1. 分支预测(Branch Prediction):预测分支的方向
  2. 延迟分支(Delayed Branch):在分支指令后插入有用指令
  3. 分支目标缓冲(BTB):缓存分支目标地址

结构冒险(Structural Hazard)

多个指令同时需要使用同一个硬件资源。

例子:指令和数据同时访问内存

解决方案

  1. 资源复制:增加硬件资源
  2. 流水线停顿:暂停冲突的指令
  3. 资源调度:合理安排资源使用

5.3.3 分支预测

分支预测是解决控制冒险的重要技术。

静态分支预测

编译时或设计时确定的预测策略。

总是预测不跳转

  • 简单但准确率不高
  • 适用于大多数分支不跳转的情况

总是预测跳转

  • 适用于循环中的分支

基于分支方向的预测

  • 向后跳转预测为跳转(通常是循环)
  • 向前跳转预测为不跳转(通常是条件判断)

动态分支预测

运行时根据历史信息进行预测。

1位预测器

  • 记录上次分支的结果
  • 预测下次分支结果与上次相同

2位预测器

  • 使用状态机记录分支历史
  • 状态:强不跳转、弱不跳转、弱跳转、强跳转

例子:2位预测器状态转换

强不跳转 → 弱不跳转 → 弱跳转 → 强跳转
   ↑         ↑         ↑         ↑
 不跳转    不跳转     跳转      跳转

5.4 性能指标

5.4.1 基本性能指标

时钟频率(Clock Frequency)

CPU的时钟频率表示每秒时钟周期数,单位为Hz。

例子

  • 3.0 GHz = 3,000,000,000 Hz
  • 每秒30亿个时钟周期

注意:时钟频率高不一定意味着性能好,还要考虑每个时钟周期完成的工作量。

CPI(Cycles Per Instruction)

每条指令平均需要的时钟周期数。

公式:CPI = 总时钟周期数 / 指令总数

例子

  • 简单指令:CPI = 1
  • 复杂指令:CPI = 10
  • 平均CPI = 2.5

MIPS(Million Instructions Per Second)

每秒执行的百万条指令数。

公式:MIPS = 指令总数 / (执行时间 × 10⁶)

例子

  • 执行1000万条指令用时1秒
  • MIPS = 10,000,000 / (1 × 10⁶) = 10 MIPS

FLOPS(Floating Point Operations Per Second)

每秒执行的浮点运算次数。

例子

  • 单精度浮点运算:GFLOPS(10⁹ FLOPS)
  • 双精度浮点运算:GFLOPS
  • 现代GPU:TFLOPS(10¹² FLOPS)

5.4.2 性能计算公式

执行时间公式

基本公式

执行时间 = 指令数 × CPI × 时钟周期时间
执行时间 = 指令数 × CPI / 时钟频率

例子

  • 指令数:1,000,000条
  • CPI:2.5
  • 时钟频率:2.0 GHz
  • 执行时间 = 1,000,000 × 2.5 / 2,000,000,000 = 0.00125秒

性能提升公式

Amdahl定律

加速比 = 1 / ((1 - P) + P/S)

其中:

  • P:可并行部分的比例
  • S:并行部分的加速比

例子

  • 程序80%可以并行化
  • 并行部分加速比为4倍
  • 总加速比 = 1 / ((1 - 0.8) + 0.8/4) = 1 / (0.2 + 0.2) = 2.5倍

5.4.3 性能优化技术

指令级并行(ILP)

通过硬件技术让多条指令并行执行。

超标量(Superscalar)

  • 每个时钟周期发射多条指令
  • 需要多个执行单元

例子:2路超标量处理器

时钟周期: 1  2  3  4  5
指令1:    IF ID EX MEM WB
指令2:    IF ID EX MEM WB
指令3:       IF ID EX MEM WB
指令4:       IF ID EX MEM WB

超长指令字(VLIW)

  • 编译器将多条指令打包成一条长指令
  • 硬件简单,但编译器复杂

数据级并行(DLP)

对多个数据同时执行相同操作。

SIMD(Single Instruction, Multiple Data)

  • 一条指令处理多个数据
  • 适用于向量运算

例子:SIMD加法

传统方式:
A[0] + B[0] = C[0]
A[1] + B[1] = C[1]
A[2] + B[2] = C[2]
A[3] + B[3] = C[3]

SIMD方式:
[A[0], A[1], A[2], A[3]] + [B[0], B[1], B[2], B[3]] = [C[0], C[1], C[2], C[3]]

5.5 现代CPU架构

5.5.1 多核处理器

多核架构

对称多处理(SMP)

  • 所有核心功能相同
  • 共享内存和缓存
  • 操作系统可以调度任务到任意核心

非对称多处理(AMP)

  • 不同核心功能不同
  • 大核心处理复杂任务,小核心处理简单任务
  • 例如:ARM的big.LITTLE架构

缓存一致性

多核处理器需要保证缓存数据的一致性。

MESI协议

  • Modified(已修改):缓存中的数据已被修改
  • Exclusive(独占):缓存中的数据是唯一的
  • Shared(共享):多个缓存都有相同的数据
  • Invalid(无效):缓存中的数据无效

5.5.2 乱序执行

**乱序执行(Out-of-Order Execution)**允许指令不按程序顺序执行,只要不影响最终结果。

例子

text
LOAD R1, [0x1000]  ; 从内存加载数据
ADD R2, R3, R4     ; 不依赖R1的运算
MUL R5, R1, R6     ; 依赖R1的运算

乱序执行

  • ADD指令可以在LOAD指令完成前执行
  • MUL指令必须等待LOAD指令完成

5.5.3 推测执行

**推测执行(Speculative Execution)**在不确定结果的情况下预先执行指令。

分支推测

  • 预测分支方向
  • 预先执行预测路径的指令
  • 如果预测错误,撤销执行结果

例子

text
BEQ R1, R2, label  ; 分支指令
ADD R3, R4, R5     ; 推测执行的指令

5.6 CPU设计考虑

5.6.1 功耗管理

动态功耗

公式:P = α × C × V² × f 其中:

  • α:活动因子
  • C:负载电容
  • V:工作电压
  • f:时钟频率

降低功耗的方法

  1. 降低电压:功耗与电压的平方成正比
  2. 降低频率:功耗与频率成正比
  3. 减少活动因子:关闭不用的功能模块

静态功耗

即使不工作也会消耗的功耗。

降低静态功耗的方法

  1. 门控时钟:关闭不用的时钟
  2. 电源门控:关闭不用的电源域
  3. 多阈值电压:使用高阈值电压的晶体管

5.6.2 可靠性设计

错误检测与纠正

奇偶校验

  • 检测单比特错误
  • 简单但只能检测,不能纠正

ECC(Error Correcting Code)

  • 检测和纠正多比特错误
  • 用于内存和缓存

冗余设计

  • 关键部件使用冗余设计
  • 提高系统可靠性

5.7 总结

本章介绍了CPU的核心概念和设计原理:

  1. CPU基本组成:运算器、控制器、寄存器组
  2. 指令流水线:提高吞吐量的关键技术
  3. 流水线冒险:数据冒险、控制冒险、结构冒险及其解决方案
  4. 性能指标:CPI、MIPS、FLOPS等性能度量
  5. 现代架构:多核、乱序执行、推测执行等先进技术

CPU设计需要在性能、功耗、成本、可靠性之间找到平衡。随着技术的发展,CPU架构不断演进,出现了多核、异构计算、神经网络处理器等新的发展方向。理解CPU的工作原理对于系统设计、性能优化和故障诊断都具有重要意义。


外部参考