并行架构与并行算法
冯·诺依曼结构改进
缓存与存储
Cache 基础知识
-
高速缓冲存储器(cache,简称缓存)的访问时间比其他存储区域的访问时间短。
-
CPU缓存(CPU Cache)。CPU Cache 是一组相比于主存,CPU能更快速地访问的内存区域。
-
程序局部性原理:
- 程序接下来可能会用到的指令和数据与最近访问过的指令和数据在物理上是邻近存放的。
- 在执行完一条指令后,程序通常会执行下一条指令。
- 当程序访问一个内存区域后,通常会访问物理位置靠近的下一个区城。
float z[1000]; . . . sum = 0.0; for (i=0:i<1000;i++) sum += z[i];
- 程序接下来可能会用到的指令和数据与最近访问过的指令和数据在物理上是邻近存放的。
-
高速缓存块或者高速缓存行:
- 一次内存访问能存取一整块代码和数据,而不只是单条指令和单条数据。
- 例子:如果一个高速缓存行可以存放16个浮点数
- 当执行sum+=z[0]时,系统可能把数组z最开始的16个元素:z[0]、z[1]、…、z[15]从主存读到Cache 中。
- 在后面的15次加法运算中,需要使用的数据已经在 Cache 中。
-
当向Cache 查询信息时
- 如果 Cache 中有信息,则称为 Cache 命中或者命中;
- 如果信息不存在,则称为Cache 缺失或者缺失。
- 命中和缺失是相对 Cache 层而言的
-
当 CPU向 Cache中写数据
- 写直达(write-through)Cache
- 当 CPU 向Cache 写数据时,高速缓存行会立即写入主存中。
- 写回(writ-back)Cache
- 数据不是立即更新到主存中,而是将发生数据更新的高速级存行标记成脏(dirty)。
- 当发生高速缓存行替换时,标记为脏的高速缓存行被写人主存中。
- 写直达(write-through)Cache
Cache 映射
-
全相联(fully associative)Cache
- 每个高速缓存行能够放置在 Cache 中的任意位置
-
直接映射(directed mapped)Cache
- 每个高速缓存行在 Cache 中有唯一的位置
-
路组相联(n-way set associated)
- 在n路组相联 Cache 中,每个高速缓存行都能放置到Cache中n个不同区域位置中的一个。
-
当内存中的行(多于一行)能被映射到 Cache中的多个不同位置(全相联和n路组相联)时,需要决定替换或者驱逐Cache中的哪一行
Cache 和程序:一个实例
-
C语言以“行主序”来存储二维数组。在行主序存储模式下,先存储二维数组的第一行,接着第二行
double A[MAX][MAX],x[MAX],y[HAX]; . . . /* Initialize A and x, assign y = 0*/ . . . /* First pair of loops */ for(i=0;i<MAX:i++) for(j=0;j<MAX;j++) y[i]+=A[i][j]*x[J]; . . . /* Assign y =0 */ . . . /* Second pair of loops */ for(j=0:j<MAX;j++) for(i=0;i=MAX:i++) y[i]+=A[i][j]*x[j];
-
第一个嵌套循环比第二个嵌套循环有更好的性能,因为它顺序访问二维数组中的数据
-
假设 MAX 等于4,那么数组A中元素的存储位置为:
-
假设 Cache是直接映射的,只能存储A数组的8个元素,即两个高速缓存行
- 在第一个循环:总共发生4次 Cache 缺失,每行发生一次。
- 在第二个循环:总共发生16次 Cache 缺失,每个元素发生一次
-
虚拟存储器
- 利用虚拟存储器(或虚拟内存),使得主存可以作为辅存的缓存。
- 在主存中存放当前行程序所需要用到的部分,来利用时间和空间局部性;
- 那些暂时用不到的部分存储在辅存的块中,称为交换空间
(swap space)
中。
- 虚拟存储器也是对数据块和指令块进行操作。这些块通常称为页(page)。
- 在编译程序时,给程序的页赋予虚拟页号。
- 当程序运行时,创建一张将虚拟页号映射成物理地址的表。
- 程序运行时使用到虚拟地址,这个页表就用来将虚拟地址转换成物理地址。
- 转译后备缓冲区(Translation-Lookaside Buffer,TLB)
- 处理器有一种专门用于地址转换的缓存
- TLB在快速存储介质中缓存了一些页表的条目
- TLB术语
- TLB命中:当查询的地址和虚拟页号在 TLB中时
- TLB缺失:当查询的地址和虚拟页号不在TLB中
- 页面失效(page fault):想要访问的页不在内存中,即页表中该页没有合法的物理地址,该页只存储在磁盘上
指令级并行
指令级并行介绍
- 指令级并行(Instruction-Level parallelism,ILP)通过让多个处理器部件或者功能单元同时执行指令来提高处理器的性能。
- 两种主要实现方法
- 流水线:将功能单元分阶段安排
- 多发射:让多条指令同时启动。
流水线
- 流水线通过将功能分成多个单独的硬件或者功能单元,并把它们按顺序申接来提高性能。
- 原方案计算两个浮点数
- 如果每次操作花费1纳秒( 1 0 − 9 10^{-9} 10−9秒),那么加法操作需要花费7纳秒。当进行的计算较多时,则需要较长的时间。
- 采用流水线方法
多发射
- 多发射处理器通过复制功能单元来同时执行程序中的不同指令。
- 如果功能单元是在编译时调度的,则称该多发射系统使用静态多发射
- 如果是在运行时间调度的,则称该多发射系统使用动态多发射。
- 一个支持动态多发射的处理器称为趣标量(supersca-lar)
硬件多线程
- 线程级并行(Thread-Level Paralleliem,TLP)
- 线程级并行尝试通过同时执行不同线程来提供并行性。
- 与ILP相比,TLP提供的是粗粒度的并行性,即同时执行的程序基本单元(线程)比细粒度的程序单元(单条指令)更大或者更粗。
- 硬件多线程(hardware multithreading)
- 硬件多线程为系统提供了一种机制,使得当前执行的任务被阻塞时,系统能够继续其他有用的工作。
- 细粒度(fine-grained)多线程中
- 处理器在每条指令执行完后切换线程,从而跳过被阻塞的线程。
- 粗粒度(coarse-grained)多线程
- 只切换那些需要等待较长时间才能完成操作(如从主存中加载)而被阻塞的线程。
- 同步多线程(Simulancous Multirhreading,SMT)
- 同步多线程是细粒度多线程的变种。它通过允许多个线程同时使用多个功能单元来利用超标量处理器的性能。
并行体系架构模型
了解并行架构
(1)并行架构种类繁多,没有一种架构是权威的。
- 在各种应用场景下,该架构都表现出优良的性能与能耗。
- 因此也没有权威的并行编程语言。面向不同架构,可能采用不同的并行编程模型或者语言。
(2)架构极大的影响着性能
- 并行编程的目的就是追求更高的性能。
(3)许多并行架构不能成功商用
- 不能预测后面会出现什么新的问题。
并行计算机体系结构
- 单指令多数据流机SIMD(Single-Instruction Multiple-Data
- 并行向量处理机PVP(Parallel Vector Processor)
- 大规模并行处理机MPP(Massively Parallel Processor)
- 对称多处理机SMP(Symmetric Multiprocessor)
- 工作站机群COW(Cluster of Workstation)
- 分布式共享存储DSM(Distributed Shared Memory)多处理机
并行硬件
MIMD 系统
- 多指令多数据流(Multiple Instruction,Multiple Data,MIMD)系统支持同时多个指令流在多个数据流上操作。
- MIMD系统组成
- MIMD系统通常包括一组完全独立的处理单元或者核
- 每个处理单元或者核都有自己的控制单元和ALU。
- MIMD 系统通常是异步的,即各个处理器能够按它们自己的节奏运行
- MIMD系统有两种主要的类型
- 共享内存系统
- 分布式内存系统
共享内存系统
- 一组自治的处理器通过互连网络(internection network)与内存系统相互连接,每个处理器能够访问每个内存区域。
- 在共享内存系统中,处理器通过访问共享的数据结构来隐式地通信
-
一致内存访问
-
一个多核处理器在一块芯片上有多个 CPU或者核。
-
每个核访问内存中任何一个区域的时间都相同
-
-
非一致内存访问
-
在拥有多个多核处理器的共享内存系统中,互连网络可以将所有的处理器直接连到主存,或者也可以将每个处理器直接连到一块内存,通过处理器中内置的特殊硬件使得各个处理器可以访问内存中的其他块。
-
访问与核直接连接的那块内存区域比访问其他内存区域要快很多,因为访问其他内存区域需要通过另一块芯片。
-
-
共享内存互连网络
-
总线(bus)
- 总线是由一组并行通信线和控制对总线访问的硬件组成的。
- 总线的核心特征是连接到总线上的设备共享通信线。
- 总线具有低成本和灵活性的优点,多个设备能够以小的额外开销连接到总线上。
- 随着连接到总线设备的增多,总线的预期性能会下降
-
交叉开关矩阵(crossbar)
-
交换互连网络使用交换器(switch)来控制相互连接设备之间的数据传递。
-
线表示双向通信链路
-
方块表示核或者内存模块
-
圆圈表示交换器。
-
-
交叉开关矩阵允许在不同设备之间同时进行通信,所以比总线速度快。
-
-
分布式内存系统
- 每个处理器有自己私有的内存空间,处理器-内存对之间通过互连网络相互通信。
- 在分布式内存系统中,处理器之间是通过发送消息或者使用特殊的函数来访问其他处理器的内存,从而进行显式的通信。
-
最广泛使用的分布式内存系统称为集群(clusters)
- 混合系统:系统中的节点(通过通信网络相互连接的独立计算单元),通常都是有一个或者多个多核处理器的共享内存系统
-
网格提供一种基础架构,使地理上分布的计算机大型网络转换成一个分布式内存系统。
-
分布式内存互连网络
-
直接互连
- 每个交换器与一个处理器-内存对直接相连,交换器之间也相互连接
-
衡量“同时通信的链路数目”或者“连接性”的一个标准是等分宽度(bisection width)。
-
并行系统被分成两部分,每部分都有一半的处理器或者节点。
-
将一个8节点的环分成两组。每组有四个节点。
-
同时发生通信的次数只为2
-
同时发生4次通信
-
-
计算等分宽度
-
去除最少的链路数从而将节点分成两等份,去除的链路数就是等分宽度。
-
如果有一个正方形的二维环面网格,有 p = q 2 p=q^2 p=q2个节点(q为偶数),然后通过移除一些“中间”的水平链路和“回绕”的水平链路,将这些节点分成两份。
-
一个正方形二维环面网格的等分宽度就是$2\sqrt{p} $。
-
-
最理想的直接互连网络
-
全相连网络,即每个交换器与每一个其他的交换器直接连接。
-
超立方体。超立方体是递归构造的:一维超立方体是有两个处理器的全互连系统。二维超立方体是由两个一维超立方体组成,并通过“相应”的交换器互连
-
-
-
间接互连
-
交换器不一定与处理器直接连接。
- 它们通常由一些单向连接和一组处理器组成,每个处理器有一个输入链路和一个物出链路,这些链路通过一个交换网络连接。
-
交叉开关矩阵
-
通过单向链路共事分布式内存。
-
只要两个处理器不尝试与同一个处理器通信,那么所有的处理器就能够同时与其他的处理器通信。
-
-
omega 网络
-
交换器是一个2×2的交叉开关矩阵
-
与交叉开关矩阵不同的是,有一些通信无法同时进行
-
-
-
并行计算机访存模型
均匀存储访问模型- UMA
- 物理存储器被所有处理器均匀共享
- 所有处理器访问任何存储字取相同的时间
- 每台处理器可带私有高速缓存
- 外围设备也可以一定形式共享。
非均匀存储访问模型- NUMA
- 被共享的存储器在物理上是分布在所有的处理器中的,其所有本地存储器的集合就组成了全局地址空间;
- 处理器访问存储器的时间是不一样的;访问本地存储器LM或群内共享存储器CSM较快,而访问外地的存储器或全局共享存储器GSM较慢(此即非均匀存储访问名称的由来);
- 每台处理器可拥有私有高速缓存,外设也可以某种形式共享。
全高速缓存访问模型-COMA
- 各处理器节点中没有存储层次结构,全部高速缓存组成了全局地址空间;
- 利用分布的高速缓存目录D进行远程高速缓存的访问;
- COMA中的高速缓存容量一般都大于二级高速缓存容量;
- 使用COMA时,数据开始时可任意分配,因为在运行时它最终会被迁移到要用到它们的地方。
高速缓存一致性非均匀存储访问模型-CC-NUMA
- 大多数使用基于目录的高速缓存一致性协议;
- 保留SMP结构易于编程的优点,也改善常规SMP的可扩放性;
- CC-NUMA实际上是一个分布共享存储的DSM多处理机系统;
- 它最显著的优点是程序员无需明确地在节点上分配数据,系统的硬件和软件开始时自动在各节点分配数据,在运行期间,高速缓存一致性硬件会自动地将数据迁移至要用到它的地方。
非远程存储访问模型-NORMA
- 所有存储器是私有的;
- 绝大数NUMA都不支持远程存储器的访问;
- 在DSM中,NORMA就消失了。
并行算法:数据并行与任务并行
数据并行模型(Data Parallel)
概况
- SIMD的自然模型,也可运行于SPMD、MIMD机器上局部计算和数据选路操作
- 适合于使用规则网络,模板和多维信号及图像数据集来求解细粒度的应用问题
- 数据并行操作的同步是在编译时而不是在运行时完成的
特点
- 单线程
- 并行操作于聚合数据结构(数组)
- 松散同步
- 全局命名空间
- 隐式相互作用
- 隐式/半隐式数据分布
例子: π \pi π的计算
//串行c代码
#define N 1000000
main()
{
double local, pi = 0.0, w;
long i;
w=1.0/N;
for (i = 0; i<N; i ++)
{
local = (i + 0.5)*w;
pi = pi + 4.0/(1.0+local * local);
}
printf(“pi is %f \n”, pi *w);
}
可以把计算过程设计为并行计算
//并行c代码
main( )
{
long i,j,t,N=100000;
double local [N],temp [N],pi,w;
A: w=1.0/N;
B: forall (i=0;i<N ; i++)
{
P: local[i]=(i+0.5)*w;
Q: temp[i]=4.0/(1.0+local[i]*local[i]);
}
C: pi = sum (temp);
D: printf (“pi is %f \ n”,pi * w );
} /*main( )*/
共享变量模型(Shared Variable)
- 概况
- PVP, SMP, DSM的自然模型
- 特点
- 多线程:SPMD, MPMD
- 异步
- 单一共享地址空间
- 显式同步
- 隐式/隐式数据分布
- 隐式通信(共享变量的读/写)
//共享变量C程序代码
# define N 100000
main ( )
{
double local,pi=0.0,w;
long i;
A: w=1. 0/N;
B: # Pragma Parallel
# Pragma Shared (pi,w)
# Pragma Local (i,local)
{
# Pragma p for iterate(i=0;N;1)
for (i=0;i<N;i++)
{
P: local = (i+0.5)*w;
Q: local=4.0/(1.0+local*local);
}
C: # Pragma Critical
pi =pi +local;
}
D: printf (“pi is %f \ n”,pi *w);
}/*main( )*/
消息传递模型(Message Passing)
- 概况
- MPP, COW的自然模型,也可应用于共享变量多机系统,适合开发大粒度的并行性
- 广泛使用的标准消息传递库MPI和PVM
- 特点
- 多线程
- 异步并行性
- 分开的地址空间
- 显式相互作用
- 显式数据映射和负载分配
- 常采用SPMD形式编码
//MPI代码
# define N 100000
main ( )
{
double local=0.0,pi,w,temp=0.0;
long i ,taskid,numtask;
A: w=1.0/N;
MPI_ Init(&argc,& argv);
MPI _Comm _rank (MPI_COMM_WORLD,&taskid);
MPI _Comm _Size (MPI_COMM_WORLD,&numtask);
B: for (i= taskid; i< N; i=i + numtask)
{
P: temp = (i+0.5)*w;
Q: local=4.0/(1.0+temp*temp)+local;
}
C: MPI_Reduce (&local,&pi,1,MPI_Double,MPI_SUM,0,MPI_COMM_WORLD);
D: if (taskid = =0)
printf(“pi is %f \ n”,pi* w);
MPI_Finalize ( ) ;
} /*main( )*/
性能模型
加速比和效率
-
并行程序有线性加速比(linear speedup)
- 当在p核系统上运行程序,每个核运行一个进程或者线程,并行程序的运行速度就是串行程序速度的p倍
-
并行程序的加速比(speedup):
S = T 并行 T 串行 S=\frac{\mathit{T}_{并行} }{\mathit{T}_{串行}} S=T串行T并行 -
效率
E = S P = T 串行 T 并行 p = T 串行 p ⋅ T 并行 E=\frac{S}{P} =\frac{\frac{\mathit{T}_{串行} }{\mathit{T}_{并行}} }{p} =\frac{\mathit{T}_{串行}}{p\cdot \mathit{T}_{并行}} E=PS=pT并行T串行=p⋅T并行T串行 -
加速比和效率
-
不同问题规模的一个并行程序的加速比和效率
- 当问题的规模变大时,加速比和效率增加;
- 当问题的规模变小时,加速比和效率降低
Amdahl定律
假设应用程序只有一部分是可以并行的(
α
\alpha
α:可并行计算部分的占比,
n
n
n:并行处理节点个数)
加速比:
S
=
1
1
−
α
+
α
n
加速比:S=\frac{1}{1-\alpha+\frac{\alpha}{n} }
加速比:S=1−α+nα1
即使并行部分完美地加速,性能也会受到顺序部分的限制
并行开销
实现预期加速的最大障碍
寻找到足够多的并行任务
并行开销
(1)启动线程或进程的成本
(2)共享数据的通信成本
(3)同步的成本
(4)额外的(冗余)
计算在某些系统上,每一种开销都可能是毫秒级(数百万次浮点运算)。
权衡
(1)算法需要足够大的工作集(即大粒度)以快速的并行运行,但又不能太大以至于没有足够的并行任务 。
(2)大容量存储访问速度慢,快速内存容量小。程序应该尽可能的对本地数据进行处理
负载不均衡
负载不均衡
系统中某些处理器空闲而某些处理器有大量待处理任务
- 此阶段并行性不足
- 任务大小不等
任务大小不等的例子
- 适应某个区域中的感兴趣的部分
- 树形结构计算
- 完全非结构化问题
算法需要平衡负载
可扩展性
- 可扩展性
- 假设运行一个拥有固定进程或线程数目的并行程序,且输入也是固定的,那我们可以得到一个效率值E。
- 增加该程序所用的进程/线程数,如果在输入规模也以相应增长率增加的情況下,该程序的效率值一直都是 E
- 当问题规模增加的倍率,与进程/线程数增加的倍率相同时,效率才会是恒定的,从而程序是可扩展的。
- 强可扩展的(strongly scalable)
- 如果在增加进程/线程的个数时,可以维持固定的效率,却不增加问题的规模
- 弱可扩展的(weakly scalable)
- 如果在增加进程/线程个数的同时,只有以相同倍率增加问题的规模才能使效率值保持不变
并行程序开发方法
并行层次与代码粒度
并行层次 | 粒度(指令数) | 并行实施 | 编程支持 |
---|---|---|---|
甚细粒度指令级并行 | 几十条,如多指令发射、内存交叉存取 | 硬件处理器 | |
细粒度数据级并行 | 几百条,如循环指令块 | 编译器 | 共享变量 |
中粒度控制级并行 | 几千条,如过程、函数 | 程序员(编译器) | 共享变量 消息传递 |
粗粒度任务级并行 | 数万条,如独立的作业任务 | 操作系统 | 消息传递 |
并行程序开发策略
并行编程模式
主-从式(Master-Slave)
- 基本思想
- 将一个待求解的任务分成一个主任务(主进程)和一些从任务(子进程)。
- 执行过程
- 主进程负责将任务的分解、派发和收集诸各子任务的求解结果并最后汇总得到问题的最终解。
- 各子进程接收主进程发来的消息;并行进行各自计算;向主进程发回各自的计算结果。
单程序多数据流(Single Program Multiple Data )
- 基本思想
- 并行运行的进程均执行相同的代码段,但处理的数据不同。
- 执行过程
- 首先将应用程序的数据预先分配给各个计算进程(处理器)
- 然后计算进程并行的完成各自的计算任务,包括计算过程中各进程间的数据交换(进行通信同步);
- 最后将计算结果汇集起来。
数据流水线(Data Pipelining)
- 基本思想
- 将计算进程组织成一条流水线,每个进程执行特定的计算任务(相当于流水线的一个阶段)。
- 执行过程
- 将任务在功能上划分成一些子任务(进程),这些子任务完成某种特定功能的计算工作。
- 一旦前一个子任务完成,后继的子任务就可立即开始。
- 整个计算过程中各进程之间的通信仅发生在相邻的阶段之间,且通信可以完全异步地进行。
分治策略(Divide and Conquer)
- 基本思想
- 将一个大而复杂的问题分解成若干个特性相同的子问题分而治之。
- 若所得的子问题规模仍嫌过大,则可反复使用分治策略,直至很容易求解诸子问题为止。
- 问题求解可分为三步
- 将输入分解成若干个规模近似相等的子问题;
- 同时递归地求解诸子问题;
- 归并各子问题的解成为原问题的解。
并行应用编程过程-PCAM
设计的四个阶段
- 设计并行应用的四个阶段
- 划分(Partitioning)
- 通信(Communication)
- 组合(Agglomeration)
- 映射(Mapping)
- 划分:分解成小的任务,开拓并发性;
- 通信:确定诸任务间的数据交换,监测划分的合理性;
- 组合:依据任务的局部性,组合成更大的任务;
- 映射:将每个任务分配到处理器上,提高并行性能。
划分方法描述
- 充分开拓算法的并发性和可扩放性;
- 先进行数据分解(称域分解),再进行计算功能的分解(称功能分解);
- 使数据集和计算集互不相交;
- 划分阶段忽略处理器数目和目标机器的体系结构;
- 能分为两类划分:
- 域分解(Domain Decomposition)
- 功能分解(Functional Decomposition)
域分解
- 划分的对象是数据,可以是程序中的输入数据、中间处理数据和输出数据;
- 将数据分解成大致相等的小数据片;
- 划分时考虑数据上的相应操作;
- 如果一个任务需要别的任务中的数据,则会产生任务间的通信;
功能分解
- 划分的对象是计算(亦称为任务分解或计算划分),将计算划分为不同的任务,其出发点不同于域分解;
- 划分后,研究不同任务所需的数据。如果这些数据不相交的,则划分是成功的;如果数据有相当的重叠, 意味着存在大量的通信开销,要重新进行域分解和功能分解;
- 功能分解是一种更深层次的分解。
划分判据
- 划分是否具有灵活性?
- 划分是否避免了冗余计算和存储?
- 划分任务尺寸是否大致相当?
- 任务数与问题尺寸是否成比例?
- 能分解是一种更深层次的分解,是否合理?
通信分析
- 通信是PCAM设计过程的重要阶段;
- 划分产生的各任务,一般不能完全独立执行,需要在任务间进行数据交流,从而产生了通信;
- 功能分解确定了各任务间的数据流;
- 各任务是并发执行的,通信则限制了这种并发性;
四种通信模式
-
局部/全局通信
- 局部通信:通信限制在一个邻域内,即局部内通信
- 全局通信:通信是全局的
- All to All
- Master-Worker
-
结构化/非结构化通信
-
结构化通信:每个任务的通信模式是相同的。
-
非结构化通信:没有一个统一的通信模式
-
-
静态/动态通信
-
静态通信中,通信伙伴的身份不随时间改变;
-
动态通信中,通信伙伴的身份则可能由运行时所计算的数据决定且是可变的。
-
-
同步/异步通信
- 同步通信时,接收方和发送方协同操作;
- 异步通信中,接收方获取数据无需与发送方协同。
通信判据
- 所有任务是否执行大致相当的通信?
- 是否尽可能的局部通信?
- 通信操作是否能并行执行?
- 同步任务的计算能否并行执行?
任务组合
- 组合是由抽象到具体的过程,是组合的任务能在一类并行机上有效的执行;
- 合并小尺寸任务,减少任务数。如果任务数恰好等于处理器数,则完成了映射过程;
- 通过增加任务的粒度和重复计算,可以减少通信成本;
- 保持映射和扩展的灵活性,降低软件工程成本;
重复计算
-
可以减少通信量,但增加了计算量,应保持恰当的平衡;
-
重复计算的目标应减少算法的总运算时间;
-
示例
-
二叉树上N个处理器求N个数的全和,要求每个处理器均保持全和。
-
蝶式结构求和,使用了重复计算,共需logN步
-
组合判据
- 增加粒度是否减少了通信成本?
- 重复计算是否已权衡了其得益?
- 是否保持了灵活性和可扩放性?
- 组合的任务数是否与问题尺寸成比例?
- 是否保持了类似的计算和通信?
- 有没有减少并行执行的机会?
处理器映射
- 每个任务要映射到具体的处理器,定位到运行机器上;
- 任务数大于处理器数时,存在负载平衡和任务调度问题;
- 映射的目标:减少算法的执行时间
- 并发的任务$\to $不同的处理器
- 任务之间存在高通信的$\to $同一处理器
- 映射实际是一种权衡,属于NP完全问题。
负载平衡
- 静态的:事先确定;
- 概率的:随机确定;
- 动态的:执行期间动态负载;
- 基于域分解的:
- 递归对剖
- 局部算法
- 概率方法
- 循环映射
任务分配与调度
负载平衡与任务分配/调度密切相关,任务分配通常有静态的和动态的两种方法。
- 静态分配一般是任务到进程的算术映射。
- 优点是没有运行时任务管理的开销,要求任务的工作量和处理器的性能是可以预测的,并且拥有足够的可供分配的任务。
- 静态调度(Static Scheduling)方案一般是静态地为每个处理器分配多个连续的循环迭代。也可以采用轮转(Round-robin)的方式来给处理器分配任务,即将第i个循环迭代分配给第i mod p个处理器。
- 动态分配与调度相对灵活,可以运行时在不同处理器间动态地进行负载的调整。
- 动态调度(Dynamic Scheduling)技术是并行计算研究的热点
- 基本自调度SS(Self Scheduling)
- 块自调度BSS(Block Self Scheduling)
- 指导自调度GSS(Guided Self Scheduling)
- 因子分解调度FS(Factoring Scheduling)
- 梯形自调度TSS(Trapezoid Self Scheduling)
- 耦合调度AS(Affinity Scheduling)
- 安全自调度SSS(Safe Self Scheduling)
- 自适应耦合调度AAS(Adapt Affinity Scheduling)
- 动态调度(Dynamic Scheduling)技术是并行计算研究的热点
- 经理/雇员模式任务调度
- 任务放在集中的或分散的任务池中,使用任务调度算法将池中的任务分配给特定的处理器。
映射判据
- 采用集中式负载平衡方案,是否存在通信瓶颈?
- 采用动态负载平衡方案,调度策略的成本如何?