ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:104.92KB ,
资源ID:4661644      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4661644.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(94 MIMD共享存储模型的并行算法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

94 MIMD共享存储模型的并行算法.docx

1、94 MIMD共享存储模型的并行算法9.4 MIMD共享存储模型的并行算法(一) 异步枚举排序算法枚举排序(Enumeration Sort)是一种最简单的排序算法,通常也称为秩排序(Rank Sort)。对于基于枚举比较原理的异步排序算法,为了排序n个数的序列S= (x1,x2,xn) ,算法要生成n个进程。进程i (1in)将xi与S中其余元素进行比较,并且使用局部变量k及下所有小于xi的元素的数目。当所有的比较都完成时,就将xi置入排序序列中的k+1的位置上,因此每个进程都可能彼此独立地执行,而无通信的要求。令X是存在共享存储器中长度为n的数组,开始时放入被排序的序列,当算法结束时,结果

2、置于共享存储器中的T数组内,变量i,j,k是算法生成的每个进程的局部变量1007。该并行算法的描述如下:1234567891011121314151617181920算法9.4.1 MIMD-CREW模型上的异步枚举排序算法输入: S= (x1,x2,xn)置于共享存储器的X数组中输出:已排序的序列置于共享存储器的T数组中ENUER SORT for(i=1;i=n;i+)Create Process i;Process i:k=0;for(j=1;jX(j)kk+1;elseif(X(i)=X(j)& ij)kk+1;T(k+1)=X(i);在该并行算法中有,由于每个处理器至多确定数组X中的

3、个元素的位置,而每确定一个元素的位置需O(n)时间,因此对X进行排序需O(n)时间。例9_8设S=(8,6,6,9,7),p(n)=2。创建进程的过程中,假定由P1生成5个进程,此后所有的进程均等待开始。假定使用“先进先出”的调度策略。进程1和2分别由P1和P2执行,它们同时计算元素8和6的次第,然后将其分别置于T数组的相应位置上,如图9_19 (a)所示。欲知下一进程有哪一个处理器启动执行,需研究进程1和2的执行时间。假定比较操作和赋值操作大致用相同的时间,当执行X(i)X(j), X(i)=X(j) 和ij以及k=0 ,k=k+1和T(k+1)=X(i)时,进程1和2分别需要14和17各时

4、间步,如图9_19 (b)所示。所以进程3应由P1启动执行,之后3个时间步P2启动执行进程4。这两个进程负责将元素6和9分别置于数组T的相应位置上,此时进程3需要18个时间步,进程4需要13个时间步,所以进程4比进程3早结束。下一进程5由P2启动。之后当进程3执行完后,因无等待的进程,所以P1变为空闲。当进程5执行15个时间步后,元素7便放到数组T的相应位置上。算法总共需要45个时间步。 (a) 数组T的变化过程(b) 进度调度图9_19 异步枚举排序数组变化及进程调度(二) 单源点最短路径并行算法假设一有向图各边赋于非负整数,某条路径的长度就是沿该路径所有边权之和。最短路径问题,就是对每一点

5、对i和j,丘照期间任何最短长度的路径。单源点最短路径,即在一个图中寻找从一个指定顶点到所有其他定点的最短路径。(a) 单处理机上的Moore算法。在Moore算法中,设源点为sV。从s到其他各顶点的最短路径长度用一维数组dist存储。首先置dist(s)=0,dist(v)=,其中vs,且vV。算法使用了一个队列queue。开始执行时队列中仅含有源点s;以后每次只要队列非空,就将排头顶点u从队列中移去,令其作为本次搜索的顶点,然后检查u的所有射出边(u,v)E:若dist(u)+w(u,v)dist(v),则此时就找到了一条从s到v的更短路径,置dist(v)=dist(u)+w(u,v);若

6、v不再搜索队列中,则把v加到队尾。如此重复进行,直到整个待搜索队列空时,算法就终止。123456789101112131415161718192021222324252627282930算法9.4.2_1 SISD机器上的单源点最短路径算法输入:有向加权图G(V,E)的权矩阵输出:从源s到其余顶点i (is)的最短路径dist(i), iVSISD SHORTEST PATH(1)for(i=1;i=n;i+) /*初始化*/INITIALIZE(i);(2)将s插入队列queue中;(3)while(队列非空) SEARCH;Status SEARCH(3.1)dequeue vertex

7、u; /*从队列中删去顶点u*/(3.2)for(each edge(u,v)E)new_distdist(u)+w(u,v);if(new_distdist(v)dist(v) new_dist;if(v is not in the queue)enqueue vertex v;Status INITIALIZE(1.1)dist(s) 0;(1.2)dist(v) ; (vs,vV)(1.3)queue0;(b) Moore算法的并行化Deo等人基于MIMD紧耦合共享存储模型实现了Moore算法的并行化。直观上讲,算法9.4.2_1有两处可并行化的地方:一是SEARCH的第(3.2)步;二

8、是主算法的第(3)步。前者,任何一个顶点均可能有多条射出边,它们都可并行地被检查;后者,在任何时候都可能有多个顶点在队列中,因此有可能每次检查多个顶点的射出边。由于后者可产生较大的加速,而且当G是个稀疏图时,并行度受定点射出变得影响,所以选用后者。首先,队列用源点初始化。然后创建了许多异步进程,每个进程都从队列中删除一个顶点,检查其射出边,将已发现有更短路径的顶点加入到队列。算法的第(1)步采用预调度方法很容易并行化。而第(3)步的while循环需作适当的修改,以能反映并执行SEARCH过程时一些异步进程的存在。显然,当一个进程发现队列为空时,就停止执行是不合适的。因而必须采用两个变量联合使用

9、的办法,以决定什么时候无工作可做:第一个是数组变量waiting,它记住哪一个进程正处于等待状态;第二个是布尔变量halt,仅当队列为空和所有进程处于等待状态时为真。INITIALIZE过程置数组waiting中的第一个元素为假。SEARCH过程也必须作适当的修改。因为队列的插入、删除操作不是原子操作,所以执行上述操作时必须给队列上锁:其次,在一个进程将刚找到的v路径new_dist与当前的最短路径dist(v)比较之前,变量dist(v)也必须上锁,否则两个进程有可能同时修改它;最后,若一个进程发现队列为空时,则置waiting中的相应元素为真。若进程1处于等待状态,则它要检查每个进程是否都

10、处在等待状态,如果是,则halt置为真,而进程1检查每个进程是否处于等待状态时,队列也必须上锁。该并行算法的描述如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354算法9.4.2 MIMD-SM模型上单源点最短路径算法输入:有向加权图G的权矩阵W输出:从源s到其余顶点i (is)的最短路径dist(i), iVMIMD SHORTEST PATHpar for(i=1;i=p;i+) /*p为进程数*/for(j=i;j=n;j=j+p) /*

11、初始化*/INITIALIZE(j);enqueue s; /*s入队*/halt=FALSE;par for(i=1;i=p;i+)while(not halt)SEARCH(i);Status SEARCH(i)lock the queue; /*队列上锁*/if(queue is empty) /*队列空时,等待进程为真*/waiting(i) TRUE;if(i=1) /*进程1等待时,其它进程均须等待*/halt=waiting(2)waiting(3)waiting(p); unlock the queue; /*队列开锁*/elsedequeue u; /*从队列中删除u*/wa

12、iting(i) FALSE;unlock the queue; /*队列开锁*/for(every edge(u,v) in Graph) /*检查每条射出边*/new_distdist(u)+w(u,v);lock (dist(v) /*dist(v)上锁*/if(new_distdist(v)dist(v) new_dist; /*更新new_dist*/unlock (dist(v); /*dist(v)开锁*/if(v queue)lock the queue; /*队列上锁*/enqueue v; /*v入队*/unlock the queue; /*队列开锁*/else unlo

13、ck (dist(v); /*dist(v)开锁*/(二) 最小生成树并行算法一个无向连通图G的生成树是指满足如下条件的G的子图T:(1)G和T具有相同的顶点数;(2)在T中有足够的边能连接G所有的顶点,但不出现回路。最小生成树,即最小代价生成树(Minimum Cost Spanning Tree),它是加权连通无向图的所有生成树中权值最小的生成树。(a) Sollin顺序求MST算法算法开始时,图的n个孤立顶点视为一片森林,而每个顶点均视为一棵树;算法共迭代log n次,每次迭代时,森林中的每棵树,同时决定其最小的邻边,并将它们加入到森林中(即合并各棵树);此过程重复到森林中只剩下一棵树。

14、因为森林中树的数目,每次都以2的倍数减少,所以迭代至多需要次就可找到MST;而每次迭代时,找顶点的最小邻边至多执行O(n2)次比较。因此Sollin的顺序算法的复杂度为O(n2log n)。函数FIND(v)找顶点v所在的树的名字,UNION(v,u)合并包括顶点v和u的两棵树。12345678910111213141516171819202122232425262728293031323334算法9.4.3_1 SISD机器上的Sollin MST算法输入:无向图G的加权矩阵W输出:G的最小生成树T (树以边的形式存储)SOLLIN-MST(1)for(i=1;i=n;i+) /*初始化*/

15、vertex i is initially in set i;(2)T0; /*T就是MST*/(3)while(|T|n-1)(3.1)for(each tree i) /*每棵树i找不在同一树中的最小边权*/closest(i) ;(3.2)for(each (v,u)E)if(FIND(v)FIND(u) /*v和u属于不同的连通片*/if(w(v,u)p,则把nt棵子树较均匀的分配到p个处理器中,每个处理器约有棵子树;否则,这nt棵子树就分配给nt个处理器。算法的第(3.2)步并行化的最有效做法是:首先,每个处理器检查它内部的顶点的边,然后再检查不在同一处理器上树之间的边。算法的第(3

16、.3)步并行化稍微复杂些。图9_20示出了此情况,假定一个处理器企图将树B与其最近的树A进行归并,变量edge(A)有一条权值为k的边(vA,uA),变量edge(B)也有一条权值为k的边(vB,uB)。然而假定两处理器都在实行UNION之前执行了第(ii)步的测试,则(vA,uA)和(vB,uB)都将加入到树T中,结果形成一个环,显然这是错的。因此,欲使第(3.3)步并行化,必须在执行第(3.3.2)步之前上锁,执行完第(3.3.2.2)步后再开锁。每次仅允许一个处理器进入临界区。为了避免死锁的产生,当有多个请求上锁的进程申请临界区时,仅仅让标号最小的子树上锁。在MIMD-SM模型上,所法所

17、需的时间为,处理器数为O(p)1007。图9_20 并行化Sollin算法所引起的复杂情况i. Gauss-Seidel算法Gauss-Seidel算法是求解Ax=b的一种算法。先将系数矩阵A分解为A=E+D+F,其中D、E和F均为nn的矩阵,它们的元素分别定义如下:, 这样,Ax=(D+E+F)x=b,从而Dx=b-Ex-Fx。给定初始值x0,则第k次迭代为对于某一k和给定的误差允许值c,如果下式成立,则认为迭代时收敛的。Gauss-Seidel异步并行算法,设有N个处理器(Nn),算法生成n个进程,每一个进程计算x的一个分量。这些进程由N个处理器异步的执行。令代表初值,oldi代表旧值,n

18、ewi代表当前值,c为精度1007。该并行算法的描述如下:123456789101112131415算法9.4.4 MIMD-CREW模型上的Gauss-Seidel算法输入:Ann,向量b,初值(i=1,n),精度c (0c1)输出:满足精度要求的x的近似解GUASS-SEIDELfor(i=1;i=n;i+)oldi;newi;Create Process i; /*生成i个进程*/Process i:dooldi newi;newi;while(!()xinewi;例9_9使用算法9.4.4求解下述方程:设有2个处理器(N=2),取初值=1/2, =3/2,c=0.02。 设置old1=

19、1/2,new1=1/2,生成进程process1; 设置old2=3/2,new2=3/2,生成进程process2。 process1:设置old1=1/2;计算new1=(1/2)(3-3/2)=3/4; process2:设置old2=3/2;计算new2=(1/2)(4-1/2)=7/4。 重复计算如下:new1=5/8, new2=13/8;new1=11/16, new2=27/16;new1=21/32, new2=53/32;new1=43/64, new2=107/64;new1=85/128,new2=213/128。因为 |43/64-85/128|+|107/64-2

20、13/128|0.02,所以迭代结束。ii. 牛顿求根并行算法牛顿求根法,设f(x)在(a,b)上连续,且f(x)0,f”(x)0,f(a)f(b)0,则方程f(x)=0的根z的近似值可用如下迭代公式计算,直到误差|xn+1-xn|0)。下一次迭代值xn+1就是曲线f(x)在xn处的切线与x轴的交点。 f(x) z x3 x2 x1 x0 x图9_21 牛顿方法几何解释MIMD机器上的牛顿求根算法,将包含f(x)的零点z的区间 (a,b) (设ab)划分成N+1等分(N2)。各分点取为z的近似值。计算由N个进程组成,每一进程开始用各分点值进行牛顿法求根。各进程并发异步的执行。一旦某一进程收敛,

21、它就向共享存储单元ROOT写它所求得的值。开始时根ROOT被置成,一旦ROOT值被某一进程修改,所有进程将随之结束。如果两个进程同时收敛,就会造成写冲突,于是按最小号码的进程优先的策略来裁决,其它进程都被拒绝。如果在预定的迭代数目r之内某一进程不收敛,则它就被挂起1007。该并行算法的描述如下:123456789101112131415161718192021算法9.4.5 MIMD-CREW模型上的牛顿求根算法输入:f(x),f(x),(a,b),精度c,最大容许迭代次数r输出:返回答案在ROOT中ROOTs (b-a)/(N+1);for(k=1;k=N;k+)create process

22、 k; /*生成进程*/ROOT;Process k:xolda+ks;iteration0;while(iterationr&ROOT=)iteration+;xnew xold -f(xold)/f(xold);if(| xnew - xold |c)ROOT xnew;xoldxnew;在牛顿求根并行算法中,令N为可用处理器数,如果N足够大,则有一个起始点可充分接近z。如果f(x),f(x),f”(x)在区间(a,b)内连续有界,那么其中有一个处理器将会在O(log m)时间内收敛,其中m为所希望的精度的位数。例9_10令f(x)=x3-4x-5。因此f(x)=3x2-4。在区间(-3,

23、3)存在着f(x)的零点,令N=5,区间被6等分,各分点的值依次为-2,-1,0,1,2。算法生成5个进程,令e=9-10,假定5个处理器同时执行5个进程。在此情况下,进程5最先收敛到根,其值ROOT=2.456678。b) MIMD异步通信模型的并行算法i. 快速排序并行算法快速排序(Quick Sort)是一种最基本的排序算法,它的基本思想是,在当前无序序列R1,n中取一个记录作为比较的基准,用此基准将当前的无序序列R1,n划分成两个无序序列R1,i-1和Ri,n(1in),且R1,i-1中记录的所有关键字均小于等于基准的关键字,Ri,n中记录的所有关键字均大于等于基准的关键字;当R1,i

24、-1和Ri,n非空时,分别对他们重复上述的划分过程。对每次划分过后所得到的两个序列分别使用两个处理器完成递归排序。例如对一个长为n的序列,首先划分得到两个长为n/2的序列,将其交给两个处理器分别处理;而后进一步划分得到4个长为n/4的序列,在分别交给4个处理器处理;如此递归下去最终得到排序号的序列1001。该并行算法的描述如下:1234567891011121314151617算法9.5.1 快速排序并行算法输入:无序数组data1,n,使用的处理器个数2m输出:有序数组data1,nSORTpara_quicksort(data,1,n,m,0);para_quicksort(data,i,

25、j,m,id)if (j-i)k|m=0)Pid: quicksort(data,i,j);elsePid: r=partition(data,i,j);Pid send datar+q,m-1 to Pid+2m-1;para_quicksort(data,I,r-1,m-1,id);para_quicksort(data,r+1,j,m-1,id+2m-1);Pid+2m-1 send datar+1,m-1 to Pid;在最优的情况下该并行算法形成一个高度为log n的排序树,其计算复杂度为O(n),通信复杂度为O(n);在最坏情况下其计算复杂度降为O(n2);正常情况下该算法的计算复

26、杂度为O(n)。ii. 二维网孔上的矩阵转置并行算法网孔上的矩阵转置并行算法思路是,实现矩阵转置时,若处理器个数为p,且它们的编号依次是0,1,p-1,则将n阶矩阵A分成p个大小为mm的子块,m=。p个字块组成一个的子块阵列。记其中第i行第j列的子块为Aij,它含有A的第(i-1)m+1至第im行中的第(j-1)m+1至第jm列的所有元素。对每一处理器按行主方式赋以二维下标,记编号为i的处理器的而为下标为(v,u),其中v=,u=i mod,将A的子块存入下标为(v,u)表示的对应处理器中。这样,转置过程分两步进行:第一步,子块转置,具体过程如图9_22所示;第二步,处理器内部局部转置。图9_

27、22 子块转置为了避免对应子块交换数据时处理器发生死锁,可令下三角子块先向与之对应的上三角子块发送数据,然后从上三角子块接收数据;上三角子块先将数据存放在缓冲区buffer中,然后从与之对应的下三角子块接收数据;最后再将缓冲区中的数据发送给下三角子块1001。该并行算法的描述如下:1234567891011121314151617181920212223算法9.5.2 矩阵转置并行算法输入:矩阵Ann输出:矩阵Ann的转置矩阵ATnntransposed matrix/*对所有处理器my_rank(my_rank=0,p-1) */vmy_rank/sqrt(p); /*计算子块的行号*/umy_rank mod sqrt(p); /*计算

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1