SISD、SIMD、MIMD 的基本概念

5.6 把单个处理器的指令级并行挖到了头。这一节开始复制处理器本身。

这一节的教材写法是四个缩写加四段定义,读完能背下来却用不出去。问题出在顺序:Flynn 分类是一个事后的归纳,它归纳的是一批真实存在的机器。先看机器再看分类,四个格子就都有内容了;先看分类,就只剩四个空盒子。

所以本节倒过来写:先给每一类一段能跑的代码或一台能叫出名字的机器,再回头填分类表。

机制

判据:复制了什么,共享了什么

Flynn 分类的定义是”指令流的条数 × 数据流的条数”,但这个说法对做题没什么帮助。真正好用的判据是下面这张表。

取指译码部件
(控制器)
运算部件
(ALU)
内存一句话
SISD111普通单核处理器
SIMD1(共享)多(复制)共享一条指令,同时算一批数
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], xmm0

addps 就是一条 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

不存在。 遇到”下列哪种结构实际上不存在”直接选它。

对照速查

结构指令流数据流复制了什么例子
SISD11无单核(含流水线、超标量)
SIMD1多运算部件向量机、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 分别靠什么技术。

链接