多处理器
本节重点是辨认并行结构的基本概念,区分指令流与数据流、物理核心与逻辑核心,以及共享内存多处理机的组织方式。
弗林分类法
弗林分类法(Flynn’s Taxonomy)是一种计算机体系结构的分类方法,由 弗林(Michael J. Flynn)于 1966 年提出。它根据计算机中 指令流 和 数据流 的数量,将计算机体系结构分为 SISD、SIMD、MIMD、MISD 四类:
| 数据流 \ 指令流 | 单一指令流 | 多指令流 |
|---|---|---|
| 单一数据流 | 单指令流单数据流(SISD) | 多指令流单数据流(MISD) |
| 多数据流 | 单指令流多数据流(SIMD) | 多指令流多数据流(MIMD) |
指令流、数据流
指令 是告诉计算机执行特定操作的命令,例如“加法”、“减法”、“数据移动”等。 指令流 就是程序中一系列指令的有序集合,它决定了计算机执行的步骤。换句话说,指令流 就是“计算机要做什么”。
数据 可以是数字、字符、图像、视频等各种形式的信息。 数据流 指的是计算机在执行指令时处理的数据序列。换句话说,数据流 就是“计算机要处理什么”。
SISD
SISD (Single Instruction Single Data) 指的是单指令流单数据流,每个指令部件每次仅译码一条指令,而且在执行时仅为操作部件提供一份数据。
如上图所示,一个 处理单元(PU,Processing Unit)接收单条 指令流,执行每条指令时,对单独的 数据 进行操作。
SIMD
SIMD(Single Instruction Multiple Data)指的是单指令流多数据流,允许对多个数据点执行相同的操作,实现 数据级并行性。
如上图所示,SIMD 架构的计算机包含多个 处理单元,每个 处理单元 在同一个时刻执行相同的指令,但是对不同的 数据 进行操作。
这种方式可以大幅度提升计算的并行性。比如对于一个 的矩阵加法,在 SISD 中,一个处理单元通常需要依次完成 个元素加法;在 SIMD 中,如果有 个处理单元并且数据供给不存在瓶颈,则可每轮并行完成一行的 个元素加法,约需 轮。
补充:SIMD 与 SIMT
除了 SIMD 之外,还有一个 SIMT,大家需要有所区分。 简单来说,SIMD 是在一个处理器或向量单元内设置多个可并行的数据通道(lane):一条指令驱动这些通道对多个元素执行同一操作,从而实现 数据并行性。它不是简单地把多颗能独立取不同指令的处理器“堆”在一起;后者更接近 MIMD 的组织方式。 但是这里也有一个限制,就是不同的 处理单元 在同一个时刻必须执行相同的指令。
SIMT(Single Instruction Multiple Threads)是一种并行处理形式,其中单条指令面向多个线程执行,是 GPU 常见的执行组织方式。 与传统 SIMD 的显式向量操作不同,SIMT 向程序员暴露线程语义;但同一 warp 内的线程通常仍按同一指令发射。若分支路径不同,会发生分支发散并分批执行各路径,而不是让同一 warp 在同一时刻任意执行不同指令。
MISD
MISD(Multiple Instruction Multiple Data)指的是多指令流单数据流,即多个 处理单元 同时对同一份 数据 执行不同的指令。 这种架构在实际应用中非常罕见,因为它难以实现,并且适用场景有限。 一些 容错系统 可能采用 MISD 架构,通过多个不同的 处理单元 对同一份 数据 进行计算,然后比较结果以确保正确性。
MIMD
MIMD(Multiple Instruction Multiple Data)指的是多指令流多数据流,多个 处理单元 同时对不同的 数据 执行不同的指令。 现代计算机中的 多核处理器 就是 MIMD 架构的典型代表。
如上图所示,与 SIMD 不同,MIMD 中的不同 处理单元 可以去处理不同的 指令流。
多核处理器
物理核心
物理核心 是 CPU 芯片上实际存在的、独立的硬件 处理单元。 每个 物理核心 都有独立的取指、译码和执行资源,能够独立执行指令;缓存层次依具体实现而定,常见的 L1(以及有时的 L2)为私有,而末级缓存和内存接口可能由多个核心共享。 物理核心是真实的硬件存在,是 CPU 进行计算的基础。
逻辑核心
逻辑核心 是通过 超线程(Hyper-Threading)等技术,在一个 物理核心 上虚拟出的多个 逻辑处理单元。 超线程 技术允许一个 物理核心 同时执行多个 线程,从而提高 CPU 的利用率。 逻辑核心是操作系统层面识别的 虚拟处理单元,并非真实的硬件存在。
超线程
超线程 技术的核心思想是让一个 物理核心 呈现为多个 逻辑核心,从而让多个硬件线程并发驻留。每个逻辑核心拥有独立的体系结构状态,如程序计数器和寄存器集合;它们通常共享物理核心中的取指、译码、执行单元和缓存等资源。
超线程 技术旨在提高 CPU 的利用率,特别是在多线程应用程序中。 然而,超线程并不意味着性能翻倍。由于多个 逻辑核心 共享相同的 物理执行资源,性能收益取决于程序并行度、资源冲突和存储访问行为,不能用固定百分比概括。
简单来说,物理核心 是实际存在的“房子”,逻辑核心 是在“房子”里隔出来的“房间”。
共享内存多处理机
共享内存多处理机(Shared Memory Multiprocessor)是一种并行计算机体系结构,其中多个处理器共享同一个 物理内存空间。这种架构允许处理器之间通过读写 共享内存 来进行通信和数据交换,从而实现并行计算。
共享内存多处理机 有两大主要架构特点:
- 共享内存空间 :
- 所有处理器都可以访问同一个 物理内存空间,使得数据共享变得简单高效。
- 处理器之间通过读写 共享内存 中的数据来进行通信和同步。
- 处理器互连 :
- 处理器通过互连网络(如总线、交叉开关等)连接到 共享内存。
- 互连网络的性能对 共享内存多处理机 的整体性能有重要影响。
共享地址空间不等于所有访问延迟都相同:UMA 中各处理器访问主存的时间大体一致,NUMA 中访问本地内存通常快于远端内存。无论采用哪种组织,多处理器还需要缓存一致性机制保证各核心观察到的共享数据满足体系结构规定。
并行收益、缓存一致性与可扩展性的边界
核心数增加只能加速可并行的部分。若程序中比例 能被理想地分到 个处理器并行执行,忽略其他开销时,Amdahl 定律给出的加速比为
串行部分会限制总加速比的上限,实际系统还要承担任务划分、同步、负载不均、互连争用和远端访存等代价。因此“八核一定比四核快两倍”既忽略了程序并行度,也忽略了共享资源瓶颈。
共享内存多处理机中,每个核心可能把同一内存块缓存在自己的私有 Cache。一个核心写入后,其他核心若继续读旧副本就会得到过期数据;缓存一致性协议负责使同一地址的读写结果符合规定,例如更新或使其他副本失效。一致性关注单个内存位置的副本是否协调,内存一致性模型则进一步规定不同位置的读写在各核心看来允许以何种顺序出现,二者不能混为一谈。
假共享说明即使两个线程修改不同变量,若变量恰好位于同一 Cache 块,仍可能反复触发该块在核心间转移,导致性能下降。NUMA 还要求关注数据放置:线程频繁访问的数据若位于本地内存,延迟通常低于跨节点访问。SIMD 适合对许多元素执行同一操作的数据并行,MIMD 更适合不同线程执行不同控制流的任务;超线程则只是让一个物理核心同时维护多套体系结构状态,执行单元、Cache 等资源仍会共享,不能把逻辑核心当成完整独立的物理核心。