旧世代计算所

 找回密码
 立即注册账号
搜索
热搜: Windows Intel
查看: 320|回复: 0

RISC & CISC

[复制链接]
  • TA的每日心情

    2025-7-2 20:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    8

    主题

    6

    回帖

    163

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    163
    发表于 2025-5-30 12:52:18 | 显示全部楼层 |阅读模式
    官方转载,原文链接:https://www.efish.top/archives/2025/651
    现代处理器的设计可以大致归入两个范畴:RISC(精简指令集)与 CISC(复杂指令集)。这并不是一个非此即彼的划分,而是一种在指令集设计哲学上的取向差异。理解它们之间的区别,有助于更深入理解CPU为何这样设计,某些优化为何必须存在,以及为何一些系统架构会对特定任务表现得更好。
    起点简述
    1970年代末到1980年代初,CISC 是主流方向。x86、Motorola 68000 等代表架构拥有几十甚至上百条指令,部分指令能够完成复杂的内存访问与数据变换操作。RISC 设计则是在1980年代由伯克利和IBM等提出,强调更少的指令、更固定的格式、更高的一致性,期望通过简化控制逻辑来提升指令执行效率。
    核心差异1. 指令集复杂度
    • CISC 处理器提供高度复杂的指令,如 REP MOVSB 可以一次性完成大段内存复制,甚至包括内存间的乘加操作(Load-Operate-Store)。
    • RISC 处理器提供的是原子化的操作,如单独的 LOAD、ADD、STORE,每条指令完成非常明确的基本操作,长度通常固定,解码器更简单。

    2. 寻址模式
    • CISC 提供多种寻址模式,如基址加变址、带偏移的间接寻址,甚至多级指针操作。
    • RISC 一般限制寻址方式,强调载入-操作-存储的模式,数据必须先从内存加载到寄存器,才能进行运算。

    这种差异直接影响译码器复杂度与微架构的实现:CISC需要更复杂的微指令控制单元,RISC则便于流水线设计。
    3. 指令执行周期
    • CISC 指令长度不一,执行时间也不定。部分操作可能需要多周期完成。
    • RISC 强调单周期执行,每条指令长度一致,便于实现五级或以上的流水线。

    4. 微码 vs 硬件解码
    • CISC 架构通常通过微码(microcode)将复杂指令翻译成内部的简单操作。例如Intel的x86处理器内部将 MOVS 等指令分解成多个微操作(uOps)。
    • RISC 则直接用硬件电路实现指令,无需微码中转,从而降低了指令延迟和硬件复杂度。

    5. 寄存器数量
    • RISC 架构(如 MIPS、ARM)通常有大量通用寄存器(32 个以上),减少对内存的依赖,提升运算效率。
    • CISC 架构(如传统 x86)寄存器较少,依赖栈帧与内存操作频繁,直到后期的x86-64才大幅增加寄存器数。

    对性能与实现的影响
    CISC 虽然指令功能强大,但它的复杂解码和多周期执行使得硬件优化变得困难。而 RISC 简单统一的结构使得流水线更深、更稳定,现代 CPU 超标量执行、多发射、乱序执行等高级优化大多基于 RISC 式内部设计。
    事实上,现代 x86 处理器虽然前端仍支持CISC指令,但其内部微架构早已转为RISC风格:指令在进入执行单元前会被拆分成微操作(micro-ops),这些微操作再进入乱序执行引擎,这是一种典型的“CISC外壳 + RISC核心”结构。
    指令范式对比:LODSB  LOAD + INCREMENT
    我们拿 x86 中的 LODSB 指令来举例。它是一个复合型的字符串操作指令,含义是:“从 DS:SI 指向的地址读取一个字节到 AL 寄存器,并自动将 SI 增加或减少(取决于方向标志位 DF)”。
    在 CISC 中:LODSB单条指令,执行两个动作:内存读取 + 寄存器自增,并带隐式操作数(SI、AL、DS)。

    在 RISC 中:
    RISC 无法用单指令表达该操作,需拆解为:
    LOAD   R1, 0(R2)    ; R2 = SI, R1 = ALADDI   R2, R2, 1    ; SI++
    虽然执行上需要两条指令,但好处是:
    • 所有操作都是显式的,便于预测、调试与分析
    • 可优化寄存器分配与指令调度
    • 指令长度统一,便于流水线与乱序调度

    RISC 架构通常配合寄存器重命名与指令调度器,能在多个执行单元间高效并行这类操作。
    流水线实现对比CISC 中的挑战
    CISC 的可变长度指令、复杂寻址模式,使得:
    • 解码单元必须有更多硬件状态机,甚至使用微码解释
    • 指令长度不一,难以提前预测 fetch 窗口边界
    • 难以做到真正意义的“每周期一条指令”发射

    虽然 Intel 等厂商通过前端微操作解码(μop cache + μop fusion)缓解了问题,但硬件代价极高。
    RISC 中的典型五级流水线(以 MIPS 为例):
    • IF(Instruction Fetch):取指
    • ID(Instruction Decode):译码并读取寄存器
    • EX(Execute):执行 ALU 运算或计算地址
    • MEM(Memory Access):访问内存(若有 LOAD/STORE)
    • WB(Write Back):写回寄存器

    RISC 指令长度固定(通常为 32 位),解码逻辑简单,易于做深度流水线,甚至超级流水线(Superpipeline)和多发射(Superscalar)。
    此外,RISC 便于实现流水线旁路(Forwarding)、静态调度(如 delay slot)等经典优化策略,减少数据相关引起的停顿。
    CPI(Cycles Per Instruction)理论模型:
    • RISC 平均 CPI 接近 1
      • 每条指令执行一个小动作
      • 配合流水线并行,理想状态每周期完成一条指令

    • CISC CPI 通常高于 1
      • 单指令执行多步骤,微码层执行多个周期
      • 解码、寻址、内存访问时间不确定


    但需注意:RISC CPI 低不代表 RISC 更快,因为最终性能取决于:
    • 程序需执行多少条指令(RISC 指令数量更多)
    • 各周期的时钟频率(复杂 CISC 指令限制频率)
    • 是否乱序执行/多发射/缓存命中等微架构因素

    实际对比:
    例如,执行一个简单的内存拷贝(128 字节):
    x86 CISC 版本:
    REP MOVSB
    • 单条指令,硬件内部完成全部循环、判断、移动操作
    • CPI 高,但指令数少

    RISC 模拟版本:
    loop:  LOAD  R1, 0(R2)       ; 从源地址加载  STORE R1, 0(R3)       ; 写入目标地址  ADDI  R2, R2, 1       ; 源地址++  ADDI  R3, R3, 1       ; 目标地址++  ADDI  R4, R4, -1      ; 计数器--  BNE   R4, R0, loop    ; 循环判断
    • 多条简单指令,流水线利用高
    • 更适合并行执行、指令级并行优化

    RISC 的 CPI 接近 1,但因为指令数高,总体执行时间未必更短。好在现代微架构能通过指令重排和分支预测等方式提高其吞吐。


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册账号

    本版积分规则

    Archiver|手机版|小黑屋|旧世代计算所 RetroLab wapmz.com

    GMT+8, 2025-7-27 19:26 , Processed in 0.024466 second(s), 20 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表