并行程序设计简介
为什么要学习并行编程
-
当今几乎所有的计算机都是多核架构
-
需要程序员编写高效的并行程序
- 学习如何将计算资源有效整合,更高效的运行程序
-
用途
- 增加工作竞争力
- 用于科学研究
并行程序设计基础知识
串行系统——冯·诺依曼结构
-
“经典”的冯·诺依曼结构
-
主存
-
中央处理单元(
Central Processing Unit,CPU
)处理器或核- 控制单元:决定应该执行程序中的哪些指令
- 算术逻辑单元(
Arithmetie Logic Unit,ALU
):执行指令 - 寄存器:存储CPU中的数据和程序执行时的状态信息
- 程序计数器:用来存放下一条指令的地址。
-
主存和CPU之间的互连结构
- 总线
-
-
冯·诺依曼瓶颈
- 数据或指令从内存中取出或者读出:数据或指令从主存传送到CPU
- 数据或指令写入或者存入内存中:当数据或指令从 CPU传送到主存中
- 冯·诺依曼瓶颈:主存和CPU 之间的分离
并行计算
- 一个系统具有多个处理器, 所有处理器可以访问共享存储器以交换信息,通信开销低。
分布式计算
- 每个系统具有自己的存储器,并通过网络将多个系统连通,系统间通过消息传递的方式交换信息,通信开销高。
并行编程
程序员开发程序的过程,用来表示哪些计算应该并行执行
进程、多任务与线程
进程
- 当用户运行一个程序时,操作系统创建一个进程。
- 进程是运行着的程序的一个实例
- 可执行的机器语言程序。
- 一块内存空间
- 可执行代码,
- 用来跟踪执行函数的调用栈、堆
- 一些其他内存区域。
- 操作系统分配给进程的资源横述符,如文件描述符。
- 安全信息,例如阐述进程能够访问哪些硬件和软件的信息。
- 进程状态信息
- 进程是否就绪还是等待某些资源、寄存器内容
- 关于进程存储空间的信息。
多任务
- 操作系统提供对同时运行多个程序的支持
- 如果一个进程需要等待某个资源,例如需要从外部的存储器读数据,它会阻鑫。这意味着,该进程会停止运行,操作系统可以运行其他进程
线程
- 线程为程序员提供了一种机制,将程序划分为多个大致独立的任务,当某个任务阻塞时能执行其他任务。
- 线程包含在进程中
- 线程可以使用相同的可执行代码
- 共享相同的内存和相同的I/O设备。
- 当两个线程共属于一个进程时
- 它们共享进程的大多数资源。
- 它们之间最大的整别是各自需要一个私有的程序计数器和函数调用栈,使它们能够独立运行。
- 进程和它的子线程
- 当一个线程开始时,它从进程中派生(fork)出来;
- 当一个线程结束时,它合并(join)到进程中
并行系统发展
摩尔定律
- 半导体芯片的晶体管密度大约每18 ~24个月就会翻一番。
单核处理器转向多核处理器
多核微处理器
- 单芯片集成更多处理器(processor)
需要显性并行编程
- 与指令级并行相比
- 硬件可以同时执行多条
- 指令程序员不可见硬件并行
- 难点
- 如何提升性能
- 负载均衡问题
- 通信与同步技术
并行编程起源
软件面临的挑战
芯片行业向多核处理器的转变让软件开发人员措手不及。
科学模拟——科学的第三根支柱
- 传统科学和工程的一般方法
- 做理论或纸上设计。
- 进行实验或构建系统
- 缺陷
- 太难——建造大型风洞。
- 太贵——造一架一次性客机。
- 太慢——等待气候或星系演化。
- 太危险了——武器、药物设计、极端气候实验。
- 计算科学范式
- 使用高性能计算机系统来模拟这一现象
- 基于已知的物理定律和有效的数值方法。
- 使用高性能计算机系统来模拟这一现象
- 全球气候模拟问题
- 核心在于计算:
- f f f(纬度,经度,海拔,时间)$\to $ 温度,压力,湿度,风速
- 方法:
- 将空间离散化: 每10 km作为一个测量点
- 设计一个算法来预测时间 t + d t t+dt t+dt 的天气(给定时间 t t t 的天气)
- 应用:
- 预测重大事件,例如厄尔尼诺现象
- 制定气体排放标准
- 核心在于计算:
-
科学模拟的一些特点
- 将物理空间或概念空间离散成一个网格
- 有规则的更简单
- 自适应的更有代表性
- 在网格上执行本地计算
- 根据昨天的气温和天气模式,今天的预期气温是多少?
- 在网格之间传递计算结果
- 提供本地天气结果以了解全球天气模式。
- 重复一组时间步骤
- 可能执行其他计算结果
- 根据天气模型,飓风来临时,哪些地区应该疏散?
- 将物理空间或概念空间离散成一个网格
-
对计算能力的追求
- 科学模拟将继续推动系统需求
- 为了提高结果的精确度
- 为了更快得到答案(例如,气候模型,灾害模型)
- 商品软件系统中的类似现象
- 更多功能的软件
- 软件集成度
- 更快的响应
- 更现实的图形
- 科学模拟将继续推动系统需求