引言
单处理器超级计算机已经接近物理极限,无法继续提升计算能力。因此,本书将研究利用
多处理器并行性
的先进计算机体系结构。并行计算在内部互连的处理器中已成为主要形式,而计算机网络的发展则引入了一种新类型的并行性,即联网自治计算机
。与将所有组件集中在一个盒子中,通过紧耦合处理器和存储器来获得并行性不同,因特网通过松耦合所有组件在盒子外部获取并行性。为了最大程度地利用计算机系统的内部和外部并行性,设计师和开发者必须了解硬件和软件之间的交互。本书的目的是让读者了解多处理器系统的优势和局限性,先进体系结构和并行性既带来了优势,也带来了挑战。本书由十章组成,包括导论、计算机体系结构分类、共享存储器和消息传递系统、互连网络、性能评估、并行算法和复杂性分析、网络计算概念、并行虚拟机编程、消息传递接口标准、任务分配和调度问题解决方法等内容。适合计算机工程、计算机科学和电气工程的大学生阅读,也可作为研究生课程教材或从业者的综合参考书。
第1章 先进计算机体系结构与并行处理导论
- 1.1 计算的四个年代
批处理年代
IBM System/360
是一款代表性的大型批处理机器,具有穿孔卡阅读机、磁带和磁盘驱动器,并在一个计算机房内连接。它具有操作系统、多种编程语言和10MB磁盘存储器,可支持1MB磁心存储器容量。
分时年代
20世纪60年代后,大型机占据重要地位,但小型机仍昂贵且难于使用。分时系统由DEC、Pime和DalaCeneral公司制造的小型机带来,与集中式数据处理主机共存。同时期超级计算机也出现,如CDC6600和Cray-1。
台式机年代
1977年,PC由多公司推出,提高了用户生产率。Conpaq、Apple、IBM、Dell等公司的PC普及,改变了计算方式。约1990年,功能强大的PC和LAN取代大型机和小型机,性价比大幅提高。这些PC后来通过WAN连接成更大的计算联合体。
网络年代
20世纪90年代,网络技术蓬勃发展,超越处理器技术。商用并行计算机兴起,分为共享存储器
和分布式存储器
系统,处理器数量从几个增至数千个。代表机型有Soquen Symmetry、Intel CUBE、Thinking Machines(CM-2,CM-5)等。
- 1.2 计算机体系结构的弗林分类方法
弗林分类方法是基于信息流概念,将计算机体系结构分为四种类型:SISD、SIMD、MISD、MIMD。SISD是传统的单处理器冯·诺依曼计算机系统,SIMD和MIMD是
并行计算机系统
,其中SIMD有一个控制部件同步执行相同指令,而MIMD每个处理器有自己的控制部件可执行不同指令。Kuck在此基础上进一步扩展分类,形成16类体系结构。
- 1.3 SIMD体系结构
SIMD模型是指由前端计算机和处理器阵列组成的并行计算模型。处理器阵列包含多个同步处理单元,可以在不同的数据上同时执行相同的操作。前端计算机通过存储器总线与处理器阵列连接,控制其执行并行操作。SIMD模型在大规模数据集上的并行计算非常有效,特别适用于规则的数值计算。SIMD机器的配置结构可以是每个处理器都有局部存储器或者处理器和存储器之间通过互连网络通信。
- 1.4 MIMD体系结构
MMID并行体系结构分为两大类:
共享存储器
和消息传递
。共享存储器使用中央存储器交换信息,消息传递通过互连网络完成。SMP系统是一种共享存储器系统,多处理器平等地访问全局存储器,通常通过总线和高速缓存控制器通信。这降低了多端口存储器和接口电路的需求,也适用于消息传递模式。
共享存储器组成
共享存储器模型中,处理器通过共享存储器单元进行通信。访问控制、同步、保护和安全是设计共享存储器系统时需要考虑的基本问题。系统可以是均匀存储器访问(UMA)、非均匀存储器访问(NUMA)或全高速缓存(COMA)架构。UMA系统中,所有处理器具有相同的访问时间;NUMA系统中,访问时间取决于处理器与存储器之间的距离;COMA系统中,共享存储器是由高速缓存组成的。
消息传递组成
消息传递系统中,处理器有独立存储,通过发送和接收操作通信。节点包含处理器和存储器。消息存储在缓冲器中等待处理和发送/接收操作。操作系统控制并行处理和问题求解。处理器不共享全局存储,每个处理器访问自己的地址空间。处理部件可以用各种连接方式,如超立方体网络、二维/三维网格。系统设计考虑可扩展性、链路带宽和网络时延。虫孔路由减小缓冲器和消息时延,包被分割为片顺序传输。
- 1.5 互连网络
操作方式
互连网络有同步和异步操作方式。同步使用全局时钟,系统以步调运行。异步不需时钟,利用握手信号协调操作。同步较慢但无竞争。
控制策略
互连网络根据控制策略可分为集中式和分散式。集中式控制有单个中央控制部件监测和控制系统操作,但可能成为性能瓶颈。分散式控制功能分布在系统内不同部件中。交叉开关是集中式系统,多级互连网络是分散式系统。
交换技术
互连网络根据交换机制分为电路交换和包交换网络。电路交换需要在通信前建立完整路径并保持通路。包交换则将消息划分为包,通过存储转发方式从源到目的地传输。包交换比电路交换更有效利用网络资源,但存在可变包延迟。
拓扑
互连网络拓扑是指处理器和存储器之间的连接方式。它描述了如何将处理器和存储器连接起来。互连网络可以分为静态
和动态
两种类型。静态互连网络在系统设计时就建立了所有连接,而动态互连网络是在需要时才建立连接。共享存储器系统可以使用基于总线
或基于交换
的互连网络。基于总线的系统使用总线连接处理器和存储器,而基于交换的系统使用交换开关来建立连接。消息传递互连网络也可以是静态或动态的。静态互连网络在系统设计时就确定了所有连接,而动态互连网络只在消息传递时才建立连接。互连网络的拓扑结构对系统性能有很大影响,例如线性阵列、环形、网格、树状和超立方体等拓扑结构。
第2章 多处理器互连网络
- 2.1 互连网络的分类
- 2.2 基于总线的动态互连网络
单总线系统
单总线是连接多处理器系统的简单方法。通用形式包括一条总线连接N个处理器,每个处理器有自己的高速缓存,减少处理器与存储器间通信。系统规模通常在2~50个处理器,实际规模取决于通信量和总线带宽。单总线复杂性为0(1),时间复杂性为0(N)。虽简单易扩展,但受总线带宽限制,只允许一个存储器访问。
多总线系统
多总线多处理机系统是对单条共享总线系统的自然扩展,采用多条并行总线连接处理器和存储器。连接方案包括全总线-存储器连接的多总线、单总线-存储器连接的多总线、部分总线-存储器连接的多总线和基于类的存储器连接的多总线。多总线多处理机系统提供高可靠性和易于增量扩展,但总线竞争会增加。
总线同步
总线分为同步
和异步
。同步总线具有预知的事务执行时间,考虑处理时间。异步总线依赖数据可用性和部件准备情况。单总线多处理机需总线仲裁解决竞争。仲裁逻辑使用优先级方案确定哪个处理器控制总线。握手需要总线请求和总线授予信号。系统使用随机、轮转、相等和LRU优先级方案。
- 2.3 基于交换的互连网络
交叉开关网络
交叉开关网络是单总线网络的对立极端,允许所有输入和输出的连接。每个交叉点含开关元件(SE),提供多路连接。复杂度以开关点数度量,时间复杂度低。交叉开关非阻塞,支持多连接模式。但在大型系统中,复杂性可能成为关键的成本问题。
单级网络
单级网络使用最简单的2×2开关元件(SE),下图展示了四种设置:直通、交换、上广播和下广播。混洗-交换是常用的连接模式,通过混洗和交换操作将数据循环传输。单级网络中每级的开关单元数为N/2,路径长度最大为N。PM2I网络可模拟立方体网络,反之亦然。
多级网络
多级互连网络(MIN)改善单总线系统的限制,提供多条通路。一个通用MIN由多级组成,每级有2×2开关元件。级间连接可采用混洗-交换等路由函数。MIN的优势是方便的消息路由。在一个NXN网络中,每级的路由基于目的地址,控制每级开关元件的上下输出。榕树网络
是一种多级互连网络。网络的复杂性由总开关元件数度量,延迟和时间复杂性由经过的开关元件数衡量。Omega网络
是另一种常见的多级互连网络类型,由多级混洗-交换网络组成。这些多级互连网络被广泛应用于研究和商用领域。
多级互连网络中的阻塞
多级互连网络按阻塞性可分为阻塞网络
、可重排网络
和非阻塞网络
。阻塞网络如Omega、榕树、混洗-交换和Baseline,限制新连接的建立。可重排网络如Benes,允许重新排布连接以建立其他连接。非阻塞网络如Clos,在已连接的情况下总能建立新连接。Clos网络由多级交叉开关组成,满足特定的不等式条件。
- 2.4 静态互连网络
全连接网络
全连接网络(CCN)中的每个节点与其他节点相连,确保消息快速从源节点到目的节点传递(经过一条链路)。节点之间的路由简单,但构建所需链路昂贵,特别在大规模情况下。链路数由为N(N-1)/2,网络复杂度为O(N),延迟复杂度为O(1)。
有限连接网络
有限连接网络(LCN)不提供每个节点直接链接,通信需经过其他节点路由。预期通路长度较全连接网络长。LCN需要互连模式和路由机制。线性阵列、环状网络、二维阵列、树状网络和立方体网络是常见互连模式。线性阵列的速度慢且复杂度为O(N)。树状网络的通信需沿树上行或下行,复杂度为O(2^k)和O(Ib N)。
立方体连接网络
立方体连接网络模仿立方体结构,每个节点有与其他节点相连的通信链路。通过简单的路由机制,消息可以沿着不共享公共链路的路径从源节点到达目的节点。在超立方体中,节点的度为n,可以通过连接两个具有类似地址的子立方体来构建更大的立方体网络。立方环体系结构是对基本超立方体的改进方案之一,它将节点以环形方式连接。
网格连接网络
n维网格通过互连结构连接K×K×…·×K个结点,n为维数,K为i维基。多种路由机制可用于消息传递,如维序路由。网格互连网络支持科学计算,具有紧凑布局和可扩展性。许多分布式存储器计算机使用网格互连网络,如GoodyearAeroepace的MPP、Itel的Paragon。
k元n立方体网络
k元n立方体是一种具有k为基数的n维立方体网络。每个维度上都有k个结点。消息在网络中采用类似网格网络的路由方法。最短路由是根据链路方向确定的,最长遍历距离为0(n+k)。
- 2.5 分析和性能指标
动态网络
交叉开关
和多总线
是常见的动态互连网络。交叉开关的成本取决于内部交叉点的数量,延迟是固定的。它具有非阻塞特性和容错性,但对于大规模系统来说可能成本高。多总线系统的成本与总线数量成正比,延迟与总线数和处理器数量成正比。多总线提供高可靠性和容错性,但可能会增加总线冲突。多级互连网络的成本衡量开关元件的数量,延迟取决于通过的开关元件数。它具有简化的路由机制,但容错性较差。为了改善容错性可以增加一级开关元件。
静态网络
全连接网络(CCN)
中,每个结点与网络中所有其他结点相连。该网络的成本为N(N-1)/2,即O(N²),消息从任何源到目的遍历的链路数为常数,即O(1),结点度为N-1,直径为常数。线性阵列网络
中,每个结点与两个直接邻接结点相连,两端结点只与一个邻接结点相连。该网络的成本为O(N),源结点到目的结点平均需遍历的结点数为N/2,即O(N),结点度为2,直径为N-1。树状网络
中,每个结点与父结点和所有子结点相连。在k级全二叉树中,该网络的成本为O(2^k),延迟为O(log(N)),结点度为3,直径为O(log(N))。立方体连接网络
中,任意两个结点的二进制地址表示仅有一位不同就相连。网络成本为O(2^n),延迟为O(log(N)),结点度为O(log(N)),直径为O(n)。网格连接网络
中,位于(i,j)的结点与(i±1,j±1)的邻居结点相连。网络成本为O(n²),延迟为O(1),结点度为4,直径为O(n)。k元n立方体网络
是一个基为k的n维立方体。网络成本为O(k^n),延迟为O(n+k),结点度为2n,直径为O(n×k)。
第3章 多处理器体系结构的性能分析
- 3.1 计算模型
等持续时间模型
该模型假设任务可划分为n个等子任务,每个处理器执行一个子任务。使用单处理器执行整个任务所需时间t,每处理器执行子任务时间t/n。模型中忽略通信开销,实际每处理器执行子任务时间为tm=(t/n)+tco。加速定义单处理器求解时间与n处理器求解时间比值。效率定义每处理器获得加速度。模型基于等持续时间假设,实际算法含不可分割串行部分。模型简单但不现实。处理器间通信和数据交换需时间tco。加速与处理器数n相关,tco相对较小时加速接近n,相对较大时接近t/(t+tco)<1。
具有串行部分的并行计算模型
在计算模型中,部分任务不可并行化,其余可拆分成并发子任务。在n处理器上执行任务需要时间t=f+(1-f)(t/n),加速由公式lim[S(n)]=1/f决定,阿姆达尔定律表明性能改善取决于不可并行部分。通信开销和不可并行计算部分影响最大加速。效率由加速和处理器数决定,维持处理器效率在增加处理器数时挑战重重。性能定律(如Croech、Amdahl和Custafson-Braeis)关注并行体系结构潜在性能提升。
- 3.2 关于并行体系结构的争论
Grosch定律
20世纪40年代末,H. Groech研究计算机系统能力P和成本C之间的关系,提出P=K×C的假设。他进一步假设s≈2。按照Groech定律,计算机能力的增加与成本平方成正比,即C=√(P/K),假设s=2。销售一台贵一倍的计算机,其速度必须四倍于原来的速度,使计算便宜一半,则计算速度必须为原来的四分之一。随着计算技术进步,定律已不适用。
Amdahl定律
并行系统加速是单处理器求解任务时间与n个处理器求解同一任务时间的比值。阿姆达尔定律与Groech定律类似,强调性能改善受限,处理器数量对加速影响有限。但实际中发现某些并行算法的部分与处理器数量有关。当limf(n)=0时,可实现大规模问题的线性加速。例如,Sandia国家实验室使用1024个处理器的系统展示了工程问题的线性加速。算法采用二叉树结构,通过三个步骤完成计算。
Gustafson-Barsis定律
1988年,Sandia实验室的Gustafson和Barsis研究了阿姆达尔定律和数百个处理器的并行体系结构在性能改进方面的应用。他们发现问题规模随处理器数量增大而增大,与阿姆达尔定律相矛盾。他们提出了比例加速因子SS(n),通过使问题规模与处理器数量成比例增长,可以实现更高效的并行性能。他们还强调关注互连网络性能
而非处理器计算。这一研究对并行计算领域有重要启示。
- 3.3 互连网络的性能问题
交叉开关的带宽
交叉开关的带宽是在一个周期内所能接受的平均请求数。当多个处理器请求访问同一存储器模块时可能发生争用。以三个处理器和三个存储器模块的交叉开关为例,根据不同的请求情况计算带宽。带宽计算公式为BW = M(1-(1-(p/M)))。这个公式基于假设,即处理器在周期内均会对存储器模块产生请求。当仅部分处理器请求存储器模块时,可得到相似的带宽表达式。
多级互连网络的带宽
本节介绍了多级互连网络的带宽计算方法。对于Delta网络,假设第一级的请求率为ro,通过推导可以计算出每一级的输出请求数。带宽计算公式为BW = b × r。此外,还探讨了时延和平均距离的概念,并介绍了静态网络的复杂性、网络互连性和连接性的重要性。最后,对动态和静态互连网络的性能进行了比较,并讨论了并行体系结构的可伸缩性问题。
- 3.4 并行体系结构的可扩展性
一个可扩展的并行系统可以通过扩大规模或缩小成本来线性提高性能。可扩展性的表现形式包括速度、效率、规模、应用、代和异构性。对于
速度
而言,可扩展系统能够随处理器数目的增加成比例地提高速度。效率
上,可扩展系统应能在处理器增加时保持固定效率。可扩展性的程度取决于问题规模相对于处理器数的增长速率。高可扩展系统的等效率值较小,而不可扩展系统的等效率值较大。Gustafson证明了在1024个处理器上通过扩展问题规模可以获得近线性的加速。可扩展并行系统的加速与效率之间有关系。增加处理器数通常提高加速,但可能降低效率。引入平均并行性参数(Q)
表示平均繁忙处理器数。最大加速部分(S(n)/Q)和效率之和应大于1。平均并行性决定加速和效率权衡。可扩展性允许通过增加硬件资源改善性能而无需改变程序。设计趋势是将可扩展性作为主要设计目标,包括过度设计和向后兼容性设计。基准测试程序用于衡量性能。
- 3.5 基准测试程序性能
基准测试程序
用于测试计算机系统性能。Dhrystone和Whetstone是早期的基准程序,但不够可靠。现在使用真实应用软件进行性能评估,如PERFECT、TPC和SPEC。SPBC是一个非盈利组织,致力于标准化基准测试程序。SPEC92包含CINT92和CFP92两套测试程序集,使用SPECratio测量执行时间比率。使用工具和辅助文件编译和执行代码,并计算SPEC指标。几何平均在评估性能时存在批评。SPEC92和SPEC95是计算机性能评测基准,SPEC95取代了SPEC92,使用几何平均计算性能结果。编译器标志对SPEC评分有影响,调整参数可提高评分,但再现性困难。SPEC95是衡量单个基准测试程序的速度,SPEC率是衡量多个基准测试程序的速度。AlphaStation和Personal Workstation性能相似,AlphaServer性能稍优。
第4章 共享存储器体系结构
共享存储器系统中,多处理器共享全局存储器,通过读写全局存储器进行任务通信和协调。
性能衰退
和一致性问题
是需要考虑的主要挑战。高速缓存可以解决争用问题,但多个数据副本可能导致一致性问题。本章研究不同的共享存储器系统和一致性解决方法。
最简共享存储器系统由一个存储器模块(M)和两个处理器(P和P)组成。通过仲裁部件,请求传递给存储器控制器进行满足。系统根据互连网络的不同可分为不同类型。
- 4.1 共享存储器系统的分类
均匀存储器访问
均匀存储器访问(UMA)系统中,处理器通过互连网络访问共享存储器。处理器具有相同访问时间。UMA称为SMP系统,常见商用实例有Sun Microsystem的多处理器服务器。
非均匀存储器访问
非均匀存储器访问(NUMA)系统中,每处理器连接部分共享存储器,地址空间单一,但访问时间依赖距离。导致非均匀访问时间。多种NUMA体系结构,如树状和层次式总线网络,将处理器与存储器模块相连。实例包括BBN TC-2000、SGI Origin 3000。
全高速缓存存储器体系结构
全高速缓存存储器体系结构(COMA)类似于NUMA,每个处理器有部分共享存储器,但该存储器是由高速缓存构成的。COMA要求数据迁移到需要的处理器。无存储器层次,地址空间由所有高速缓存构成。高速缓存目录(D)实现远程缓存访问。实例包括Kendall Square Research公司的KSR-1。
- 4.2 基于总线的对称多处理机系统
共享存储器系统使用总线或交叉开关互连网络,总线/高速缓存体系结构减少了存储器和接口电路成本,但当多个处理器同时访问总线时可能饱和。高命中率是目标,减少处理器对总线的使用次数。缺失率表示无法满足需求的比例。对于N个处理器系统,当N(1-h)V≤BI时,总线饱和。其中h为命中率,V为处理器速度,B为总线速度,I为工作周期速率。总线能够支持的具有高速缓冲存储器的最大处理器数 N≤BI/(1-h)V。
- 4.3 基本的高速缓存一致性方法
高速缓存一存储器一致性
高速缓存中多个数据副本导致一致性问题,需算法维护一致性。通写策略
每次更新高速缓存时都更新存储器,回写策略
仅在替换块时更新。处理器请求存储单元数据复制到高速缓存,更新后需保持一致。下表给出了通写和回写策略。
高速缓存-高速缓存一致性
多处理机系统中,处理器P请求全局存储单元X数据,复制到本地高速缓存。若Q写新值到X,则基于写-无效策略
,其他副本无效。基于写-更新策略
,立即更新所有缓存副本。下表给出了两种策略。
共享存储器系统一致性
有四种缓存一致性组合:写-更新和通写
、写-更新和回写
、写-无效和通写
、写-无效和回写
。直接在X上进行写-更新和通写会使总线忙碌,处理器最终等待写完成并变为空闲。写-更新和回写只更新缓存副本,限制写入高速缓存0导致不一致。污染位可防止X值扩散,但不一致副本最终需要更新。
- 4.4 监听协议
监听协议基于
监测总线活动
并执行一致性命令。全局存储器以块移动,每块有状态确定其内容变化。读写操作可能改变块状态。高速缓存不命中表示请求的块不在高速缓存中或已无效。监听协议根据更新/无效和数据来源处理写操作和缺失操作。
写一无效和通写:确保存储器与最新更新的高速缓存副本一致。处理器可以安全地读取存储器副本,直到有处理器更新它。所有高速缓存副本无效,存储器更新以保持一致性。
写一无效和回写(所有权协议):该协议允许一个有效块在存储器拥有,并在多个高速缓存之间共享,这些高速缓存只包含块的共享副本。处理器可以安全地从高速缓存中读取这些块,直到有一个处理器更新其副本。此时,更新者成为唯一的拥有者,其他副本无效。
写一次:Goodman于1983年提出了写无效协议,该协议使用通写和回写策略的组合。第一次写块时采用通写策略,以后的写则采用回写策略。
写更新和部分通写:更新高速缓存后立即写入存储器,并广播给其他共享该块的高速缓存。高速缓存监听总线并更新本地缓存。专用总线指示至少有一个高速缓存共享该块。
写-更新和回写:此协议类似于前面一个协议,只需将共享块被更新时通写存储器改为当块要被普换时才更新存储器。
- 4.5 基于目录的协议
互连网络和大型共享存储系统中,使用监听协议更新或使缓存无效不现实。基于目录的协议是解决方案,消息存储在块副本的高速缓存中,目录维护处理器和存储块的状态信息。目录可以集中式或分布式。集中式目录存在搜索时间长的问题,分布式目录允许每个存储模块保持独立的目录项,缓解了问题。
协议分类
每个数据块的目录项包含指向副本位置的指针和一个污染位,用于允许高速缓存写入存储器块。基于目录的协议分为三类:全映射目录
、有限目录
和链目录
。全映射目录中,每个目录项有N个指针,其中N为处理器数。有限目录中,每个目录项的指针数是固定的,不考虑处理器数。链目录通过在高速缓存中分布存放目录来解决目录规模问题。
使无效协议
(1) 集中式目录使无效的步骤:1.发送写请求。2.中央目录确定处理器副本。3.使无效信号和指向处理器的指针传送给所有含有该副本的处理器。4.被使无效的高速缓存向请求处理器发送确认消息。5.只有写处理器高速缓存中保留该块的副本。
(2) 可扩展一致性接口(SCI)协议:1.基于分布式目录双向链表。2.每个高速缓存块在共享处理器表中加入。3.存储器和高速缓存项有标志位。4.存储器中的目录大小等于存储器块数乘以高速缓存数。
(3) 斯坦福分布式目录(SDD)协议:1.基于分布式目录单向链表。2.存储器指向共享表头。3.每个处理器指向前驱处理器。4.加入和退出共享表的处理与SCI协议有所不同。
- 4.6 共享存储器的编程
任务创建
共享存储器系统可用于大粒度级的分时处理,新进程分配给闲置处理器或最少工作量处理器。重量级任务包括页表、存储器和文件描述。细粒度级采用轻量级进程,并适用于同构和异构任务。应用以分叉-汇合构造的监督者-工作者模型创建。
通信
进程有三种存储段:文本、数据和堆栈。文本存储执行的二进制代码,数据存储程序数据,堆栈存储活动记录和动态数据。串行进程只能访问自身的数据和堆栈段。并行进程添加一个共享数据段,允许共享范围增长。并行进程通过共享变量进行通信。
同步
同步保护共享变量,确保只有一个进程可以访问。同步协调并行进程执行和同步点。共享存储器系统有两种主要的同步构造:锁
和障栅
。图(a)中,使用锁的3个进程保证互斥。P2等待P1解锁临界区,P3等待P2解锁。图(b)中,P3和P1到达障栅语句,但必须等待P2到达。当所有进程到达障栅时,它们可以继续执行。
- 4.7 小结
共享存储器系统由
处理器
和存储器
组成,处理器通过读写存储器进行通信和同步。系统面临争用和高速缓存一致性挑战,通过本地高速缓存缓解瓶颈。高速缓存一致性方案有监听协议和基于目录的协议。分布式共享存储器体系结构兴起,硬件采用消息传递设计,编程模型采用共享存储器思想。对程序员而言,体系结构表现为共享存储器机器,实际上包含消息传递体系结构
。
第5章 消息传递体系结构
消息传递系统用于多处理器间通信和数据移动。每个结点有处理器和本地存储器,通过互连网络进行通信。数据通过消息传递在结点之间移动。程序员使用发送/接收指令编写应用软件。
消息传递系统
逐渐被互联网系统
取代。本章讨论编程模型、消息路由、网络交换、支持消息传递的处理器和实例。
- 5.1 消息传递简介
消息传递体系结构用于处理器间的数据通信,不需要全局存储器。每个处理器有
本地存储器
,通过消息传递与其他处理器通信。这种模式消除了对大型全局存储器和同步的需求,比共享存储器模式更高级。消息传递体系结构主要包括处理器P和本地存储器M的多个结点N,通过外部通道和互连网络进行通信。链路带宽
和网络时延
是设计互连网络时必须考虑的重要因素。
应用程序分成多个并发进程
,在不同处理器上执行,并使用内部通道或外部通道进行消息交换。消息传递的优点包括无需同步以及灵活可扩展的处理器容纳能力。进程粒度描述了进程的计算时间与通信时间之比,可以是粗粒度、中粒度或细粒度。消息传递多处理器主要使用中粒度或粗粒度。
- 5.2 消息传递网络中的路由
广播和多播的路由
路由是选择消息路径
的技术。路由识别目标路径并选择一条合适路径。自适应路由依赖网络环境,确定路由只考虑源和目的。集中式路由在发送前确定路径,分布式由节点决定。确定路由效率低下,而自适应路由能根据网络状态选择路径。例如e-cube、维序路由。
通信操作有单播
和集合通信
。单播是一对一通信,集合通信定义了广播
和多播
。广播是发送相同消息给所有结点,多播是发送消息给多个目的地。广播用于分布式存储器程序,多播用于多处理机系统。实用的广播和多播路由算法应无死锁,以最短路径传递消息。一种实现是在路径上复制消息,分支直到达目的结点。另一种方法是单独寻址,但效率较低。
路由的潜在问题
消息传递系统中的路由机制可能导致死锁
、活锁
和机饿
。死锁发生在两个消息相互占用资源并相互阻塞的情况下,解决方法可以是重新路由消息或丢弃消息。避免死锁的方法是通过资源排序和严格顺序请求资源的方式防止循环等待。活锁指消息在网络中传递却无法到达目的地,解决方法可以是根据优先级路由消息并限制同时注入的消息数量。机饿意味着某个结点的消息被禁止注入到网络,可以通过允许结点维护自己的消息队列并使用公平队列管理策略来避免机饿。
- 5.3 消息传递中的交换机制
交换机制
确定数据从输入通道移出放入输出通道。时延取决于交换机制,如存储转发、电路交换、虚拟直通、虫孔和流水线交换。电路交换静态分配带宽,无缓冲,最小总延迟。存储-转发
灵活动态带宽分配,包括包交换和虚拟直通。包交换划分为包传输,端到端组装,减少缓冲。虚拟直通存储包,忙时发送,避免延迟。虫孔路由
使用小缓冲,在不受路径长度影响下产生时延,存储空间较少。下图展示了存储转发和虫孔路由性能。
网格网络中的虫孔路由
Meah是n维网格,有Ko×K1×…×K-1个结点。每个结点用n维坐标向量标识。路由技术包括维序、维逆序、转向和消息流模型。在二维网格中,即X-Y路由,包先按X维发送,再按Y维发送。通过前两个片中的坐标实现路由。根据正负进行增减量,到达Y维后判断结果决定下一步操作。下图展示了8x8网格中的X-Y路由。
虚拟通道
虚拟通道用于设计无死锁的路由算法,提供了低成本增加逻辑通道数量的方法,无需增加更多线路。虚拟通道允许阻塞的消息通过,提高吞吐量,并增加资源分配自由度。通过将物理链路划分为单向虚拟通道,实现多路复用和数据引导。虚拟通道避免死锁
,每个节点分配缓冲区
,收到的数据放入缓冲区并在适当时间发送。
- 5.4 消息传递编程模型
消息传递体系结构使用send、receive、broadcast和barrier等原语实现进程间通信。发送进程使用
send原语
将缓冲内容发送到目标节点,接收进程使用receive原语
接收来自源节点的消息并存储到指定缓冲区。发送和接收是阻塞的,需要使用三阶段协议,导致通信时延增加且无法充分利用带宽。为避免此缺点,许多实现采用非阻塞操作,将消息缓冲在消息层
直到网络端口可用,并在接收方缓冲直到匹配接收执行。不同消息传递机器性能有所差异,考虑到消息启动代价(T)、每字节代价(T)和每浮点操作平均代价(T)等指标。
- 5.5 支持消息传递的处理器
消息传递处理器支持进程间通信,使用
端口
进行发送和接收操作。消息由头和体组成,端口集合指定权限。IPAX432处理器使用条件操作
实现非阻塞消息传递。还有非阻塞操作如代理发送和接收。AS/400处理器使用事件对象类型
支持消息传递,包含事件数据字段。发送通过处理器操作SIGNAL-EVENT,接收使用WAIT-ON-EVENT等操作。注意,接收操作没有真正的阻塞,超时由每个进程执行的操作决定。
- 5.6 消息传递体系结构实例
实例有CaltochHperube、IrsTtansputersyslems、MeikoCS-2等,这些系统支持并行计算和消息传递,具有不同的架构和特性。其中,CaltechHypereube和CoemicCube是基于超立方体的系统,而CS-1则是基于IaTnpuerT00的系统。IPSC/I和PSCI使用286处理器和NXI软件环境。HCUBE/2采用20MHz处理器互连超立方体。CM-5是分布式存储器消息传递系统,基于SPARC处理器。最新的系统是
IBM Scalable POWERparallel3
。
IBM Scalable POWERparallel3:IBM POWER3 (SP3) 是IBM超级计算机(1999/2000)系列。SP3由2到512个POWER3处理器节点
组成,每个节点有私有存储和AI操作系统副本。POWER3是8级流水线处理器,每个周期执行两条指令,乘法需2周期,除法需13-17周期。FPU包含两个双精度浮点执行部件,遵循IEEE754标准。节点通过高性能包交换网络互连,采用消息传递编程模型,支持PVM
、MPL和MPI
库。通信协议支持异步/阻塞的发送和接收操作。
- 5.7 消息传递体系结构与共享存储器体系结构
共享存储器和消息传递是并行计算中常见的通信模型。共享存储器适合
应用编写者
,提供隐式的地址空间共享和分离的同步和通信机制。消息传递适合操作系统设计者
,使用显式的进程间消息交互和统一的同步机制。虽然两种模型可互相模拟,但消息传递更容易模拟共享存储器。共享存储器简化了程序员对通信细节的考虑,扩展了单处理器编程模式。然而共享存储器需要轮询接口和完整的往返路由,而消息传递使用中断驱动的通信模型。两种模型各有适用领域,而类似FLASH系统
则综合二者的优势,实现高效的多处理机通信。
第6章 抽象模型
并行计算可以分为共享存储器系统和消息传递系统。本章将学习共享存储器和消息传递的抽象模型,并研究并评估并行算法。抽象模型是理想化的,但在研究算法的性能和复杂性时非常有用。我们从PRAM
共享存储器系统模型
开始,讨论其与消息传递系统的关系,并提供同步消息传递模型
。通过这些模型,我们将讨论算法的复杂性,并对这两种模型的算法进行评估。
- 6.1 PRAM模型及其变体
并行计算理论模型描述和分析算法的框架,用于性能限制和复杂性估计。PRAM模型是常用模型之一,抽象化并行计算机,忽略通信成本和同步开销。PRAM由
控制器
、p个处理器
和共享全局存储器
组成,每个处理器有私有存储器。
处理器在同步的读、计算、写周期操作,执行相同指令,称为共享存储器的单指令多数据机器。PRAM保证对共享存储器中数据的原子访问。PRAM中读写操作有不同模式,如互斥读、互斤写、并发读和并发写。根据不同模式,PRAM可分为EREW、ERCW、CREW、CRCW等子类型。
- 6.2 在EREWPRAM上模拟多个访问
EREWPRAM
是最严格的4种子类型之一,只允许单个处理器读写给定存储器单元。为该模型设计的算法不能依赖并发访问相同存储器单元以提高性能。EREWPRAM算法
可在CRCWPRAM上运行,只需避免使用并发访问特性。反之不成立。可以在EREW模型中模拟并发读写操作,但需花费时间和更多存储器。广播机制
可实现处理器对存储器单元x的并发读取。用大小为p的数组L作为共享存储器,实现处理器间发布x的内容。下图展示了当p=8时的Broadcast_EREW算法。
- 6.3 并行算法的分析
并行算法的复杂性主要由
时间
和空间
复杂性决定。时间复杂性以问题大小为基础,空间复杂性表示所需存储器空间。时间复杂性是衡量算法性能的重要指标。并行算法中,性能
取决于运行时间和处理器数量。成本
是运行时间乘以处理器数量。成本最优的并行算法与串行算法最低复杂度匹配。增加处理器数量可能加速成本最优PRAM算法,但需谨慎以避免增加成本。设计有效并行算法时,需考虑问题大小限制处理器数量、运行时间明显小于串行算法、成本最优化。
NC类和P完全:在算法理论中,有不同类别的问题,如P类
(多项式时间可解)、NP类
(多项式时间可验证)、NP-困难类
(与NP问题一样难)和NP-完全类
(难以计算解决)。在并行计算中,我们有NC类(可充分并行解决)与P类的关系未解。P完全类是那些与P问题一样难以并行解决的问题。这些类别涵盖了组合数学、图论和计算机科学中的许多经典问题。在未解决的问题中,我们探讨了PCNP与NCCP的关系。P完全问题包括深度优先搜索、最大流和回路值问题。这些类别之间的关系如图示。
- 6.4 计算和与所有和
EREW模型上数字数组的求和
PRAM算法用并行化和二叉树总和,在O(log n)时间和O(n log n)成本内计算数字数组的部分和。该算法使用n/2个处理器,将数组数字分布在二叉树叶子节点上,并逐层计算总和。运行时间O(log n),处理器数量n/2,成本O(n log n)。
数组的所有部分和
使用AlISuns_EREW算法在n-1个处理器的EREWPRAM上计算数组的所有部分和。运行时间O(log n),处理器数量n-1,成本O(n log n)。算法利用空闲处理器提高效率。
- 6.5 矩阵乘法
使用n^3个处理器
研究并行矩阵乘法,提出两个nxn矩阵相乘的算法。运行时间O(log n),处理器数量n²,成本O(n²log n)。优化算法需减少处理器数量以降低成本。
减少处理器的数量
优化算法:在改进的MatMulCREW算法中,每个处理器计算lgn个乘积和。然后将这些乘积和相加。使用n²/lgn个处理器,算法的运行时间为O(log n),处理器数量为n²/lgn,成本为O(n²)。这种优化方法能够降低处理器数量并提高运行效率。
- 6.6 排序
这基于
枚举思想
的排序算法通过计算比每个元素小的元素的个数来确定排序顺序。使用n²个处理器的CRCWPRAM模型,两个步骤实现排序:1. 每行的处理器计算元素的小于它的个数。2. 每行第一个处理器将元素放入排序列表的适当位置。该算法的复杂性指标:1. 运行时间T(n) = O(1),2. 处理器数量P(n) = n²,3. 成本C(n) = O(n²)。尽管该算法在常数时间内完成排序,但使用了大量处理器,且基于强大的CRCWPRAM模型,不是最优解。
- 6.7 消息传递模型
同步消息传递模型
消息传递系统算法由本地程序
组成,分布于分布式系统的处理单元上。程序执行计算和消息传递。通信图用于建模,节点表示处理器,边表示通信链路。同步模式下,本地程序在同步回合处理。异步模式没有严格的同步,程序按任意顺序和速率执行。部分同步系统在定时事件上限制执行。本节主要研究同步消息传递系统,使用形式化模型描述。算法复杂性分析包括时间
和消息
复杂性。
给定n个进程的消息传递系统,每个进程在独立处理器上运行。系统初始化并以任意初始状态开始。每个进程以同步回合方式执行消息生成和状态转换函数,发送和接收消息来改变系统状态。系统基于进程间的消息改变当前状态。系统模型包括状态机描述
:初始状态、状态集合、消息字母表、消息生成函数和状态转换函数。该同步系统可使用模板STemplate描述并研究算法。
复杂性分析
复杂性分析量化算法所需资源总量。在消息传递系统中,时间复杂性表示算法执行时间
,消息复杂性表示发送的消息数量
。复杂性通常以系统节点和边数量的函数形式表示。例如,超立方体算法的复杂性为O(log n)的时间复杂性和O(n log n)的消息复杂性。
- 6.8 领导者选举问题
分布式系统中
选举领导者问题
:n个处理器,一个必须成为领导者。每个处理器只知道自己的标识,最终要决定是否成为领导者。领导者负责协调分配、路由等任务。在令牌网中,领导者处理丢失令牌问题。领导者问题在相同进程的名系统中无意义。定理6.1:名环中不存在领导者选举算法。多种算法思想:广播标识符
给其他结点,最高标识符的结点成为领导者。复杂性取决于节点数和边数,可以优化消息数量。同步模型下,一个回合完成标识符交换,最高标识符者成为领导者。复杂性可优化,节点逐层发送标识符给邻居。
- 6.9 同步环中的领导者选举
简单领导者选举算法
简单选举领导者算法:沿环发送标识符,收到自身标识的成为领导者。复杂性:时间0(n),消息0(n²)。
改进的领导者选举算法
为了减小消息复杂性,进程不需要沿着环发送自身ID,只需将消息发送给一定距离的邻居,距离逐步增加。这思想由Hirschberg和Sinclair(1980)提出。假设通信双向,环大小未知,每处理器标识唯一。算法如下:1.每进程双向发送标识消息到邻居,间隔2倍跳跃,然后返回原位置。2.若标识在外环行进,进程根据收到的标识比较发送给输出邻居。3.若标识在内环行进,若收到标识较大,发送给路径上输出邻居。4.若两消息回到原位,k增加1,重复步骤2。复杂性:运行时间O(n),消息复杂性O(n lg n)。
第7章 网络计算
因特网的增长推动了全球大规模网络计算的发展。
因特网
是目前范围最广的分布式系统,结点
可以是不同类型的系统。链路
是TCP/IP包交换的连接,带宽
受负载、跳数和通信技术影响。网络计算利用不同系统的能力,将应用划分为多个部分分配给不同结点。此外,网络技术可用于构建商用计算基础设施,最大化利用空闲资源。
- 7.1 计算机网络基础
网络性能
网络可分为广域网(WAN)
、城域网(MAN)
、局域网(LAN)
和系统/存储区域网(SAN)
。广域网连接大量计算机,覆盖大范围;局域网连接少量计算机,覆盖小范围;城域网介于两者之间;SAN连接计算机或存储设备。Gilder定律表示通信系统带宽每12个月增加2倍,Metcalfe定律说明网络价值与结点数量的平方成正比。这些规律解释了网络增长和性能限制。
因特网
因特网是全球覆盖的协同虚拟网络,基于TCP/IP协议。它推动了电子出版、浏览和分布式计算的快速发展。用户数量持续增加。
其他网络技术
除了TCP/IP协议外,还有其他协议和协议集合,如以太网、FDDI、HIPPI、ATM和SCI。它们提供了不同的网络技术和速度。以太网有快速以太网和千兆以太网,FDDI使用光纤电缆传输数据,HIPPI是点对点通信通道,ATM适用于局域网和广域网,SCI提供了机群范围的共享存储器系统。
- 7.2 客户/服务器系统
客户/服务器
是分布式系统的一种形式,将应用划分为客户和服务器。客户通过网络连接到服务器,执行特定任务。这种架构可以是2层或3层的。现代编程语言提供了开发基于客户/服务器的分布式系统的基础。在传统的客户/服务器环境中,处理能力强的机器充当服务器,为多个客户提供服务。多线程的进程是一种有效的服务器应用方法。
套接字:套接字
连接应用程序使不同机器间能互相通信。创建套接字可等待连接(被动)或主动初始化连接(主动)。客户端创建套接字实例主动连接远程服务器。服务器套接字实例绑定端口等待客户连接。连接建立后,客户与服务器可通过输入输出流读写套接字。
Java中使用Socket类创建客户端套接字,ServerSocket类创建服务器套接字。使用DataInputStream和DataOutputStream类读写套接字。客户:连接服务器并接收字符串显示。服务器:等待连接,发送字符串,关闭连接。
远程过程调用:RPC简化了远程过程调用的复杂性,实现跨计算机的过程调用,参数通过网络传递,返回结果继续执行。RPC可阻塞或非阻塞,后者需显式询问回复。
中间件:中间件简化客户/服务器系统的互操作性,整合新旧系统,解决互操作问题,隔离组件,降低开发成本,无需了解网络和分布式编程细节。
并行应用的客户/服务器框架:并行应用使用客户/服务器模型,将大应用划分成小问题,由多个服务器同时处理。服务器
计算结果发送给客户,客户
组合结果输出给用户
。客户创建套接字数组和数据流与服务器连接。客户主体划分任务给服务器,并等待结果返回。服务器创建套接字、等待连接,并调用服务器主体线程处理客户。
- 7.3 机群
20世纪90年代,从专用并行机转向经济高效的
PC
和工作站机群
。机群是独立计算机集合,提供经济高性能计算。机群可同构或异构,互连网络需高带宽低时延通信。专用机群放在单独房间,节点除前端外无键鼠显示器。机群实现高可用性环境,中间件支持错误恢复。统一访问属性包括入口点、文件系统、系统管理映像、协同资源管理。编程环境提供开发并行程序的工具和库,如线程
、PVM
和MPI
。
线程:现代操作系统支持进程内线程,它们是处理器的基本执行单元。线程可以被中断和切换,使处理器能够执行其他线程。一个进程可以包含多个线程
,线程是轻量级的,与重量级进程不同。线程之间的上下文切换较为容易,不同进程的线程可以并发执行
,并且相同进程的多个线程可以在不同处理器上运行
。线程可以用于发送和接收消息,同时进行其他任务操作。例如,一个任务可能有多个线程等待接收和处理请求消息,在处理消息的同时,其他线程可以并发地处理其他消息。Java语言内置对多线程的支持,能够映射到底层操作系统的线程,使使用Java编写的应用程序能够在多处理器环境中并行执行。
- 7.4 互连网络
机群性能取决于处理器和互连网络速度。带宽决定传输速度,时延是传输消息的时间。以太网是早期的互连网络,其他高速网络提供更好的性能。
以太网:以太网
是局域网技术,多台主机共享总线,采用CSMA/CD访问控制
。速度从10Mbps发展到100Mbps和1Gbps。每台主机有唯一48位以太网地址。主机根据目的地址传输数据包。配置需平衡以太网速度和处理器速度。建议高性能机群使用16台200MHz处理器连接到快速以太网。配置取决于规模、处理器速度和网络带宽关系及价格表。
交换机:一个nxn交换机由n个输入端口、n个输出端口、链路、控制逻辑和缓冲器组成。交换机用于建立输入端口到输出端口的连接,可以是一对一
或一对多
。允许多对一连接时需要仲裁解决冲突。交叉开关可以建立n!个一对一连接。路由可采用源路径
或基于表
的方式,前者将完整路径存储在包头,后者使用路由表选择输出端口。
MyrinetClos网络:Myrinet
是高性能的交换式包通信技术,可替代以太网。交换机有多个端口,包通过输入通道进入端口,并路由到输出通道选择的端口。交换机可有4、8、12、16个端口。使用交叉开关和接口芯片实现,能建立不同大小和拓扑的网络,如Clos网络。主机之间有最短路由。Myrinet包的路由采用源路径
方法,包含完整的路由信息,通过控制程序在交换机进行源路由转换。
Quadrics网络:Qualrics
由Elan网络接口和Elite通信交换机组成。Elan连接处理节点,提供本地处理和消息传递协议支持。QNet使用四元胖树拓扑连接Elite交换机,采用源路由
和虫孔路由流
控制。Elite附加路由信息到包头,并递归转发到目的地。网络节点可使用广播发送包到多个目的地。
- 7.5 机群实例
加州大学伯克利分校的工作站网络:加州大学伯克利分校的工作站网络(NOW)是机群系统的重要代表,使用Myrinet交换机网络连接。编程环境包括套接字、MPI和SplinC并行版本C语言。主动消息是NOW的基本通信原语。
Beowulf 机群:Beowulf机群项目利用商用机器实现超级计算机处理能力。通过以太网连接处理器,通信使用TCP/IP协议。Loki和Avalon是成功的机群,分别具有高能奔腾处理器和Alpha微处理器,速度分别达到1.2Gflops和47.7Gops。
FlashMob1:日金山大学2004年创建FlashMobI临时计算机,连接700台计算机,目标是构建最快超级计算机。最佳Linpack值为180Gflops,最佳完成结果为77Gflops,遇到的挑战在于识别计算机连接和最佳配置。
- 7.6 网格计算
机群
由多台计算机构成,表现为单个系统;网格
由多个系统组成,保持自主性。网格中间件较机群复杂,用于连接分布和异构的计算资源。全球网格资源包括硬件、软件、数据和仪器,支持复杂应用和协作。虚拟组织提供统一资源视图,实现资源共享。网格挑战在于共享资源同时保持自治性
,需解决资源管理、安全、通信、性能等问题。Globus和TeraGrid是网格工具,支持资源共享和管理。TeraGrid旨在构建全球最大、最快的分布式基础设施,支持科学研究。
第8章 并行虚拟机的并行编程
PVM是
并行虚拟机
,由Oak Ridge国家实验室和田纳西大学开发。它使得在网络连接的异构计算机上开发应用程序成为可能,以单一的并行计算机形式呈现给用户。PVM提供进程控制
和资源管理
功能,通过消息传递实现通信,在不同计算机间具有互操作性。一个PVM应用由任务组成,共同解决问题,通过消息交换进行通信。
- 8.1 PVM环境和应用结构
管理者-工作者结构
PVM中的结构包括管理者和工作者,管理者负责初始化和与用户交互,工作者独立执行计算任务并将结果返回给管理者。工作者可以相互通信。例如,使用管理者-工作者结构对数组排序,工作者独立排序子数组,最终由管理者合并结果。
层次结构
层次结构允许工作者创建新工作者层次,如数组排序。顶层管理者创建工作者,它们创建下一层工作者,以此类推。叶子工作者独立排序子数组,并将结果返回给父级工作者。最终,顶层管理者合并排序结果。这个过程适用于分而治之
的应用。
- 8.2 创建任务
PVM中的任务手动创建或派生。初始化任务手动激活,用pvm_spawn()创建子任务,指定机器、路径、数量和参数。任务标识(TID)区分发送和接收,给任务分配功能。
任务标识符的获取
并行虚拟机提供函数获取TID,标记任务及其父任务及其他任务。通过pvmmytid()
获取自身TID,pvmspawn()
返回创建子任务的TIDs数组。pvmparent()
获取父任务TID,没有则返回PvmNoParent。通过pvm_tidtohost()
确定任务运行在哪台主机上。
动态任务创建
pvm_spawn()
函数用于在同一机器或不同机器上创建任务。参数包括可执行文件名、参数、派生目标、机器名或体系结构类型、任务数量和返回TIDs的数组。参数Flag控制派生操作的目标。派生命令需确保可执行文件存在于目标机器上。
例子中在homer和femmi上创建2份和4份"worker"程序的副本,通过&tid1和&tid2返回任务的TID,n1和n2表示实际创建的任务数量。
- 8.3 任务组
PVM允许任务隶属于命名组并变更隶属关系,组可用于
集合操作
。例如,广播操作通过命名组向所有任务发送消息。任务可随时加入或离开组,无需通知。通过pvmjoingroup()
将任务加入组,返回实例号。组在首次调用pvmjoingroup()时创建,实例号从0开始递增。实例号可能有间隙,因为任务离开组。新成员加入有间隙的组时,获得最小可用实例号。程序员需维护无间隙实例号集合。通过pvmlvgroup()
使任务离开组,返回信息或负值。重新加入组将获得不同实例号。其他函数如pvmgsize()
获取组大小,pvmgettid()
根据实例号和组名获取任务的TID,pvmgetinst()
根据TID和隶属组名获取实例号。
- 8.4 任务间的通信
PVM使用消息传递实现任务通信,采用
例程库
和守护进程
。通过发送和接收异步消息进行通信,守护进程决定消息目的地。发送任务可以发送消息给多个接收者,接收任务在阻塞或非阻塞情况下接收消息。控制线程在守护进程短暂阻塞。发送命令发送消息给守护进程,守护进程将消息传送至物理链接。接收命令以阻塞或非阻塞方式等待消息。一条完整消息经初始化、打包和解包过程到达目的地。
消息缓冲区:PVM提供两个创建缓冲区的函数:pvminitsend()和pvmmkbuf(),它们用于装配发送消息之前的数据。缓冲区创建时有三种编码选项,其中默认为XDR编码
,适用于不同机器间无法读取原始格式的消息发送。第二种选项跳过编码
步骤,直接发送原始格式的消息。第三种选项是直接从用户存储空间复制数据
,节省时间但要求在发送前不修改数据。若只使用一个发送缓冲区,使用pvminitsend()清空缓冲区。pvm_mkbuf()则适用于需要多个缓冲区的应用。PVM提供函数设置活动发送和接收缓冲区,并获取它们的标识。
数据打包:PVM提供打包函数pvmpk()
将给定数据类型的数组打包到发送缓冲区,在第一个参数指针、第二个参数项数、第三个参数步长的设置下进行操作。针对不同数据类型有相应的打包函数,例如pvmpkstr()用于打包字符串。可以多次调用打包函数将数据打包到同一消息中。注意消息的打包与解包需要一致。
发送消息:在PVM中,消息发送采用异步方式。pvmsend()用于点对点发送,pvmmcast()用于多目标发送,pvmbcast()用于组广播,pvmpsend()实现打包和发送。发送任务无需等待接收任务。
接收消息:PVM支持三种消息接收方式:阻塞
、非阻塞
和时限
。阻塞式接收需等待消息到达并创建接收缓冲区。非阻塞接收立即返回,若消息不存在则bufid=0。时限接收在指定时间内等待消息,返回bufid=0表示未接收到。pvnrecv
函数阻塞接收来自tid、tag的消息,返回缓冲区标识。pymnrecv
函数非阻塞接收,bufid非零表示有消息。pvmtrecv
根据timeout设定时限接收,bufid=0表示超时。pvmprecv
函数将阻塞接收和解包整合,返回实际值。
数据解包:接收消息需与发送任务的打包方式匹配解包函数。PVM提供多种解包函数,如pvm_upk,对应特定打包函数。示例调用中解包字符串和数组。
- 8.5 任务同步
优先权同步
同步结构用于强制执行次序,例如任务等待计算完成后继续执行。并行任务无论是否有数据相关,都需要在某个同步点同步。PVM中常用的同步方式是阻塞接收
和障栅操作
。阻塞接收(pvm_recv)可强制等待匹配的消息。通过挂起消息,发送者可让接收者等待。例如,任务TO调用f后,使用发送操作,任务TI调用g前使用匹配的阻塞接收操作,确保特定的执行次序。
障栅
使用障栅作为同步点可实现并行任务的同步。所有任务必须到达障栅后才能继续执行。PVM提供pvmbarrier()
函数实现障栅同步,需指定组名和成员数。示例中,任务组slave通过pvmbarrier(slave, 3)实现同步,使得T0和TI在等待,直至T2到达障栅后才继续执行。
- 8.6 归约操作
归约操作将多个值归约为一个结果,可以是最大值、最小值、乘积或其他二元操作的结果。PVM提供
pvmreduce()
函数支持归约操作。函数格式为:info=pvmreduce(func, data, n, datatype, tag, groupname, root)。参数意义见下表。
可对组内数据数组的元素执行归约操作,归约值返回给指定的根节点。用户可自定义函数或使用PVM预定义函数如PvmMin、PvmMax、PvmSum和PvmProduct。下示例针对组"slave"的dataarray数组执行归约和,组有三个成员:T0、TI和T2。归约值返回给根节点,此例中根节点为任务TI。三个任务需调用函数:info=pvmreduce(PvmSum, dataarray, 5, PVM_INT, tag, "slave", root)
。
- 8.7 工作分配
采用不同程序
向工作者分配工作有两种方式。如果工作者并发地对不同数据集执行相同操作,则编写单一程序适合所有工作者。另一方面,如果工作者执行不同功能,则可以采用不同程序。
管理者通过pvmspawn()激活不同的工作者任务,并通过pvmparent()返回管理者的TID以进行通信。例如,在主机cselab01、cselab02、cselab03和cselab04中激活任务"worker1"、"worker2"、"worker3"和"worker4",可以使用以下语句创建所需任务:
info1 = pvmspawn("/user/rewini/worker1", 0, 1, "cselab01", 1, &tid1)
info2 = pvmspawn("/user/rewini/worker2", 0, 1, "cselab02", 1, &tid2)
info3 = pvmspawn("/user/rewini/worker3", 0, 1, "cselab03", 1, &tid3)
info4 = pvmspawn("/user/rewini/worker4", 0, 1, "cselab04", 1, &tid4)
这样可以根据并行任务的需要分配工作给不同的工作者。
采用同一程序
若事先知道并行任务的标识号,可以轻松为运行同一程序的任务分配工作。通过使用条件语句和任务的标识号,可以将工作分配给相应的任务。然而,在PVM中,任务的标识号可以是任意整数,不仅限于1、2、3等。可以通过任务组或任务ID数组来克服此问题。
在任务组
中,所有任务加入一个组,实例号作为任务的标识号。在任务ID数组
中,管理者将包含所有任务TID的数组发送给工作者,并使用下标来标识相应的工作者。
第9章 消息传递接口
MPI
是标准的消息传递接口,用于编写高效的移植性消息传递程序。MPI提供点对点通信和集合操作,支持并行计算、数据移动和同步。MPI应用程序由并发通信任务集合
组成,每个任务具有唯一编号,在发送和接收消息时进行协作。任务可以在同一处理器上或并发运行在不同处理器上。
- 9.1 通信
MPI使用
通信子
来实现安全通信,它将通信上下文与任务组绑定。通信子分为内部通信子和互连通信子,用于任务组内和不同任务组之间的操作。MPI应用程序启动时,所有任务关联通信子"world"。当需要新的上下文环境时,通过同步调用创建新的通信子。
任务组:MPI任务可隶属于命名组,组是一个对象,通过MPI_Group
句柄访问。任务组提供上下文环境
,限制MPI操作在组内执行。组成员具有唯一编号,从零开始。MPI提供函数从现有组创建新组,不直接创建组。初始时,任务属于基本组,其他组基于基本组形成。新组成员可来自一个或多个组。新组可通过删除组任务或仅包含一个任务形成。可对两组执行并、交、差操作以生成新组。
默认通信子:MPI提供通信子MPI.COMMWORLD
作为默认上下文环境,在MPIInit()
调用后,这个通信子包含了所有任务的集合。MPI.COMMWORLD的值在所有进程中相同,并在任务生命周期中不变。MPI还提供预定义通信子MPI.COMMSELF,仅包含调用进程本身。
任务编号:通信子中的任务被赋予连续整数标识,范围为0到组大小减1,称为编号。
通过MPICommrank()函数获取任务在通信子中的编号:
MPIComm communicator; // 通信子句柄
int my_rank; // 调用任务编号
MPICommrank(communicator, &my_rank);
该函数返回调用任务在通信子中的编号(my_rank),基于给定的通信子(communicator)。编号用于区分组内不同任务执行不同的工作。
通信子组:通信子关联的组通过MPICommgroup()获取,MPI不支持创建空组。
MPICommsize()函数获取组大小。例如,启动时有5个任务(T0、T1、T2、T3、T4),T3调用MPICommrank()得编号3。调用MPICommgroup(MPICOMMWORLD, &worldgroup)
创建包含T0至T4的组,MPICommsize(MPICOMM_WORLD, &n)
得到5。
- 9.2 虚拟拓扑
笛卡儿拓扑
对于组内任务的编排,线性编号无法完全反映任务间的逻辑通信模式
。通过为通信子添加拓扑属性,可以采用不同形式的任务逻辑安排,如二维或三维网格。MPI提供了笛卡儿拓扑和图拓扑两种虚拟拓扑。使用MPIcartcreate()
函数可以创建任意维度的笛卡儿结构,其中包括已存在的通信子、维度大小、周期性等参数。创建通信子后,可以对任务编号变更。
获取任务坐标和编号
MPI的函数可以帮助任务查询其编号和在笛卡儿结构中的坐标。使用MPICartrank
函数可以根据任务的笛卡儿结构坐标,返回在通信子中的编号。类似地,MPICartcoords
函数可以根据任务的编号返回其在笛卡儿结构中的坐标。这些函数在管理笛卡儿拓扑中的任务编号和坐标时非常有用。
图拓扑
MPIGraphcreate()
函数用于创建关联图拓扑的新通信子。通过提供已存在的通信子、节点数量、节点度信息等参数,可以创建一个新的图拓扑通信子。如果允许系统优化虚拟拓扑到物理处理器的映射,则可能会导致任务编号的变化。下面是一个示例代码段,将图相关联到包含所有任务的通信子(MPIWORLDCOMM),使用MPIGraphcreate()函数创建新通信子graphcomm:MPIComm graphcomm; // 新通信子 int nnodes = 6; int index[6] = {2, 5, 8, 12, 14, 16}; int edges[16] = {1, 2, 0, 3, 4, 0, 3, 5, 1, 2, 4, 5, 1, 3, 2, 3}; int mapping = 0; MPIGraphcreate(MPIWORLD_COMM, nnodes, index, edges, mapping, &graphcomm);
- 9.3 任务通信
MPI任务间的通信基于消息传递模式,其中包括发送者、接收者、消息数据、消息标签和通信子等部分。MPI提供了丰富的发送和接收消息的函数,使得任务之间的通信变得灵活。通过这些函数,可以实现不同类型的任务间通信。
通信模式
MPI中的基本发送和接收消息函数是阻塞式
的,支持多种通信模式。标准发送是一种阻塞模式,发送者将被阻塞,直到消息被安全地复制到匹配的接收缓冲区或临时系统缓冲区。标准接收也是阻塞模式,接收者将被阻塞,直到接收到期望的消息。缓冲发送(B)
可以在发送调用返回后继续操作,而不必等待匹配接收。同步发送(S)
要求发送者和接收者都阻塞,直到发送和接收调用完成。就绪发送(H)
只能在匹配接收已被发出后启动,并不依赖于接收端的状态。
非阻塞通信
消息传递接口支持非阻塞
通信,任务启动发送/接收操作后继续执行其他工作,再检查操作完成状态。非阻塞发送/接收可与标准操作交替使用,不必配对。三步:启动发送/接收操作
(MPIIsend/MPIIrecv),执行计算
,完成通信
(MPIWait/MPITest)。可通过MPIIsend启动标准模式的发送操作,参数与其他发送函数相同,最后一个参数是标识通信操作的句柄。MPIIrecv类似,立即返回,用于查询或等待通信状态。MPI提供函数测试或等待非阻塞操作,如MPITest和MPIWait,还有MPITestall、MPITestany、MPIWaitall多个操作。
持续通信
MPI提供持续通信请求结构,减少通信开销。通过绑定参数列表
到请求、启动和结束消息,实现重复使用。可使用MPISendinit()、MPIBsendinit()、MPISsendinit()、MPIRsendinit()和MPIRecvinit()创建请求。使用MPIStart()和MPIStartall()启动通信,处理方式与非阻塞通信相同。请求参数通过句柄访问。
- 9.4 同步
MPI提供同步结构,用于强制并行任务按特定顺序执行。并行任务可能需要在某个同步点等待,直到其他任务到达。MPI中的同步通过
消息传递
和障栅
操作实现。阻塞接收可导致任务等待直到收到匹配的消息。通信同步允许两个任务在同步点会合。障栅允许任务在同步点进行同步。MPIBarrier
函数用于到达障栅前任务等待。例9.5和9.6说明了如何使用MPIBarrier等实现同步。MPI提供的同步机制使得并行任务的执行按照预定义的顺序进行,以确保正确的通信和协调。
- 9.5 集合操作
MPT中的集合操作是对通信子组中所有成员进行的操作,通常基于任务组定义。当组中所有成员使用匹配参数调用集合例程时,集合操作会执行。集合操作分为三类:
任务控制
、全局计算
和数据移动
。MPI_Barrier函数属于任务控制集合操作。后续将讨论全局计算和数据移动操作。
全局计算
这里将讨论全局归约和扫描操作。全局归约
是将结合和交换操作应用于任务成员提供的数据元素。归约操作可以是用户定义的函数或预定义操作,结果可返回给每个任务或仅返回给根任务。扫描操作
有前缀和后缀扫描两种类型,结果根据任务编号不同。MPI提供了归约函数MPIReduce,结果仅返回给根。MPI还提供了多对多归约函数MPIAllreduce,结果返回给所有成员。扫描操作可使用MPI_Scan函数执行,编号为i的任务的接收缓冲区将得到编号为0到i的任务发送缓冲区的归约结果。
数据移动操作
MPI提供广播、散播和汇聚等基本数据移动集合函数。广播
允许进程向组中的每个成员发送相同的消息。散播
操作允许进程给每个成员发送不同的消息。汇聚
操作是散播的对偶操作,进程可以从组中的每个成员接收消息。这些基本操作可以组合成更复杂的操作。MPI提供了MPIBcast
函数用于广播,MPIScatter
和MPI_Gather
函数用于散播和汇聚。这些函数需要在通信子组中的所有成员调用,并使用相同的根和通信子参数。散播操作中,根的发送缓冲区被分为多个片段,并复制到组中每个成员的接收缓冲区。汇聚操作中,每个任务将发送缓冲区的内容发送到根任务,并按顺序保存在根接收缓冲区中。
- 9.6 任务创建
这节介绍MPI应用程序在MPI-2中创建新任务、建立通信的方法。父任务派生子任务,使用MPICommspawn()和MPICommspawn_multiple()两个函数,这些函数必须由父任务调用。成功执行函数会生成一组新的子任务,父任务和子任务共享一个新的
互连通信子
。
联系被派生和派生任务
MPI-2支持动态任务,但并非必须创建新任务。可能需要在新任务和现有任务之间建立通信,MPI-2通过互连通信子实现这种衔接。下图展示了通过互连通信子在父任务和子任务之间建立通信。在派生一方,互连通信子的本地组是完成派生的组
,远程组是被派生的组
。在被派生一方,本地组是新任务的MPI_COMM_WORLD
,远程组是完成派生的组
。
启动相同任务
MPICommspawn()
函数创建程序副本并建立通信。参数:command(派生程序名)、argv(传递给派生任务的参数)、maxprocs(副本数),返回互连通信子和错误代码数组。该函数在父任务中返回互连通信子,包含本地父任务和远程派生的子任务。子任务可使用MPICommgetparent()
获得父任务的互连通信子。参数arrayerrorcodes是用于报告启动任务状态的数组。成功任务对应MPISUCCESS,其余为错误码。
启动多个可执行代码
MPICommspawnmultiple
函数可同时派生多个可执行代码或同一程序的多组参数。派生任务共用一个MPICOMM_WORLD,且任务编号与命令次序对应。
- 9.7 单边通信
MPI提供
RMA结构
,允许任务间的远程存储器访问。适用于动态改变数据访问模式、但数据分布相对固定的应用。传统发送/接收通信需要多个任务参与和按顺序匹配操作。RMA模式只需要一个任务发起传输操作,可以是源或目标。使用源和目标表示发起和相关任务。远程存储器访问通过put和get操作进行。put将参数发送给目标任务,get相反。这些操作可以在一个调用中完成。
指定目标窗口
RMA操作之前,每个任务需指定存储器窗口,供远程任务访问。使用MPIWininit
函数创建窗口对象。任务需执行该函数指定现有存储区窗口。窗口大小为size字节,起始地址为base。disp_unit用于偏移计算。info提供优化信息。任务可指定不同目标窗口,有不同的位置、大小和偏移单位。若任务选择禁用远程访问,则size=0。返回的win窗口对象包含与comm关联的组信息及目标窗口集的信息。
put和get操作
MPIPut
函数用于将一组连续元素从源任务传送到远程目标任务的缓冲区,传输方向相反的是MPIGet
函数。这两个函数需共享通信子和使用窗口对象关联源和目标任务。MPIPut有8个参数:源缓冲区地址、元素数量、数据类型,目标任务编号、目标缓冲区偏移量、元素数量、数据类型以及窗口对象。调用MPIPut将数据传送到与窗口对象关联的目标任务。目标缓冲区地址计算方法(window_base+Target_disp*disp_unit)
,窗口基地址和偏移单位在MPIWininit中指定。MPI_Get函数从目标任务缓冲区传送一组连续元素至源任务缓冲区。
第10章 调度与任务分配
调度问题
是并行与分布式计算中的挑战性问题,目标是优化任务的分配
方案,评估调度系统的性能和效率。基于性能标准评判调度,低算法复杂性更好。在复杂情况下,通过加入限制条件获得最优算法。解决通用问题需采用启发式算法,寻找近似最优解。本章讨论调度问题的解法,包括程序与系统模型、优化算法、启发式算法、调度与分配技术,同构与异构环境。
- 10.1 调度问题
一个经典问题
调度问题在不同领域描述方式各异。在生产管理中,作业排序影响调度问题解法。主要目标是为管理消费者对资源的访问找到高效策略,优化性能指标。程序、工厂作业或银行客户都需服务。在分布式系统中,调度问题源于程序的并发部分或一组程序的时间空间安排,以优化整体性能
。任务间的优先约束需要考虑。调度目标是确定任务向处理单元的分配和执行次序。解决调度问题常采用启发式算法,静态或动态方法,包括混合方法。本章介绍的技术属于静态调度技术。
调度模型
调度系统包括任务、机器和调度方法。任务图
映射到处理器和启动时间,最小化完成时间。执行时间为任务计算量除以速度,通信时间为数据传输量除以传输率。任务图表示任务间优先约束,无向图表示任务间通信。目标机器
由处理器和互连网络组成。调度将任务映射到处理器和启动时间,Gant图表示任务的时间。调度目标
是最小化总完成时间。执行时间为任务计算量除以速度,通信时间为数据量除以传输率。
- 10.2 未考虑通信的DAG调度
本节介绍了多项式时间优化算法,解决了三种调度问题:
入森林/出森林任务图
、间隔序列任务图
、两个处理器情况
。目标是最小化总执行时间。这些算法都属于表调度,按降序给任务分配优先级,然后构建任务表。任务无前驱或前驱已执行即为执行就绪。处理器无任务时执行表中最高优先级的就绪任务。多处理器情况下,不同调度程序的差异在于任务优先级分配方法。
入森林/出森林任务图调度
介绍了Hu提出的多项式时间调度算法,适用于入森林任务图,时间复杂度O(n),采用最高级优先策略。每节点级别是从源到终端最长路径上节点数,用于确定优先级。反向森林情况下无法保证最优结果。举例说明了算法应用,示范最优调度,关键路径长度为5。
间隔次序任务调度
介绍了间隔次序任务,这种任务图描述系统任务的优先级关系,它具有一定的结构属性
。Papadimitriou和Yannakakis提出了解决此问题的O(n+c)复杂度算法。算法的核心是将每个节点的后继任务数量作为其优先级,然后分配给可用处理器的未执行任务中具有最高优先级的任务。
二处理器调度
在这种情况下,有两个处理器(m=2)和任意结构的任务图优先关系。首个多项式时间算法由Fuji等(1969)基于匹配技术提出,时间复杂度为O(n²-3)
。改进算法包括Cofiman(1976)、Fujii等(1969)、Sethi(1976)和Gabow(1982),其时间复杂度分别为O(n²)
、O(min(en,n^2.61))
和O(e+mα(n))
,其中n是节点数,e是任务图中的弧数。本节介绍了Cofinan和Graham提出的算法,步骤包括为终端任务分配标号,定义任务优先级,以及根据优先级分配任务给可用处理器。最终,通过下图说明了算法的工作原理,任务被有效调度,处理器1和2同时可用,最终完成任务的调度。
- 10.3 通信模型
完成时间的两个成分
程序完成时间受计算时间和通信延迟两要素影响。通信延迟的计算方法因三种模型而异。任务图C=(T,E)在m处理器上分配,proc()表示分配。可用不考虑通信的Gantt图表示分配,显示任务优先级。程序完成时间=执行时间+总通信延迟
,总通信延迟=消息总数×每消息通信延迟
。消息总数由两模型确定:模型A,结点对(u,p)数目,满足moc(u),proc(p)。模型B,处理器-任务对(P,v)数目,P未计算任务,但至少计算一个直接后继。
由Gantt图计算完成时间
IO处理器允许处理单元同时计算和通信。任务可在Gantt图
通信间隙调度,通信延迟反映在Gantt图中。程序完成时间由Gantt图确定:程序完成时间=调度长度。通信延迟由模型C确定,它假设VO处理器与每个处理器关联。任务可分配给正在通信的处理器,同处理器的任务通信延迟可忽略,不同处理器任务通信延迟与消息大小、路由和速度有关。示例:任务图中,a向b、c、d、c发送消息。模型A中,消息数=2。模型B中,消息数=1。模型C中,分配给不同处理器的任务通信延迟为1单位。因此,程序完成时间为4单位。
- 10.4 考虑通信的DAG调度
在考虑通信开销时,有两种算法用于任务调度:
入森林
、出森林和间隔次序
。目标是最小化总执行时间,考虑任务图、处理器数、任务执行时间、通信模型C,通信延迟。
在2个处理器上调度入森林/出森林
算法由EI-Rewini和Ali(1994)提出,用于任务调度以最小化总执行时间,考虑通信开销。它通过增加新的任务优先关系
来补偿通信代价,创建扩展任务图。当任务图是一个人森林时,算法4可用于生成最优调度。算法4的核心思想是在扩展任务图中从同一集合中选择具有最大深度的节点
,并将它们放置在其他成员之后,但在共同孩子之前。这些额外的关系用于补偿通信延迟。然后,算法1可用于扩展任务图,生成不考虑通信延迟的调度。如果通信约束在输出调度中被违反,算法提供了Swapall操作,以交换任务的位置
以满足通信要求。算法的时间复杂性是O(n² + mm),其中n是任务数量,m是处理器数量。应用示例是下图中的入森林任务图,通过算法4进行调度,最终获得一个考虑通信的最优调度。
考虑通信的间隔次序调度
介绍了Ali和EI-Rewimi(1995)提出的最优调度算法,适用于任意数量处理器,考虑通信延迟。算法基于任务优先级,通过start-time和task定义,时间复杂性O(e+nm)。示例中,根据任务后继数,任务按优先级调度,通信延迟被考虑。算法动态分配任务,最小化执行时间,提高性能。
- 10.5 调度问题的NP完全性
NP-完全问题是
计算难题
,包括旅行商、汉密尔顿电路、整数规划等,通常要求指数时间解。这些问题的确切难度尚未确定,是理论计算科学中重要问题。某些调度问题也被证明是NP-完全问题,通常或有限制条件。
未考虑通信时的 NP 完全结论
介绍了调度问题的形式化定义和其特例。通用调度问题涉及任务调度在多个处理器上,有时间
和资源
限制。问题1是最通用的形式,问题2要求所有任务单一时间单位执行,问题3在两处理器上执行,问题4指定了任务之间的间隔次序,问题5与反向森林相关。这些问题都被证明是NP-完全问题,难以在多项式时间内解决。
考虑通信的NP 完全结论
不同通信模型下的调度问题复杂性变化大。在模型A下,任意处理器上的通信树是NP-完全。模型B下,相同执行时间和通信成本的两处理器上的调度问题是NP-完全,树形结构程序调度也NP-完全。在两处理器上的通信树调度问题尚待解决。模型C下,最优调度单位时间任务图在不限处理器数量时是NP-完全,要求通信成本相等且大于一个单位时间。
- 10.6 启发式算法
在解决调度问题时,需权衡并行程序和目标机器的限制。复杂性导致需采用次优方法,如
启发式方法
,虽不保证最优解但计算迅速。启发式方法基于直觉,利用参数影响系统。方法优劣取决于方案接近最优的频率和计算时间。启发式方法效果取决于系统参数
,某方法在某系统上最优,但不适于其他系统。因此,多种启发式方法应对应多环境。在通用调度问题中,需要考虑程序设计原则和启发式方法的思想。
并行性与通信延迟
在没有通信延迟的情况下,所有就绪任务可同时分配到可用处理器,降低执行时间,适用于共享存储
环境,通信速度快。但通信延迟
存在时,启发式调度算法需考虑延迟。长通信延迟任务可能与前驱任务分配到同处理器。例如,若a、b间通信慢,b分P1,a、c间通信快,c分P2。通信延迟增加了最优调度难度,需检查每处理器上结点的开始时间,权衡最大并行性和最小延迟。简而言之,通信延迟考虑下,任务分配需更复杂。
粒度大小和数据局部性
在并行计算中,粒度大小
是一个重要问题,需要在划分程序为计算颗粒时解决。颗粒是一组顺序指令,可以小到单个操作或大到整个程序。过大的颗粒会减少并行性,而过小的颗粒会增加上下文切换和通信开销。随着分布式计算的兴起,局部化数据
对粒度变得至关重要,以减少跨处理器的数据传输延迟。在最大局部性和最大并行性之间存在权衡,最优的中间粒度可以同时最大化局部性和潜在的并行性,从而实现最短的并行执行时间。
不确定性
确定性调度在执行前所有任务和关系都明确。不确定性则源于循环
和条件转移
编程。循环次数未知,条件转移高度不确定,增加调度复杂度。条件转移使执行时间和通信延迟变动。动态调度应对不确定性,但成本高,引入额外开销,可能导致任务频繁切换,浪费时间。相比之下,静态调度预测不确定性行为,影响调度质量。可考虑混合方法,兼顾静态和动态调度,降低成本。
基于优先级的调度
表调度算法在10.2节介绍,可扩展用于通用调度问题。按任务优先级
排序,最高优先级任务先执行。然后,根据不同启发式算法,分配任务优先级和选择处理器。例如,可基于任务图最长路径
或后继数
确定优先级,也可用最早开始/完成时间
选处理器。算法6,概述通用表调度算法。这种方法解决各种调度挑战。
簇化
这种调度启发式方法分两阶段:处理器分配
(分配任务给处理器)和任务排序
(安排任务在处理器上执行)。任务图簇化解决分配问题,将任务映射到簇,同簇任务在同一处理器上执行。若独立任务映射到同一簇,称非线性簇化,否则线性。簇化启发式非回溯
,以降低并行时间为目标,确保簇数不超处理器数。精练步骤合并簇,置连接边为零,降低通信开销。关键参数有关键路径和主序列。分布式系统任务调度两阶段法使用算法7中的任务簇化。
任务复制
调度启发式算法可采用任务复制来降低通信延迟
。因为跨处理器的通信开销较大,目标是减少任务间消息交换
。思想是在接收任务的处理器上尽可能执行发送任务的多个副本,将通信转为处理器内部。例如,图中任务a在P1和P2上的复制可减小任务c在P2上的开始时间,提高任务b和c的并行性。但要确保复制开销不过大,通常对细粒度任务图更合适。
- 10.7 任务分配
任务分配模型
在分布式计算中,任务分配是一个关键问题。当没有确定的任务执行顺序时,必须合理地将任务分配到处理器上,以最小化总开销。这包括任务执行
和通信
开销。任务分配的目标是平衡这两种开销,但它们通常相互冲突。将任务分配给同一处理器可减少通信开销,但可能导致负载不均衡。平均分配任务可提高处理器利用率,但增加通信。任务分配技术旨在找到最佳方案,以最小化总开销。模型假设了任务交互图
和执行时间向量
来表示问题。
二处理器最优任务分配
Harold Stone(1977)提出的优化算法解决任务分配问题,基于两端网络图和网络流算法。在两端网络图中,有源节点S和汇节点T,边带权重。问题是找到最小割集,即最小总权重的节点分割
,有多项式时间解法。算法适用于两个处理器的分布式系统,将任务交互图映射到两端网络图,通过网络流算法找到最小权重割集,确定最优任务分配。
处理器阵列上的最优任务分配
本节算法解决分布式系统中线性阵列
处理器情境(Lee等,1992)。任务交互图表示程序任务,系统由m处理器通过m-1链路连接,类似二处理器情形。借鉴Stone算法8思想,应用最大流最小切割算法。首先,构建相关两端网络图,割集对应任务分配,权重是总开销。最小割集即最佳任务分配。
启发式任务分配
任务分配问题为NP-完全问题,即使通信开销仅为0或1,也是NP难题(Ali和El-Rewini,1994)。面对问题复杂性,提出多种启发式方法。某些方法源自Stone算法解决二处理器问题,通用分配采用最大流最小割算法
。其他启发式方法利用图论。
- 10.8 异构环境下的调度
异构计算
是解决多种内在并行性应用程序的调度问题的有效方法。同构系统仅支持一种并行模式,无法满足多样性的需求。异构计算提供多种体系结构,如混合模式机器
和混合机器系统
,以协同执行不同需求的子任务。任务需要分解成同构子任务,然后分配给合适的机器或模式以最小化总执行时间。在异构环境中,程序划分和调度需要根据内在并行性类型进行分类,增加了挑战。调度通常分为系统级
和机器级
,确保任务与机器类型匹配。这需要用户指定任务分解和分配方式。异构计算的目标是最大程度地利用不同机器,例如,将任务划分为子任务、代码段和代码块,并将其分配给匹配的机器。异构计算的方法可以在相关文献中找到,如Chen等人(1993)和Freund与Siegel(1993)的研究。