SISD、SIMD、MIMD 的基本概念
5.6 把单个处理器的指令级并行挖到了头。这一节开始复制处理器本身。
这一节的教材写法是四个缩写加四段定义,读完能背下来却用不出去。问题出在顺序:Flynn 分类是一个事后的归纳,它归纳的是一批真实存在的机器。先看机器再看分类,四个格子就都有内容了;先看分类,就只剩四个空盒子。
所以本节倒过来写:先给每一类一段能跑的代码或一台能叫出名字的机器,再回头填分类表。
机制
判据:复制了什么,共享了什么
Flynn 分类的定义是”指令流的条数 × 数据流的条数”,但这个说法对做题没什么帮助。真正好用的判据是下面这张表。
| 取指译码部件 (控制器) | 运算部件 (ALU) | 内存 | 一句话 | |
|---|---|---|---|---|
| SISD | 1 | 1 | 1 | 普通单核处理器 |
| SIMD | 1(共享) | 多(复制) | 共享 | 一条指令,同时算一批数 |
| MISD | 多 | 1 | —— | 现实中不存在 |
| MIMD | 多(复制) | 多(复制) | 共享或各自独立 | 多个完整的处理器 |
这一行是全节的钥匙。 SIMD 之所以便宜、之所以适合规整的数据,全因为它省下了取指译码这一大块硬件——几百个 ALU 共用一套控制器。
一、SISD:先把它讲清楚,因为它最容易被判错
单指令流单数据流:一条指令流、一条数据流,就是一台普通的单核处理器。
关键在于哪些东西”看起来并行但仍然是 SISD”:
| 技术 | 是不是 SISD | 理由 |
|---|---|---|
| 流水线 | ✅ 仍是 SISD | 只有一条指令流,只是各段重叠 |
| 超标量 | ✅ 仍是 SISD | 每拍发多条,但它们来自同一条指令流 |
| 乱序执行 | ✅ 仍是 SISD | 顺序被打乱,流还是一条 |
| 多核 | ❌ MIMD | 有多条独立的指令流 |
判据:有几条独立的指令流。 超标量每拍取 4 条指令,但这 4 条来自同一个程序、同一个 PC 的连续位置——是一条流被切开,不是四条流。
这就是为什么 5.6 整节都在 SISD 内部打转:指令级并行的所有技术,无论多复杂,都没有增加指令流的条数。
顺带把”时间并行”和”空间并行”分清楚,这是选择题的常客:
| 做法 | 例子 | |
|---|---|---|
| 时间并行 | 同一套部件在不同时刻处理不同任务的不同阶段 | 流水线 |
| 空间并行 | 复制部件,同时处理 | 超标量、SIMD、多核、多处理器 |
流水线是唯一的时间并行,其余全是空间并行。多核属于空间并行——这一条直接就是一道真题的答案。
二、SIMD:一条指令算一批数
先看代码,不看定义。
for (i = 0; i < 4; i++)
c[i] = a[i] + b[i];SISD 的做法:循环四次,四条加法指令,每条算一个。
SIMD 的做法:一条指令算完。x86 的 SSE 指令:
movups xmm0, [a] ; 一次装入 4 个 float(128 位)
movups xmm1, [b]
addps xmm0, xmm1 ; 一条指令,4 个加法同时做
movups [c], xmm0addps 就是一条 SIMD 指令——一次取指、一次译码,然后 4 个 ALU 同时干活。
“SIMD 到底是什么”这个问题的最短答案就是这个比值。 它不是一个体系结构学派,它就是”一条指令一次算多个数”这件事,落在硬件上是”多个 ALU 共用一套控制器”。
SIMD 的三种常见形态:
| 形态 | 长什么样 | 例子 |
|---|---|---|
| 向量处理器 | 有专门的向量寄存器(能存一整个数组),指令直接对向量操作 | Cray、现代的 RISC-V V 扩展 |
| SIMD 指令扩展 | 在通用 CPU 里加一组宽寄存器和配套指令 | x86 的 MMX / SSE / AVX、ARM 的 NEON |
| GPU | 极多的简单核心共用少量控制器 | 图形渲染、深度学习 |
GPU 是 SIMD 思想最彻底的实现:几千个运算单元,控制器却很少——因为图形和矩阵运算天然是”对一大堆数据做同一件事”。 这也解释了 GPU 为什么不适合跑分支很多的通用代码:分支意味着不同数据要走不同的路,而 SIMD 的前提正好是”大家做同一件事”。
SIMD 的适用条件(也是它的局限):
数据必须规整、操作必须一致、分支必须少。
这三条不满足时,SIMD 的运算部件就会大量空转——比如 4 路 SIMD 里只有 1 个元素需要处理,另外 3 个 ALU 白跑。
SIMD 属于「数据级并行」(DLP),与 5.6 的指令级并行(ILP)、5.7.2 之后的线程级并行(TLP)是三个不同层次,这是 5.1.1 立的第二条主线的完整形态:
三、MISD:为什么它不存在
多条指令流处理同一条数据流。
现实中没有这样的机器,理由很简单:多条指令对同一个数据做不同的操作,结果放在哪? 若各自保存,那就是各自有各自的数据流,成了 MIMD;若共同产生一个结果,那些操作之间必然有依赖,也就退化成一条串行的指令流。
考试口径:MISD 不存在(有些资料把脉动阵列或某些容错系统勉强归入,408 不采纳)。遇到就选”不存在”或”实际上没有这类计算机”。
四、MIMD:真正的多处理器
多条指令流、多条数据流——多个完整的处理器各跑各的程序。
它按”内存是不是共享的”分成两大类,这个划分比 Flynn 分类本身更重要:
| 共享内存多处理器(SMP / 多处理器系统) | 多计算机系统(消息传递 / 集群) | |
|---|---|---|
| 内存 | 单一物理地址空间,所有处理器都能访问 | 每个结点有自己独立的地址空间 |
| 通信方式 | 读写同一个内存单元(隐式) | 显式收发消息(send / recv) |
| 同一个地址 | 在所有处理器上指向同一个存储单元 | 在不同结点上指向不同的存储单元 |
| 典型 | 多核 CPU、双路服务器 | 机群、超算、分布式系统 |
| 本章 | 5.7.4 | —— |
“同一个地址是不是指向同一个单元”这一行是最干净的判据,比”内存是否共享”这种说法更可操作。
共享内存的编程更容易(直接读写变量),但需要解决同步和一致性问题——这是 5.7.4 的 Cache 一致性、以及 OS 2.3 整章的来源。消息传递不需要一致性协议,但程序要自己管数据在哪。
疑问点:多处理机这部分书上讲的全是概念,太抽象了;能不能先细讲 SISD 那四种体系结构,且限定在 408 范围内
“太抽象”的根源在于教材的顺序:它先给四个定义,再举例。而这四个格子里,有一个不存在、有一个是你天天在用的、有一个只是一条汇编指令——先认这三件事,分类表就不空了。
一、四个格子里,只有三个有内容,而且其中一个是你每天都在用的。
是什么 你见过它吗 SISD 普通单核 每天——流水线、超标量、乱序全都还是 SISD SIMD 一条指令算一批数 每天——你的 CPU 里有 SSE/AVX,浏览器解码视频就在用 MISD —— 不存在,直接划掉 MIMD 多个完整处理器 每天——你那台 10 核的机器就是 划掉 MISD 之后只剩三格,而这三格的判据只有一条:复制了什么。
- SISD:什么都没复制(内部再并行也不算)
- SIMD:只复制 ALU,控制器共用 → 一条指令喂饱一排 ALU
- MIMD:控制器和 ALU 一起复制 → 每个核都能独立取指译码,跑自己的程序
二、SIMD 不是一个学派,它就是一条指令。
c[0..3] = a[0..3] + b[0..3]这件事,普通写法是四条add,SIMD 写法是一条addps。取指译码从 4 次变成 1 次,加法还是 4 个。省下来的是控制器的工作量,不是运算量。 这就是为什么 GPU 能塞进几千个运算单元——它们不需要几千套取指译码电路。
三、“MIMD 内部怎么分”,比 Flynn 分类本身更该记。
因为 408 后面几节讲的全是 MIMD 内部的事:
MIMD ┬─ 共享内存多处理器 ── 5.7.3 多核、5.7.4 UMA/NUMA/SMP、Cache 一致性 └─ 多计算机(消息传递) ── 408 只要求知道它与共享内存的区别判据是”同一个地址在不同处理器上是不是同一个存储单元”:是 → 共享内存;否 → 多计算机。
四、408 的边界在哪。
要求 内容 必须掌握 Flynn 四分类的判据、SIMD 与 MIMD 的区别、共享内存与消息传递的区别、UMA/NUMA、SMP、硬件多线程三种、多核、Cache 一致性的概念 不要求 具体的一致性协议实现(MESI 的状态转换)、互连网络拓扑、具体的并行编程模型 常考形式 全部是选择题,考概念辨析,不出计算题 所以这一节的复习目标是”每个名词能说出它复制了什么、共享了什么、解决什么问题”,而不是记住定义的字面。
Flynn 分类回填
现在再看那张定义表,每一格都有东西了:
| 单数据流 | 多数据流 | |
|---|---|---|
| 单指令流 | SISD——单核(含流水线、超标量、乱序) | SIMD——向量处理器、SSE/AVX、GPU |
| 多指令流 | MISD——不存在 | MIMD——多核、多处理器、集群 |
边界
边界辨析:超标量属于 SISD 还是 MIMD
SISD。 判据是独立指令流的条数:超标量每拍取多条指令,但它们来自同一条指令流(同一个 PC 的连续位置)。
只有多核 / 多处理器才有多条独立的指令流。
边界辨析:时间并行 / 空间并行
- 时间并行:同一套部件在不同时刻做不同阶段 → 只有流水线
- 空间并行:复制部件 → 超标量、SIMD、多核、多处理器
“双核 CPU 是时间并行”是错的,它是空间并行。
边界辨析:SIMD / MIMD
SIMD 只复制运算部件,共用一套控制器——所有 ALU 在同一拍做同一个操作。 MIMD 连控制器一起复制——各核可以执行完全不同的程序。
判据:能不能各跑各的程序。
边界辨析:共享内存 / 消息传递
同一个地址在不同处理器上是不是同一个存储单元?
- 是 → 共享内存多处理器,通信靠读写变量,需要 Cache 一致性
- 否 → 多计算机系统,通信靠显式
send/recv,不需要一致性协议
边界辨析:MISD
不存在。 遇到”下列哪种结构实际上不存在”直接选它。
对照速查
| 结构 | 指令流 | 数据流 | 复制了什么 | 例子 |
|---|---|---|---|---|
| SISD | 1 | 1 | 无 | 单核(含流水线、超标量) |
| SIMD | 1 | 多 | 运算部件 | 向量机、SSE/AVX、GPU |
| MISD | 多 | 1 | —— | 不存在 |
| MIMD | 多 | 多 | 控制器 + 运算部件 | 多核、多处理器、集群 |
| 并行层次 | 名称 | 靠什么 | 本书哪一节 |
|---|---|---|---|
| 指令级 ILP | 指令级并行 | 流水线、超标量、乱序 | 5.6 |
| 数据级 DLP | 数据级并行 | SIMD、向量、GPU | 本节 |
| 线程级 TLP | 线程级并行 | 硬件多线程、多核、多处理器 | 5.7.2~5.7.4 |
考点
- Flynn 四分类判断:给一台机器判类型。判据是独立指令流条数。
- MISD 不存在:直接送分。
- 超标量 / 流水线仍属 SISD:高频陷阱。
- 时间并行 vs 空间并行:流水线是时间并行,多核和 SIMD 是空间并行。
- 共享内存 vs 消息传递:判据是”同一地址是否同一单元”。
- 三个并行层次的对应:ILP / DLP / TLP 分别靠什么技术。
链接
- 🏠 返回总览:计算机组成原理第 5 章:中央处理器总览
- ⬅️ 上一节:5.6.5 高级流水线技术
- ➡️ 下一节:5.7.2 硬件多线程的基本概念
- 🔗 指令级并行的天花板:5.6.5 高级流水线技术
- 🔗 OS 对照:OS 2.1.6 线程模型
- 📖 名词库:第 5 章名词库