发布时间:2025-12-09 17:31:44 浏览次数:3
简单地说,并行计算就是在并行计算机上所做的计算。从普通意义上讲,它和常说的高性能计算、超级计算等是同义词。并行计算的初衷是为了努力仿真自然世界中一个序列中含有众多同时发生的、复杂且相关事件的事务状态。
为了利用并行计算求解一个计算问题,通常基于以下考虑:1.将计算任务分解成多个子任务,有助于同时解决;2.在同一时间,由不同的执行部件可同时执行多个子任务;3.多计算资源下解决问题的耗时要少于单个计算资源下的耗时。
并行计算可分为:1.计算密集型:如大型科学工程计算与数值模拟等;2.数据密集型:如数字图书馆、数据仓库、数据挖掘和计算可视化等;3.网络密集型:如协同计算和远程诊断等。
(1)结构类型
(2)几种MIMD
注:对称指所有处理器都能同等地访问I/O很同样的运行程序(如OS和I/O服务程序),而非对称主从式是仅有主处理器运行OS和控制访问I/O并监控从处理器执行
UMA(Uniform Memory Access)均匀存储访问:物理存储器被所有处理器均匀共享,所有处理器对所有SM访存时间相同,每台处理器可带有高速私有缓存,外围设备共享。
- NUMA非均匀存储访问:共享的SM是由物理分布式的LM逻辑构成,处理器访存时间不一样,访问LM或CSM(群内共享存储器)内存储器比访问GSM(群间共享存储器)快
- COMA(Cache-Only MA)全高速缓存存储访问:NUMA的特例、全高速缓存实现
- CC-NUMA(Coherent-Cache NUMA)高速缓存一致性NUMA:NUMA+高速缓存一致性协议
- NORMA(No-Remote MA)非远程存储访问:无SM,所有LM私有,通过消息传递通信
衡量并行计算机性能单位:
TOP500前500名超级计算机排名指标(GFLOPS):
Rmax:Maximal LINPACK(Linear system package) performance achieved
Rpeak:Theoretical peak performance
主要包括CPU和存储器的某些基本性能指标,并行通信开销以及机器的成本、价格和性能价格比等。
(1)CPU和存储器的某些基本性能指标
并行执行时间: Tn=Tcomput+Tparo+Tcomm T n = T c o m p u t + T p a r o + T c o m m 。其中 Tcomput T c o m p u t 为计算时间, Tparo T p a r o 为并行开销时间,包括进程管理(生成、切换和结束等)、组操作(进程组的生成与消亡等)时间,和进程查询(询问进程的标志、等级和组大小等)时间; Tcomm T c o m m 为相互通信时间,包括同步(如路障、临界区、事件等)、通信(如点到点通信、整体通信、读/写共享变量等)时间和聚操作(如归约和前缀运算等)时间。
存储器的层次结构:各层存储器的容量、延迟和带宽。
(2)通信开销 Tcomm T c o m m
(3)机器的成本、价格和性能价格比
包括加速、效率和可扩放性等。
(1)并行系统的加速(比)
指对于一个给定的应用,并行算法(或并行程序)的执行速度相对于串行算法(或串行程序)的执行速度加快了多少倍。
加速比性能定律:
Amdahl加速定律(固定计算负载)
Gustafson定律(适用于可扩放问题)
Sun&Ni定律(受限于存储器)
约定:
(2)扩放性
最朴素的含义是在确定的应用背景下,计算机系统(或算法或编程等)性能随处理器数的增加而按比例提高的能力。被广泛用来描述并行算法能否有效利用可扩充的处理器的能力。
基本测试程序、数学库测试程序和并行测试程序等
并行算法是一些可同时执行的诸进行的集合,这些进程互相作用和协调动作从而实现给定问题的求解。
从不同角度分类成数值计算和非数值计算的并行算法;同步、异步和分布的并行算法;共享存储和分布存储的并行算法;确定的和随机的并行算法等。
(1)par-do
n个节点并行完成for循环(每个节点不同,和i相关):
for i = 1 to n par-do...endfor(2)for all
所有节点都执行相同语句:
for all Pi, where 0 <= i <= k do...endfor通常分析以下指标:
并行算法的WT表示——Brent定理:
令W(n)是并行算法A在运行时间T(n)内所执行的运算量,则A使用p台处理器可在t(n) = O(W(n)/p + T(n))时间内执行完毕
1.PRAM模型(SIMD-SM)
PRAM(Parallel Random Access Machine)并行随机存取机器,是一种抽象并行计算模型,它假设:
根据并发访问机制,又分为:
PRAM-CRCW又分为:
PRAM优点:
PRAM缺点:
2.异步APRAM模型(MIMD-SM)
异步APRAM模型假设:
指令类型有:
APRAM比PRAM更加接近实际并行机
3.BSP模型(MIMD-DM)
BSP(Bulk Synchronous Parallel)大同步并行机(APRAM算作轻量)是一个分布式存储的MIMD模型,它的计算由若干全局同步分开的、周期为L的超级步组成,各超级步中处理器做LM操作并通过选路器接收和发送消息;然后做一次全局检查,以确定该超级步是否已经完成(块内异步并行,块间显式同步)
参数:处理器数p、选路器吞吐率g、全局同步间隔L、一个超级步中一个处理器至多发送或接收h条消息
4.LogP模型:MIMD-DM,点到点通讯
LogP模型是分布式存储、点到点通信的MIMD模型
LogP采取隐式同步,而不显式同步障
1 、串改并
发掘和利用现有串行算法中的并行性,直接将串行算法改造为并行算法
最常用的设计思路但并不普适,好的串行算法一般无法并行化(数值串行算法可以)
快速排序的串改并
SISD上串行执行,最坏情况下O(n^2),理想情况下O(nlogn)
思路:将O(n)的划分(Partition)并行化是关键,算法:
在CRCW模型上,用伪代码描述如下:
//A[1...n]排序用n个处理器,处理器i中存有A[i]//f[i]中存有其元素是主元素的处理器号//LC[1...n]和RC[1...n]分别记录给定主元素的左儿子和右儿子for each processor i par-doroot = i //所有处理器竞争,只有一个写入rootf[i] = root //所有处理器都把root写入自己的f[i]LC[i] = RC[i] = n + 1 //初始值endforrepeat for each processor i != root doif (A[i] < A[f[i]]) || (A[i] == A[f[i]] && i < f[i])LC[f[i]] = i //并发写,所有满足条件的i只有一个写入LC[f[i]]作为左子树的根,也就是下一次循环的主元素if i == LC[f[i]] thenexit //若当前处理器写入则什么也不做elsef[i] = LC[f[i]] //若当前处理器没有写入,那么它只能当LC[f[i]]的字节点了endifelseRC[f[i]] = i //并发写,所有满足条件的i只有一个写入RC[f[i]]作为右子树的根,也就是下一次循环的主元素if i == RC[f[i]] thenexit //若当前处理器写入则什么也不做elsef[i] = RC[f[i]] //若当前处理器没有写入,那么它只能当RC[f[i]]的字节点了endifendifendrepeat每次迭代构造一层排序二叉树花费O(1)时间,在基本平衡的情况下树高O(logn),则算法复杂度为O(logn)
2 、全新设计
从问题本身描述出发,不考虑相应的串行算法,设计 一个全新的并行算法
有向环K着色算法的并行化设计
问题:有向环顶点着色,一共K种颜色,相邻顶点不允许同色
串行算法(3着色):交替2种颜色,若顶点是奇数则需要用到第3种颜色(难以并行化)
SIMD-EREW上的并行K着色算法:
//初始随机着色为c[i],每个顶点着色不同//输出着色方案为nc[i]for i = 1 to n par-dok = c[i]和c[i的后继]的最低的不同二进制位nc[i] = 2 * k + c[i]的二进制第k位endforO(1)时间完成,需要算法正确性证明
3、借用法
找出求解问题和某个已解决问题之间的联系,改造或利用已知算法应用到求解问题上
利用矩阵乘法求所有点对间最短路径
d[k][i][j]表示从vi到vj**至多**经过k-1个中间顶点时的最短路径,d[k][i][j] = min{d[k/2][i][l]+d[k/2][l][j]}
那么可以用矩阵乘法的改进(乘变加,求和变min)做logn次矩阵乘法即可
思路是这样,具体伪代码略,需要O(n^3)个节点,时间复杂度为O(log^2(n))
1、划分设计技术
使用划分法把问题求解分成两步:
(1)均匀划分(PSRS排序)
长度为n的待处理序列均匀划分给p个处理器,每个处理器处理n/p个元素
MIMD机器上的PSRS排序算法:
(1)均匀划分:将n个元素A[1..n]均匀划分成p段,分配给p个处理器(2)局部排序:pi调用串行排序算法对A[(i-1)n/p+1..in/p]排序(3)选取样本:pi从其有序子序列A[(i-1)n/p+1..in/p]中选取p个样本元素(4)样本排序:用一台处理器对p2个样本元素进行串行排序(5)选择主元:用一台处理器从排好序的样本序列中选取p-1个主元,并播送给其他pi (6)主元划分:pi按主元将有序段A[(i-1)n/p+1..in/p]划分成p段(7)全局交换:各处理器将其有序段按段号交换到对应的处理器中(一定保证均匀划分??)(8)归并排序:各处理器对接收到的元素进行归并排序(2)方根划分(Valiant归并排序)
长度为n的待处理序列,取i*sqrt(n)为划分元,将元素划分成若干段交给处理器处理
SIMD-CREW机器上的Valiant归并排序:
(1)方根划分:把A和B(长n有序段)的第i*sqrt(n)元素作为划分元,把A和B分成若干段(2)段间比较:A中的所有划分元和B中的所有划分元比较,确定A中划分元应插入B中的哪一段(3)段内比较:A中的划分元和B中相应段比较并确定插入位置,这些插入位置又将B重新划分成了若干段(4)段组合并:插入A划分元后,又得到若干有序段组需要归并,递归直到有一组(A)的长度为0使用n个处理器可以在O(loglogn)内完成
(3)对数划分(并行归并排序)
取i*logn作为划分元划分
定义位序rank(x,X)为X中小于等于x的元素个数,则有PRAM-CREW上的对数划分:
//非降有序的A={a[1],...,a[n]}和B={b[1],...,b[m]}归并//假设log(m)和k=m/log(m)均为整数j[0]=0j[k]=nfor i = 1 to k - 1 par-doj[i] = rank(b[ilogm], A)endforfor i = 1 to k - 1 par-doBi = {b[ilogm+1], ..., b[(i+1)logm]}Ai = {a[j[i]+1], ..., a[j[i+1]]}endfor//将原问题转化为子序列组Bi和Ai的归并,那么同样可以递归调用完成整个序列的归并//对数划分保证Bi和Ai中的元素均大于Bi-1和Ai-1中的元素(4)功能划分( (m,n)-选择)
功能划分是根据特定问题而把序列分成p个等长组,每组符合问题特性的一种划分方法
(m,n)-选择问题是将长为n的序列中选取前m个较小的元素,利用功能划分来实现并行化的(m,n)-选择问题求解:
(1)功能划分:将A划分成g=n/m组,每组含m个元素(2)局部排序:使用Batcher排序网络将各组并行排序(3)两两比较:将所排序的各组两两比较,从而形成MIN序列(4)排序-比较:对各个MIN序列,重复执行第(2)和第(3)步,直至选出m个最小者2、分治设计技术
分治将复杂问题划分成较小规模特性相同的子问题,且子问题类型和原问题类型相同,通常用递归完成分治算法
3、平衡树设计技术
以树的叶结点为输入,中间结点为处理结点,由叶向根或由根向叶逐层进行并行处理
4、倍增设计技术
递归调用时,所要处理数据之间的距离逐步加倍, 经过k步后即可完成距离为2^k的所有数据的计算
5、流水线技术
将算法路程分成p个前后衔接的任务片段,一个任务片段完成之后其后继任务片段可以立即开始,那么久可以引入流水线的思想来处理多条数据
1.1 并行语言构造方法
1.2 并行性问题
可利用SPMD来伪造MPMD
需要运行MPMD:parbegin S1 S2 S3 parend
可以改造成SPMD:
那么并行扩展至需要支持SPMD即可
1.3 交互/通信
(1)交互类型
(2)交互方式
(3)交互模式
按编译时是否能确定交互模式可分为静态的、动态的
按多少发送者和接收者:
1.4 并行编程风范
1.5 并行程序设计模型
(1)隐式并行
用串行语言编程,编译器货操作系统自动转化成并行代码
特点:语义简单、可以执行好、易调试易验证、but效率低
(2)数据并行
SIMD模型,包括数据选路和局部计算,特点:但现场、松散同步、常用聚合操作
数据并行计算π:
long i,j,t,N=100000;double local[N], temp[N], pi, w;w = 1.0/N;forall (i = 0; i < N; i++) {local[i] = (i + 0.5) * w;temp[i] = 4.0 / (1.0 + local[i] * local[i]);}pi = reduce(temp, +);(3)消息传递
MPP、COW自然模型,MPI广泛应用:多线程异步并行、地址空间分开、常用SPMD形式编码
MPI消息传递计算π:
#define N 100000main(){double local=0.0,pi,w,temp=0.0;long i,taskid,numtask;w=1.0/N;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&taskid);MPI_Comm_Size(MPI_COMM_WORLD,&numtask);for (i = taskid; i < N; i=i + numtask){temp = (i+0.5)*w;local = 4.0/(1.0+temp*temp)+local; }MPI_Reduce(&local,&pi,1,MPI_Double,MPI_MAX,0, MPI_COMM_WORLD);if (taskid == 0) printf(“pi is %f \n”,pi*w); MPI_Finalize() ;}(4)共享变量
PVP、SMP、DSM自然模型,多线程异步,显示同步而隐式通信
OpenMP使用共享变量计算π:
#define N 100000main(){double local,pi=0.0,w;long i;w=1.0/N;#pragma parallel#pragma shared(pi, w)#pragma local(i, local) {#pragma parallel for (i = 0; i < N; i++){local = (i + 0.5) * w;local = 4.0 / (1.0 + local * local);}#pragma critical{pi = pi + local}}}OpenMP是FORK-JOIN模型,主线程串行执行,直到编译制导并行域出现
MPI是一种消息传递接口的标准,适用于分布式存储系统的编程模型
与OpenMP不同的是,MPI是多进程的并行模式,运行时需要在外部指定开启进程数,并且是用SPMD的编程风格去模拟MPMD的编程风格(用进程号区别),不会FORK-JOIN而是通过消息传递同步