Appearance
多处理器的基本概念
考情分析
选择题偶尔考查,以概念辨析为主。Flynn 分类法的四种类型区分、硬件多线程三种方式的对比是常见考点,2022 年真题直接考过多处理器相关概念。
Flynn 分类法
根据指令流和数据流的数量,Flynn 将计算机体系结构分为四类:
| 类型 | 全称 | 指令流 | 数据流 | 典型代表 |
|---|---|---|---|---|
| SISD | 单指令流单数据流 | 1 | 1 | 传统单处理器 |
| SIMD | 单指令流多数据流 | 1 | 多 | 向量处理器、GPU |
| MISD | 多指令流单数据流 | 多 | 1 | 理论存在,实际几乎没有 |
| MIMD | 多指令流多数据流 | 多 | 多 | 多核处理器、多处理器系统 |
SISD
传统的串行计算机,一个处理器 + 一个存储器,按指令流顺序逐条执行。部分 SISD 计算机采用指令流水线技术来提升性能,但本质上仍是单指令流。
SIMD
采用数据级并行技术:一个指令控制单元 + 多个处理单元,所有处理单元同时执行同一条指令,但各自操作不同的数据。
适用场景:规则、同构的数据处理(如数组运算)。一条 SIMD 指令可以在 16 个 ALU 中并行处理 16 对数据,效率极高。
局限:遇到条件分支(switch/case)时效率显著下降,因为各处理单元需要执行不同操作,难以保持同步。
向量处理器是 SIMD 的典型实现,通过专用指令直接操作向量(一维数组),以流水化方式批量处理,在数值模拟等规则计算场景中性能优势明显。
MISD
多个指令流同时处理同一数据流。理论上存在,但在通用计算机中几乎没有实际应用。
MIMD
同时执行多条指令,分别处理多个不同数据流,是目前主流的并行计算模型。MIMD 进一步分为两类:
| 子类型 | 存储组织 | 通信方式 | 别称 |
|---|---|---|---|
| 多计算机系统 | 每个节点有私有存储器,地址空间独立 | 消息传递 | 消息传递型 MIMD |
| 多处理器系统 | 共享全局地址空间 | 共享存储(访存指令) | 共享存储型 MIMD |
总结:SIMD 属于数据级并行,适用于规则数据处理;MIMD 支持线程级或任务级并行,并行程度更高,适用范围更广。
硬件多线程
传统 CPU 的线程切换需要保存/恢复寄存器上下文,开销很大。硬件多线程为每个线程配备独立的寄存器组和 PC,切换时只需激活对应线程的硬件状态,无须读写内存,大幅降低切换延迟。
三种实现方式:
细粒度多线程(Fine-grained)
每个时钟周期切换线程,交替执行不同线程的指令。
时钟 i :发射线程 A 的指令 j, j+1
时钟 i+1:发射线程 B 的指令 k, k+1
时钟 i+2:发射线程 A 的指令 j+2, j+3
时钟 i+3:发射线程 B 的指令 k+2, k+3优点:功能部件利用率高。缺点:单个线程的执行速度被拉低(每隔一个周期才轮到自己)。
粗粒度多线程(Coarse-grained)
连续执行同一线程的指令,仅当遇到长延迟事件(如 Cache 缺失)导致流水线阻塞时才切换线程。
时钟 i :发射线程 A 的指令 j, j+1
时钟 i+1:发射线程 A 的指令 j+2, j+3 → 发现 Cache 缺失
时钟 i+2:线程调度,从 A 切换到 B
时钟 i+3:发射线程 B 的指令 k, k+1切换时需要清空被阻塞的流水线并重新填充,切换开销大于细粒度多线程。
同时多线程(SMT / 超线程)
单个时钟周期内同时发射并执行来自多个不同线程的多条指令,既利用了指令级并行,又实现了线程级并行。
时钟 i :发射线程 A 的指令 j, j+1 + 线程 B 的指令 k, k+1
时钟 i+1:发射线程 A 的指令 j+2 + 线程 B 的指令 k+2 + 线程 C 的指令 mSMT 通常构建于超标量 + 乱序执行的微架构之上,通过共享执行单元和缓存,在维持高单线程性能的同时提升整体吞吐率。
Intel 的超线程(Hyper-Threading) 就是 SMT 的典型实现:一个物理核心维护两套线程状态部件(寄存器组、PC),而缓存和 ALU 等执行资源由两个逻辑核心共享,实际性能提升约 10%~30%。
三种方式对比
| 特性 | 细粒度多线程 | 粗粒度多线程 | 同时多线程(SMT) |
|---|---|---|---|
| 切换时机 | 每个时钟周期 | 长延迟事件(如 Cache 缺失) | 不切换,同时执行 |
| 同一周期执行的线程数 | 1 | 1 | 多个 |
| 切换开销 | 极小 | 较大(需清空流水线) | 无切换开销 |
| 并行层次 | 线程级(时间交错) | 线程级(时间交错) | 指令级 + 线程级 |
多核处理器
多个独立处理核心集成在同一芯片上,也称片上多处理器(CMP)。
典型的 Cache 层次结构:
- 每个核拥有私有的 L1 Cache(有时也包括 L2)
- 多个核共享更高层级的 Cache(如 L3)
- 所有核通过互连网络共享主存储器
多核 vs 单核多线程的本质区别:多核架构下,每个核独立运行一个线程,实现物理上的真正并行。而单核的细粒度/粗粒度多线程只是时间交错执行,任一时刻仅有一个线程在运行(SMT 除外)。
一个直观的类比:搬 4 块石头到马路对面(每块 1 分钟)。串行处理器需要 4 分钟;双核处理器相当于两个人同时搬,2 分钟;向量处理器(SIMD)相当于用长木板同时推 4 块,1 分钟。多核靠增加处理单元实现任务级并行,向量处理器靠单指令多数据实现数据级并行。
共享内存多处理器(SMP)
多个处理器共享统一的物理地址空间,任意 CPU 可通过普通访存指令访问内存中的任意位置,通过读/写共享变量进行通信。
根据内存访问延迟的特性分为两类:
UMA(统一存储访问)
所有 CPU 访问任意内存单元的延迟基本相同,与发起请求的 CPU 及目标地址无关。
NUMA(非统一存储访问)
内存访问延迟取决于请求 CPU 与目标内存的物理位置关系。主存被划分为多个区域,分别连接到不同的 CPU。
| 特性 | UMA | NUMA |
|---|---|---|
| 内存控制器位置 | 集中式(早期北桥架构) | 分布式(集成到各 CPU 内部) |
| 访问延迟 | 均匀 | 本地内存快,远程内存慢 |
| 互连方式 | 前端总线(FSB) | 高速互连总线(如 Intel QPI) |
| 瓶颈 | 总线争用 | 数据布局敏感 |
| 可扩展性 | 较差 | 较好 |
NUMA 的出现是为了解决多核/多处理器系统中前端总线争用的性能瓶颈:把内存控制器集成到 CPU 内部,每个 CPU 直接连接一部分物理内存(本地内存),CPU 之间通过高速互连总线访问远程内存。
SMP 中的同步与一致性
多个 CPU 可能同时访问同一共享变量,必须引入同步机制保证原子性和数据一致性,常用方法是互斥锁。
SMP 系统的 Cache 一致性问题比单处理器更严格:多个 CPU 的 Cache 可能同时缓存同一物理地址的副本,任意时刻所有副本必须保持一致。这由硬件一致性协议保障,通过传播写操作或无效化其他 CPU 中的副本来维护全局一致性。
考点清单
- Flynn 分类法四种类型的区分:指令流数量 x 数据流数量
- SISD 是传统单处理器,MIMD 是主流多处理器
- SIMD 适合规则数据处理(向量处理器、GPU),遇条件分支效率下降
- MISD 理论存在,实际几乎没有
- MIMD 分为消息传递型(多计算机)和共享存储型(多处理器)
- 硬件多线程三种方式:细粒度(每周期切换)、粗粒度(长延迟切换)、SMT(同时执行多线程)
- 细粒度和粗粒度同一时刻只执行一个线程的指令,SMT 可同时执行多个线程的指令
- Intel 超线程 = SMT,两套线程状态 + 共享执行资源,提升约 10%~30%
- 多核处理器:私有 L1 Cache + 共享 L2/L3 Cache
- UMA 访问延迟均匀,NUMA 本地快远程慢
- SMP 中 Cache 一致性由硬件协议保障