并行编程:原理、挑战与实践
立即解锁
发布时间: 2025-08-16 00:06:17 阅读量: 4 订阅数: 16 


软件开发的艺术:从设计到编码的全面指南
### 并行编程:原理、挑战与实践
#### 1. 并行与并发的概念引入
在一些场景中,并行和并发能显著提升效率。以国际象棋比赛为例,原本一位象棋大师要进行10场比赛,采用串行方式(一场接一场地进行),假设每场比赛10分钟,每步棋选手用时50秒,大师移动到下一桌用时6秒,总共需要101分钟。
若俱乐部聘请了第二位象棋大师,采用并行方式,每位大师只需进行5场比赛。若依旧采用串行方式比赛,比赛总时长变为50.5分钟(101 / 2)。但如果采用并发且并行的方式,两位大师同时进行各自的5场比赛,每位大师每6秒走一步棋并移动到下一桌。这样,比赛总共进行11轮,移动时间仅需30秒(因为每位大师只需在5张桌子间移动),整个比赛用时为11 * 56 + 11 * 30 = 616 + 330 = 946秒,即15.77分钟,这是几种比赛方式中用时最短的。
需要注意的是,并发是算法的属性,而并行是机器的属性。
#### 2. 并行计算机架构分类
计算机科学家早在50年前就认识到并行性可用于提高性能和处理大规模问题。下面介绍几种不同的并行计算机架构:
- **Flynn分类法**:1966年,Michael Flynn提出了计算机架构的分类法,最初包含四种模型架构:
- **SISD(单指令流,单数据流)**:这是经典的冯·诺依曼单处理器计算机架构,一次只有一个程序运行,处理单一数据流。
- **MISD(多指令流,单数据流)**:该架构中多个不同程序在同一数据流上执行,可能产生不同结果,程序同步运行。采用这种架构的机器非常罕见,例如尝试用多种不同算法在不同处理单元上破解密码的机器。
- **SIMD(单指令流,多数据流)**:这是最常见的架构之一,一个程序在不同处理器上运行,每个处理器使用不同的数据流。这些数据流可以是数据的分区集合,每个子集都要进行相同的计算。例如,气象模型可以使用这种架构来预测飓风路径。不过,由于系统中的所有机器都同步运行相同的程序,SIMD机器不太适合提高并发程序的性能。
- **MIMD(多指令流,多数据流)**:这是最通用的架构,多个程序在不同机器上同时运行,每个程序使用不同的数据流。这些程序不需要同步运行,因此可以执行并发程序并提高其性能。21世纪初,这是超级计算机最常见的模型,多核笔记本电脑或台式机系统也是MIMD机器。
近年来,又发展出两种变体架构:
- **SIMT(单指令流,多线程)**:该执行模型以SIMD为基础,但允许每个指令流同时执行多个线程。它在2000年代中期被提出,通常用于多核图形处理器,对数据流中有大量冗余的应用非常有用。
- **SPMD(单程序,多数据流)**:这是当今常见的并行编程执行模型,允许每个处理器独立执行程序,在不同(可能分区的)数据流上运行。由于程序独立运行,它们可以利用程序的并发部分来提高性能。尽管名称如此,SPMD是上述MIMD模型的一个子类别。
下面用表格总结这些架构:
| 架构名称 | 指令流 | 数据流 | 特点 | 适用场景 |
| ---- | ---- | ---- | ---- | ---- |
| SISD | 单 | 单 | 经典单处理器架构 | 传统单任务程序 |
| MISD | 多 | 单 | 程序同步运行,处理同一数据流 | 密码破解等 |
| SIMD | 单 | 多 | 程序同步运行,不同处理器处理不同数据 | 气象模型等 |
| MIMD | 多 | 多 | 程序独立运行,不同处理器处理不同数据 | 超级计算机、多核设备 |
| SIMT | 单 | 多线程 | 基于SIMD,支持多线程 | 多核图形处理 |
| SPMD | 单程序 | 多 | 处理器独立执行,处理不同数据 | 并行编程 |
#### 3. 并行编程基础概念
- **线程**:线程也称为执行线程,是并行的基本单位。它是一段代码,包含执行指令序列所需的一切,如私有指令列表、调用或系统栈、程序计数器以及少量特定于线程的数据(通常在其调用栈上)。线程与其他线程共享对内存的访问,多个线程可以通过共享变量进行协作和通信。
- **进程**:进程是具有自己私有地址空间的线程。进程之间通过消息进行通信,它们共享发送和接收消息的接口。进程是动态的,而程序是静态的,进程是正在执行的程序。与线程相比,进程的状态更多,创建和销毁进程的成本更高,且进程通常会存在更长时间。
- **延迟(Latency)**:延迟是完成给定工作单元所需的时间,无论是进程、线程还是程序的较小单元。延迟可能会影响程序执行,如果程序或进程的某一部分执行时间比其他部分长得多,那么在等待该部分完成时,其他部分无法执行。自20世纪70年代初以来,操作系统采用了上下文切换的方法来解决这个问题。例如,当程序尝试打开磁盘文件时,磁盘操作比其他内存操作慢得多,操作系统会将该程序
0
0
复制全文
相关推荐










