一、写在前面
并行计算的入门文章非劳伦斯利弗莫尔国家实验室(LLNL)
的《Introduction to Parallel Computing Tutorial》
所属,于是本着学习的态度,笔者对其进行了翻译,以下是《Introduction to Parallel Computing Tutorial》
的中文版,篇幅限制,本篇博客仅包含A. 并行计算概述
和B. 概念和术语
两部分,为《Introduction to Parallel Computing Tutorial》
的第一部分,共四部分。
【高性能计算背景】《并行计算教程简介》翻译 - 中文 - 1 / 4
【高性能计算背景】《并行计算教程简介》翻译 - 中文 - 2 / 4
【高性能计算背景】《并行计算教程简介》翻译 - 中文 - 3 / 4
【高性能计算背景】《并行计算教程简介》翻译 - 中文 - 4 / 4
二、摘要
这是“利弗莫尔计算入门”研讨会的第一篇教程。本文旨在简要概述并行计算这一广泛而宽泛的主题,作为后续教程的导读。因此,它只涵盖并行计算的基本知识,面向刚刚熟悉该主题并计划参加本研讨会的一个或多个其他教程的人。它并不打算深入讨论并行编程,因为这将需要更多的时间。本教程首先讨论并行计算 - 它是什么以及如何使用,然后讨论与并行计算相关的概念和术语。然后探讨了并行内存体系结构和编程模型的主题。这些主题之后是一系列关于设计和运行并行程序的复杂问题的实际讨论。本教程最后给出了几个如何并行处理几个简单问题的示例。包括参考文献,以供进一步自学。
A. 并行计算概述
1. 什么是并行计算?
串行计算
传统上,软件是为串行 计算编写的:
- 一个问题被分解成一系列离散的指令
- 指令一个接一个地按顺序执行
- 在单个处理器上执行
- 任何时候只能执行一条指令
串行计算通用示例 👆
例如:
薪资处理的串行计算示例 👆
并行计算
从最简单的意义上讲,并行计算 是同时使用多个计算资源来解决一个计算问题:
- 一个问题被分解成可以同时解决的离散部分
- 每个部分进一步分解为一系列指令
- 每个部分的指令在不同的处理器上同时执行
- 采用总体控制/协调机制
并行计算通用示例 👆
例如:
薪资处理的并行计算示例 👆
- 计算问题应该能够:
- 被分解成可以同时解决的离散工作;
- 随时执行多条程序指令;
- 与使用单个计算资源相比,使用多个计算资源可以在更短的时间内解决问题。
- 计算资源通常是:
- 具有多个处理器/内核的单台计算机
- 通过网络连接的任意数量的此类计算机
并行计算机
- 从硬件的角度来看,今天几乎所有的独立计算机都是并行计算机:
- 多个功能单元(L1 cache, L2 cache, branch, prefetch, decode, floating-point, graphics processing (GPU), integer, etc.)
- 多个执行单元/核心
- 多个硬件线程
具有 18 个核心 (PU) 和 16 个 L2 缓存单元 (L2) 的 IBM BG/Q 计算芯片 👆
- 网络连接多台独立计算机(节点),以形成更大的并行计算机集群。
网络连接 👆
- 例如,下图显示了一个典型的 LLNL 并行计算机集群:
- 每个计算节点本身就是一台多处理器并行计算机
- 多个计算节点通过
Infiniband
网络联网 - 专用节点,也是多处理器,用于其他目的
典型并行计算机集群示例 👆
- 世界上大多数大型并行计算机(超级计算机)都是由少数(大部分)知名供应商生产的硬件集群。
资料来源:Top500.org 👆
2. 为什么使用并行计算?
现实世界非常复杂
- 在自然界中,许多复杂的、相互关联的事件同时发生,但时间顺序不同。
- 与串行计算相比,并行计算更适合于建模、模拟和理解复杂的真实世界现象。
- 例如,想象一下按顺序对这些进行建模:
现实世界的现象可以用并行计算来模拟 👆
使用并行编程的主要原因
节省时间和/或
成本
- 从理论上讲,在一项任务上投入更多资源将缩短其完成时间,具有潜在的成本节约。
- 并行计算机可以用廉价的商品组件制造。
并行地工作会缩短完成时间 👆
解决更大/更复杂
的问题
- 许多问题都非常大和/或复杂,使用串行程序解决这些问题是不切实际或不可能的,尤其是在计算机内存有限的情况下。
- 例如:“重大挑战性问题”,需要数PB和数PB的计算资源。
- 例如:Web 搜索引擎/数据库每秒处理数百万个事务。
并行计算可以解决日益复杂的问题 👆
提供并发
- 一个计算资源一次只能做一件事。多个计算资源可以同时做许多事情。
- 例如:协作网络提供了一个全球场所,来自世界各地的人们可以在这里“虚拟”会面和开展工作。
协作网络 👆
利用非本地资源
- 在本地计算资源稀缺或不足时利用局域网甚至是互联网。
- 例如:SETI@home在全球几乎每个国家都有170多万用户(2018年5月)。
SETI 拥有庞大的全球用户群 👆
更好地利用底层并行硬件
- 现代计算机,甚至笔记本电脑,在架构上都是并行的,具有多个处理器/内核。
- 并行软件专门用于具有多个内核、线程等的并行硬件。
- 在大多数情况下,在现代计算机上运行的串行程序会“浪费”潜在的计算能力。
并行计算核心 👆
未来
- 在过去20多年中,速度越来越快的网络、分布式系统和多处理器计算机体系结构(甚至在桌面级别)所显示的趋势清楚地表明,并行是计算的未来。
- 在同一时期,超级计算机的性能增长了50万倍以上,目前还看不到尽头。
Exascale
计算的竞赛已经开始,我们正在进入Exascale
时代- E x a f l o p = 1 0 18 Exaflop = 10^{18} Exaflop=1018 次计算每秒。
- 美国能源部百亿级计算项目:https://www.exascaleproject.org/
资料来源:Top500.org 👆
3. 谁在使用并行计算?
科学与工程
从历史角度看,并行计算一直被认为是高端计算
,并已被用于对科学和工程的许多领域的难题进行建模:
- 大气、地球、环境
- 物理学应用、核能、粒子、凝聚态物质、高压、核聚变、光电子
- 生物科学、生物技术、遗传学
- 化学、分子科学
- 地质学、地震学
- 机械工程-从假体制作到航天器
- 电气工程、电路设计、微电子
- 计算机科学、数学
- 国防,武器
并行计算是模拟一系列复杂物理现象的关键 👆
工商业
今天,商业应用程序为开发更快的计算机提供了同等或更大的推动力。 这些应用程序需要以复杂的方式处理大量数据。 例如:
- “大数据”、数据库、数据挖掘
- 人工智能 (AI)
- 石油勘探
- 网络搜索引擎,基于网络的商业服务
- 医学影像与诊断
- 药物设计
- 金融和经济建模
- 国家和跨国公司的管理
- 高级图形和虚拟现实,尤其是在娱乐行业
- 网络视频和多媒体技术
- 协作工作环境
并行计算用于许多商业应用 👆
全球应用
- 并行计算现在在世界范围内得到广泛应用,应用范围广泛。
资料来源:Top500.org 👆
B. 概念和术语
1. 冯诺依曼计算机体系结构
约翰·冯·诺依曼大约在20世纪40年代。(来源:LANL档案馆) 👆
- 以匈牙利数学家约翰·冯·诺依曼命名,他在1945年的论文中首次提出了电子计算机的一般要求。
- 也称为
存储程序计算机
,程序指令和数据都保存在电子存储器中。不同于早期通过硬接线
编程的计算机。 - 从那时起,几乎所有计算机都遵循这一基本设计:
- 由四个主要部分组成:
- 内存
- 控制单元
- 算术逻辑单元
- 输入/ 输出
基础计算架构 👆
- 读/写,随机存取存储器用于存储程序指令和数据
- 程序指令是告诉计算机做某事的编码数据
- 数据只是程序要使用的信息
- 控制单元从内存中获取指令/数据,对指令进行解码,然后依次协调操作以完成编程任务。
- 算术单元执行基本算术运算
- 输入/输出是人类操作员的接口
并行计算机仍然遵循这一基本设计,只是成倍增加单元。基本的基础架构保持不变。
关于他的其他卓越成就的更多信息:http://en.wikipedia.org/wiki/John_von_Neumann
2. 弗林分类法
- 有许多不同的方法可以对并行计算机进行分类。
参考
中提供了示例。 - 自 1966 年以来使用更广泛的分类之一称为弗林分类法。
- Flynn 的分类法根据
指令流
和数据流
这两个独立维度的分类方式来区分多处理器计算机体系结构。这些维度中的每一个都只能具有两种可能的状态之一:Single
或Multiple
。 - 下面的矩阵定义了 4 种可能的分类依Flynn所言:
弗林分类法 👆
单指令单数据 (SISD)
- 串行(非并行)计算机
单指令
:在任何一个时钟周期内,CPU 只处理一个指令流单数据
:在任何一个时钟周期内,只有一个数据流被用作输入- 确定性执行
- 这是最古老的计算机类型
- 示例:老一代大型机、小型机、工作站和单处理器/核心的个人电脑。
单指令多数据 (SIMD)
- 一种并行计算机
单指令
:所有处理单元在任何给定时钟周期执行相同的指令多数据
:每个处理单元可以对不同的数据元素进行操作- 最适合具有高度规律性的特殊问题,例如图形/图像处理。
- 同步(锁步)和确定性执行
- 两种类型:阵列处理机系统和向量流水线
- 例如:
- 阵列处理机系统:Thinking Machines CM-2、MasPar MP-1 & MP-2、ILLIAC IV
- 向量流水线:IBM 9000、Cray X-MP、Y-MP&C90、Fujitsu VP、NEC SX-2、Hitachi S820、ETA10
- 大多数现代计算机,尤其是带有图形处理器单元(GPU)的计算机,都采用SIMD指令和执行单元。
多指令单数据 (MISD) - 一种并行计算机
多指令
:每个处理单元通过单独的指令流独立地对数据进行操作。单数据
:单一数据流被送入多个处理单元。- 此类并行计算机的实际示例很少(如果有的话)。
- 一些可以想象的用途可能是:
- 对单个信号流运行的多个频率滤波器。
- 尝试破解单个编码消息的多种密码算法。
多指令多数据 (MIMD)
-
一种并行计算机
-
多指令
:每个处理器可能正在执行不同的指令流 -
多数据
:每个处理器可能使用不同的数据流 -
执行可以是同步的或异步的、确定性的或非确定性的
-
目前,最常见的并行计算机类型:**大多数现代超级计算机都属于这一类**。
-
示例:大多数当前的超级计算机、联网的并行计算机集群和“网格”、多处理器 SMP 计算机、多核 PC。
-
注意:
许多 MIMD 架构还包括 SIMD 执行子组件
3. 通用并行计算术语
- 与其他所有事物一样,并行计算也有自己的术语。 下面列出了与并行计算相关的一些更常用的术语。 其中大部分将在后面更详细地讨论。
中央处理器(CPU)
当代的CPU
由一个或多个内核组成——一个具有自己指令流的独立执行单元。带有CPU的内核可以分配到一个或多个插槽中,每个插槽都有自己独特的内存。当CPU由两个或多个插槽组成时,硬件基础设施层通常支持跨插槽共享内存。
节点(Node)
一台独立的机箱中的计算机
。通常由多个CPU/处理器/内核、内存、网络接口等组成。节点
通过网络连接在一起构成一台超级计算机。
一台超级计算机中的节点 👆
任务(Task)
计算工作中逻辑上离散的部分。任务通常是由处理器执行的程序或类似程序的指令集。并行程序由在多个处理器上运行的多个任务
组成。
流水线(Pipelining)
将任务分解为由不同处理器单元执行的步骤,输入流通过,很像装配线;一种并行计算。
共享内存(Shared Memory)
描述一种计算机体系结构,其中所有处理器都可以直接访问公共物理内存。在编程意义上,它描述了一种模型,其中并行任务都具有相同的内存“图片”,并且可以直接寻址和访问相同的逻辑内存位置,而不管物理内存实际存在于何处。
对称多处理器(Symmetric Multi-Processor (SMP))
共享内存硬件体系结构,其中多个处理器共享一个地址空间,并对所有资源(内存、磁盘等)具有同等访问权限。
分布式内存(Distributed Memory)
在硬件中,指的是基于网络的对物理内存的访问,并不常见。作为一种编程模型,任务只能在逻辑上查看
本地机器内存,并且必须使用通信来访问执行其他任务的其他机器上的内存。
通信(Communications)
并行任务通常需要交换数据。有几种方法可以实现这一点,例如通过共享内存总线或通过网络。
同步(Synchronization)
实时协调并行任务,通常与通信
相关。
同步
通常涉及至少一个任务的等待,因此可能会导致并行应用程序的时钟执行时间(wall clock execution time)增加。
计算粒度(Computational Granularity)
在并行计算中,粒度是计算与通信比率的定量或定性度量。
- 粗粒度:在通信事件之间完成相对大量的计算工作
- 细粒度:在通信事件之间完成的计算工作相对较少
观测到的加速比(Observed Speedup)
观察到的已并行化代码的加速,定义为:
串行执行的时钟时间
-----------------
并行执行的时钟时间
加速比:
并行程序性能的最简单和最广泛使用的指标之一。
并行开销(Parallel Overhead)
所需的执行时间是并行任务所特有的,而不是做有用的工作所需的时间。并行开销可能包括以下因素:
- 任务启动时间
- 同步
- 数据通讯
- 并行语言、库、操作系统等造成的软件开销。
- 任务终止时间
大规模并行(Massively Parallel)
指包含给定并行系统的硬件,该系统具有许多处理元件。many
的含义不断增加,但目前,最大的并行计算机由数十万到数百万的处理元素组成。
非常容易(理想的)并行( Embarrassingly (IDEALY) Parallel
)
同时解决许多相似但独立的任务;任务之间几乎不需要协调。
可扩展性(Scalability)
指并行系统(硬件 和/或 软件)在增加更多资源的情况下证明并行加速比成比例增加的能力。有助于实现可扩展性的因素包括:
- 硬件 - 特别是内存cpu带宽和网络通信属性
- 应用程序算法
- 并行开销相关
- 特定应用程序的特征
4. 并行编程的潜在好处、限制和成本
阿姆达尔定律
阿姆达尔定律 👆
引入更多处理器时的加速 👆
-
阿姆达尔定律指出,潜在的程序加速比是由可并行化的代码比例(P)定义的:
1 speedup = -------- 1 - P
-
如果没有任何代码可以并行化,则P=0,加速比=1(无加速比)。
-
如果所有代码都是并行的,则P=1,加速比是无限的(理论上)。
-
如果50%的代码可以并行化,则最大加速比=2,这意味着代码将以两倍的速度运行。
-
通过引入执行并行部分工作的处理器数量,可以通过以下方式对关系进行建模:
1 speedup = ------------ P + S --- N
-
其中P = 并行比例,N = 处理器数量,S = 串行比例。
-
很快就会发现,并行性的可伸缩性受到限制。例如:
speedup ------------------------------------- N P = .50 P = .90 P = .95 P = .99 ----- ------- ------- ------- ------- 10 1.82 5.26 6.89 9.17 100 1.98 9.17 16.80 50.25 1,000 1.99 9.91 19.62 90.99 10,000 1.99 9.91 19.96 99.02 100,000 1.99 9.99 19.99 99.90
-
“著名”引述:你可以花一生的时间让95%的代码都是并行的,而且无论你投入多少处理器,都无法实现超过20倍的加速!
-
但是,某些问题通过增加问题大小来提高性能。例如:
二维网格计算 并行比例 85秒 85% 串行比例 15秒 15%
-
我们可以通过将网格尺寸加倍和时间步长减半来增加问题的大小。这将导致网格点数量增加四倍,时间步长增加两倍。然后计时如下所示:
二维网格计算 并行比例 680秒 97.84% 串行比例 15秒 2.16%
-
与具有固定并行时间百分比的问题相比,随大小增加并行时间百分比的问题更具可伸缩性。
复杂性
- 通常,并行应用程序比相应的串行应用程序更复杂。您不仅有多个指令流同时执行,而且它们之间还有数据流动。
- 在软件开发周期的几乎每个方面,复杂性的成本都是以程序员的时间来衡量的:
- 设计
- 编码
- 调试
- 调优
- 维护
- 在开发并行应用程序时,坚持
良好
的软件开发实践是必不可少的。
可移植性
- 由于MPI、OpenMP和POSIX threads等多个API的标准化,并行程序的可移植性问题不像过去那么严重。然而…
- 所有与串行程序相关的常见可移植性问题都适用于并行程序。例如,如果您使用供应商对Fortran、C或C++的“增强功能”,则可移植性将是一个问题。
- 尽管存在多个API的标准,但实现在许多细节上会有所不同,有时甚至需要修改代码以实现可移植性。
- 操作系统在代码可移植性问题中发挥关键作用。
- 硬件体系结构的特点是高度可变,可能会影响可移植性。
资源需求
- 并行编程的主要目的是减少执行时钟时间,但是为了实现这一点,需要更多的 CPU 时间。例如,在 8 个处理器上运行 1 小时的并行代码实际上使用了 8 小时的 CPU 时间。
- 由于需要复制数据以及与并行支持库和子系统相关的开销,并行代码所需的内存量可能比串行代码大。
- 对于短期运行的并行程序,与类似的串行实现相比,性能实际上可能会有所下降。与设置并行环境、任务创建、通信和任务终止相关的间接成本可能占短期运行的总执行时间的很大一部分。
可扩展性
-
基于求解时间的两种缩放:强缩放和弱缩放。
-
强缩放(阿姆达尔定律):
- 随着添加更多处理器,总问题大小保持不变
- 目标是更快地运行相同大小的问题
- 完美缩放意味着问题在1/P时间内解决(与串行相比)
-
弱缩放(古斯塔夫森定律):
- 随着添加更多处理器,每个处理器的问题大小保持不变。总的问题大小与使用的处理器数量成正比
- 目标是在相同的时间内运行更大的问题
- 完美缩放意味着问题Px与单处理器运行时间一致
-
并行程序的性能扩展能力是许多相关因素的结果。简单地增加更多的处理器很少是答案。
-
该算法可能对可伸缩性有固有的限制。在某些情况下,添加更多资源会导致性能下降。这是许多并行应用程序的常见情况。
-
硬件因素在可扩展性方面起着重要作用。示例:
- SMP机器上的内存cpu的总线带宽
- 通信网络带宽
- 任何给定机器或一组机器上的可用内存量
- 处理器时钟速度
-
并行支持库和子系统软件会限制可扩展性,独立于您的应用程序。
C. 并行计算机内存架构
1. 共享内存
2. 分布式内存
3. 混合分布式共享内存
D. 并行编程模型
1. 共享内存模型
2. 线程模型
3. 分布式内存/消息传递模型
4. 数据并行模型
5. 混合模型
6. SPMD 和 MPMP
E. 设计并行程序
1. 自动并行 vs. 手动并行
2. 理解问题和程序
3. 分解
4. 通讯
5. 同步
6. 数据依赖
7. 负载均衡
8. 粒度
9. I/O
10. 调试
11. 性能分析和调优
F. 并行示例
1. 数组处理
2. 计算PI
3. 简单热方程
4. 一维波动方程
G. 参考资料和更多信息
四、总结
《并行计算教程简介》
的前两个章节主要从并行计算的概念出发,并介绍了一些体系结构的知识,让我收获最大的是B.3 通用并行计算术语
一节,较为系统的整理了我下脑中术语的准确概念😲。
以上就是今天要分享的内容,本文翻译了《并行计算教程简介》
的前两个章节,笔者一人翻译难免有不足之处,望海涵 😐 。
如果本文能给你带来帮助的话,点个赞鼓励一下作者吧! 😲
五、参考
[1] Lawrence Livermore National Laboratory:https://hpc.llnl.gov/documentation/tutorials/introduction-parallel-computing-tutorial
[2] Embarrassingly (IDEALY) Parallel: Embarrassingly Parallel Algorithms Explained