并行计算-实验指导-实验03图论_第1页
并行计算-实验指导-实验03图论_第2页
并行计算-实验指导-实验03图论_第3页
并行计算-实验指导-实验03图论_第4页
并行计算-实验指导-实验03图论_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验3图论1传递闭包11.1传递闭包串行算法21.2传递闭包并行算法32连通分量52顶点倒塌法算法原理描述52.2连通分量并行算法53单源最短路径73最短路径串行算法73.2最短路径并行算法84最小生成树104最小生成树串行算法114.2最小生成树并行算法125小结14参考文献15附录 连通分量并行算法的mpi源程序15图论在计算机科学、信息科学、人工智能、网络理论、系统工程、控制论、运筹学和经济管理等领域 有着广泛的应川。但很多图论问题虽易表达,却难以求解,其屮右相当多的图论问题均属np完全问题。 本章主要介绍工程实用简单图论问题的并行算法及其mpi编程实现,包括传递闭包、连通分量、最短路径

2、 和最小生成树等。1传递闭包设a是一个含n个顶点的有向图g的布尔邻接矩阵(boolean adjacent matrix),即元素aij=l当且仅当 从顶点i至u j有一条有向边。所谓a的传递闭包(transitive closure),记为a+,是一个nxn的布尔矩阵, 其元素bij=l当且仅当:i=j;或从i出发存在有向路径到j, 乂称为顶点i到j可达。从g的布尔邻接 矩阵a求出g的传递闭包,就称为传递闭包问题。传递闭包问题有很强的应用背景,在科学计算中广泛存在。传递闭包问题的经典解法z就是利用布 尔矩阵的乘法來求解。本节将把这一算法分别在串行和并行机上实现。1.1传递闭包串行算法禾i川布

3、尔矩阵相乘求解传递闭包问题的原理为:对于布尔矩阵(a+护屮的任一元素by bi尸1表示从i 到j存在长度小于等于k的可达路径,否则,切=0。显然对于k=l, (a+i)'中切=1当且仅当从i到j路径长 度为0 (冃)或为1 (从i到j存在有向边);(a+i)2中,bij=l当且仅当从i到j路径长度小于等于2; (a+i)2) 2屮,bij=l当且仅当从i至1打路径长度小于等于4,等等。因为任意两点间如果存在可达路径,长度最多为 n-1,所以kn-1时,(a+i)*就是所求的传递闭包a+。于是(a+i)矩阵的咤n次口乘z后所得的矩阵就是 所求的传递闭包。根据前面的叙述,很口然的有下面的传

4、递闭包串行算法15.1,其时间复杂度为0(n3log n)o算法151传递闭包串行算法输入:图g的布尔邻接矩阵a输出:a的传递闭包mprocedure closurebegin(1) 读入矩阵a/*以下作a = a+i的运算*/(2) for i=0to n-l doa(i, i) = 1endfor/*以下是a矩阵的bgn次自乘,结果放入m矩阵;每次乘后,结果写回a矩阵*/(3) for k=l to bg n do(3.1) for i=0 to n-l dofor j=0 to n-l dos=0while (s<n) and (a(i,s)=0 or a(s,j)=o) dos

5、= s+lendwhileif s<n then m(i,j)=l else m(i,j)=0endforendfor/*计算结果从m写冋a*/(3.2)for i=0 to n-l dofor j=0 to n-l doa(i,j) = m(i,j)endforendforendforend(4.1) 2传递闭包并行算法本小节将把上一小节里的算法并行化。在图论问题的并行化求解中,经常使用将n个顶点(或连通分 fl)平均分配给p个处理器并行处理的皐木思想。其屮每个处理器分配到n个顶点,即n=n/po无法整除 时,一般的策略是在尽量均分的前提下,给最后一个处理器分配较少的顶点。为了使算法简

6、明,在本章中, 仅在算法的mpi实现中才考虑不能整除的情况。在以后的几节中,n、p、n都具有上面约定的意义,不再 多说。为了并行处理,这里将矩阵(a+i)进行划分,分別交给p个处理粘。在每次矩阵乘法的计算中,将nx n的结果矩阵(a+i)2均匀划分成pxp个子块,每块人小为nxn。处理器i负责计算位于第i子块行上的p 个子块。对整个子块行的计算由p次循环完成,每次计算一个子块。每个处理器为了计算一个nxn人小 的子块,需要用到源矩阵(a+i)中对应的连续n行(局部数据a)和连续n列的数据(局部数据b)。计算完 成后,各处理器循环交换局部数据b,就可以进行下一个子块的计算了。于是,总体算法由2层

7、循环构成,外层是矩阵m=a+i的bgn次自乘,每次首先完成矩阵m的一次自 乘,然后将结果写回m;内层是p个子块的计算,每次首先完成各口独立的计算,然后处理器间循环交换 局部数据b°算法运行期间,矩阵m的数据作为全局数据由处理器()维护。根据以上思想,并行算法描述见下血的算法15.2,使用了 p个处理器,其时间复杂度为o(n3/p log n)o 其中myid是处理器编号,下同。算法152传递闭包并行算法输入:图g的布尔邻接矩阵a输出:a的传递闭包mprocedure closureparallelbegin/*由处理器0读入矩阵a到m中,并进行“=1+1运算対应源程序中readmat

8、rix()函数*/(2) if myid=o then(2) 读入矩阵a,放入m中(2) for i=0 to n-l dom(i,i)=lendforendif(3) 各处理器变量初始化/*以下是主循坏,矩阵m的bg n次自乘*/(4) for i=l to bg n par_do/*以下向各处理器发送对应子块行和列数据对应源程序中scndmatrix()函数*/(4) for j=l to p-1 do(i )处理器0发送第j个子块行的数据给处理器j,成为j的局部数据a(ii)处理器0发送第j个子块列的数据给处理器j,成为j的局部数据bendfor/*以下是各处理器接收接收和初始化局部数据

9、a和b对应源程序屮getmatrix()i|数*/(4) 处理器0更新口己的局部数据a和b(4) 处理器1到p-1从处理器0接受数据,作为局部数据a和b/*以下是乘法运算过程,对应源稈序中paramul()函数*/(4) for j=0 to p-1 do(i )处理器k计算结果矩阵的子块(k, (k+j) mod p)(ii) 各处理器将数据b发送给前一个处理器(iii) 各处理器从后一个处理器接收数据bendfor/*以下是各处理器将局部计算结果写inlm数组对应源程序中writeback()j|数*/(4) if myid=0 then1 计算结果直接写入矩阵m2 接受其它处理器发送來的

10、汁算结果并写入melse发送计算结果的myid子块行数据给处理器0endifendforendmpi源程序请参见所附光盘。2连通分量图g的一个连通分量(connected component)是g的一个故大连通子图,该子图中每对顶点间均有一条 路径。根据图g,如何找出其所有连通分量的问题称为连通分量问题。解决该问题常用的方法有3种: 使用某种形式的图的搜索技术;通过图的布尔邻接矩阵计算传递闭包;顶点倒塌算法。本节将介绍如 何在并行环境下实现顶点倒塌算法。2. 1顶点倒塌法算法原理描述顶点倒塌(vertex collapse)算法中,一开始图中的n个顶点看作n个孤立的超顶点(super vert

11、ex), 算法运行屮,有边连通的超顶点相继合并,直到形成最后的整个连通分量。每个顶点属于旦仅属于一个超 顶点,超顶点中标号最小者称为该超顶点的根。该算法的流程由一系列循环组成。每次循环分为三步:发现每个顶点的最小标号邻接超顶点;把 每个超顶点的根连到最小标号邻接超顶点的根上;所有在第2步连接在一起的超顶点倒塌合并成为-个 较大的超顶点。图g的顶点总数为n,因为超顶点的个数每次循环后至少减少一半,所以把每个连通分量倒塌成单个 超顶点至多咤n次循环即可。顶点i所属的超顶点的根记为d(i),则一开始时有d(i)=i,算法结朿后, 所有处于同一连通分暈屮的顶点具有相同的d(i)o(4.2) 2连通分量

12、并行算法算法中为顶点设置数组变量d和c,其中d(i)为顶点i所在的超顶点号,c(i)为和顶点i或超顶点i相 连的最小超顶点号等,根据程序运行的阶段不同,意义也佇变化。算法的主循环由5个步骤组成:各处 理器并行为每个顶点找出对应的c(i);各处理器并行为每个超顶点找出最小邻接超顶点,编号放入c(i) 中;修改所有d(i)二c;修改所有c(i)二c(c(i),运行bg n次;修改所有d(i)为c(i)和d(c(i)中较 小者。其中最后3步对应意义为超顶点的合并。顶点倒塌算法是专为并行程序设计的,多个顶点的处理具有很强的独立性,很适合分配给多个处理器并行处理。这里让p个处理器分管n个顶点。则顶点倒塌

13、算法的具体描述见算法15.3,使用了 p个处理器,其时间复杂度为o(n2/p log n),其中步骤(2)为主循环,内含5个子步骤对应上面的描述。算法15.3顶点倒塌算法输入:图g的邻接矩阵a输出:向sd( 0 : n-1 ),其屮d(i)表示顶点i的标识procedure collapseerticesbegin/*初始化*/for 每个顶点 i par_dod(i) = iendforfor k=l to bg n do/*以下并行为每个顶点找邻接超顶点屮最小的对应源程序中d_to_c()函数*/(2. 1) for 每个 i, j : 0 < i, j < n-1 par_d

14、oc(i) = min d(j) i a(i,j)=l and d(i)hd(j) if没有满足要求的d(j) thenc(i) = d(i)endifendfor/*以下并行求每个超顶点的故小邻接超顶点対应源程序中c_to_c()函数*/(2. 2) for 每个 i, j: 0 < i, j < n-1 par_doc(i) = min c(j) i d(j)=i and c(j)hi if没有满足要求的c(j) thenc(i) = d(i)endifendfor(2. 3) for 每个 i: 0 < i < n-1 par_dod(d = c(i)endfor

15、(2. 4) for i=l to log n do/*以下対应源程序中cc_to_c()函数*/for 每个 j: 0 < j < n-l par_doc(j) = c(c(j)endforendfor/*以下对应源程序中cd_to_d()函数*/(2. 5) for 每个 i: 0<i <n-l par_dod(i) = min c(i), d(c(i) endforendforendmpi源程序请参见章末附录。3单源最短路径单源最短路径(single source shortest pa(h)问题是指求从一个指定顶点s到其它所有顶点i之间的距离, 因为是单一顶点到

16、其它顶点的距离,所以称为单源。设图g(v,e)是一个有向加权网络,其中v和e分别 为顶点集合和边集合,其边权邻接矩阵为w,边上权值w(i,j)>0, ijev, v=o,1,n1。设dist( i)为最短的路径长度,即距离,其中swv且ihs。这里采用著名的dijkstra算法,并将其并行 化。(4.3) 1最短路径串行算法dijkstra算法(dijkstra algorithm)是单源最短路径问题的经典解法之一,基本思想如下。假定有一个待搜索的顶点表vl,初始化时做:dist(s)-o, dist(i)=oo(is), vl=v0每次从vl (非空集)中选取这样的一个顶点u,它的di

17、sl(u)最小。将选出的u点作为搜索顶点,对于其它还在vl 内的顶点 v,若<u,v>e e,而且 dist(u)+w(u,v)<dist(v),则更新 dist(v)为 dist(u)+w(u,v),同时从 vl 中将 u 删 除,立到vl成为空集时算法终止。算法15.4中给出了最短路径问题的dijkstra串行算法,其时间复杂度为0(川)。算法154dijkstra串行算法输入:边权邻接矩阵w (约定顶点i, j之间无边连接时w(i,j)=°°, jlw(i,i) = o)、 待计算顶点的标号s输出:dist(o:n-l),其中disl(i)表示顶点s

18、到顶点i的最短路径(lwiwn)procedure dijkstrabegindist(s) = 0for i=0 to n-l doif is then dist(i) = 00endforvl = v for i=0 to n-l do从vl中找一个顶点u,使得dist(u)最小for (每个顶点 vg vl) and (<u,v>e) doif dist(u)+w(u,v)<dist(v) then dist(v) = dist(u)+w(u,v)endifendfor(5) vl = vl-uendforend3. 2最短路径并行算法在上一小节串行算法的基础上,这里将

19、其并行化。思路如下:上述算法的(1) (2)两步中,每个处理器分派n=n/p个节点进行初始化。第(4.1)步可以并行化为:首先每个处理器分派n个节点分别求局部最小值,然后再p个处理器合 作求全局最小值,最后再将这一最小值广播出去。p个处理器合作方法如下:当p为偶数时,后p/2个处 理器将自己的局部最小值分别发送到对应的前p/2个处理器中,山前p/2个处理器比较出2个局部最小值 中相对较小者并保留。当p为奇数时,设p二2h+l,则后h个处理器的值分別发送到前h个处理器中,比较 并保留小值。一次这样的循环过后,p个最小值减少了一半,两次后,变为1/4,如此一层一层的比较, bgp次循环后,就可以得

20、出唯一的全局最小值。第(4.2)步可以每个处理器分配n个顶点,然后独立进行更新dist的操作。根据以上思路,最短路径的并行算法见算法15.5,使用了 p个处理器,其时间复杂度为0(n2/p+n bg p)o这里的实现算法和对应的源程序中,处理器0只进行输入输出工作,不参与任何其它计算;因此实际 参加运算的处理器为p-l个,所以有n=n/(p-l);另外,布尔数组bdist用来标记各顶点是否已从vl中取 出。算法15.5 dijkstra并行算法输入:边权邻接矩阵w (约定顶点i, jz间无边连接时w(i,j)=oo,且w(i,i) = 0)、待计算顶点的标号s输出:dist(o : n-1),

21、其中dist(i)表示顶点s到顶点i的最短路径(i wiwn)procedure dijkstra-parallelbegin/*以卜对应源程序中readmatrix()l|数*/处理器0读入边权邻接矩阵w/*以下初始化dist和bdist数组,对应源程序中init()函数*/for 每个顶点 i par_doif i=s thendist(i) = 0bdist(i) = trueelsedist(i) = w(i,s)bdisl(i) = falseendifendfor/*以下是算法主循坏,对应源程序中findminwayo函数*/for i=l to n-l do/*各处理器找出口己负

22、责范围内未搜索节点中授小的dist */(3.1) for 每个顶点 j par_doindex = min j i bdist(j)=false num = dist(index)/*以下各处理器协作对p-l个index求最小*/cal num = p-1for j=l to log(p-l) par_doif cal num mod 2=0 then 本次循环参加比较的数据个数为偶数(i ) calnum = calnum/2序号大丁 calnum的处理器将index和num发送给序号比口己小 calnum的处理器序号小于calnum的处理器(不包含0号)在自己原有的和收到 的两个num之

23、间,比较并保留较小者,同时记录对应的indexelse本次循坏参加比较的数据个数为奇数(i ) calnum = (calnum+l)/2序号大于calnum的处理器将index和num发送给序号比口己小 calnum的处理器序号小于calnum的处理器(不包含0号)在自己原有的和收到 的两个num z间,比较并保留较小者,同时记录对应的indexendifendfor处理器1广播通知其它处理器自己的num和index/*以下并行更新*/for 每个顶点 j par_doif bdist(j)=false then dist(j) = niin dist(j), num+w(j,index)

24、endifendfor顶点index对应处理器将对应的bdist(index)更改为trueendforendmpi源程序请参见所附光盘。4最小生成树一个无向连通图g的牛成树是指满足如下条件的g的子图t:t和g顶点数相同;t有足够的边使得所有顶点连通,同时不出现回路。如果对g的每条边指定一个权值,那么,边权总和最小的生成树称 为最小代价生成树,记为mcst (minimum cost spanning tree),常简称为最小生成树(记为mst)。最 小生成树问题就是给定g,找出g的一个最小生成树t的问题。木节将介绍川于求解mst问题的sollin算法,并将其实现。4.1最小生成树串行算法so

25、llin算法(sollin algorithm)是众多川于求解mst问题的算法之一,其原理为:算法开始时,图屮的 n个顶点视为一片森林,每个顶点视为一棵树;算法主循环的流程中,森林里每棵树同时决定其连向其它 树的最小邻边,并将这些边加入森林中,实现树的合并;循环到森林中只剩一棵树时终止。由于森林中树 的数日每次至少减少一半,所以只要bgn次循坏就可以找出msto算法中以d(i)为顶点i所在的树的编号,cdgc(i)和closct(i)为树i连向其它树的最小邻边和其t度, 则sollin算法的形式描述见算法15.6,其时间复杂度为0(n2 log n)。算法 15.6 sollin mst 算法

26、输入:无向图g的边权矩阵w输出:g的最小生成树的边集合tprocedure sollin-mstbegin/*以下所有顶点初始化为一棵孤立的树*/for i=0 to n-1 dod(i) = iendfort初始化为空集while iti < n-l do/*以下为各树寻找连向其它树的最小边权*/for 每棵树 i docloset(i) = 00endforfor 图 g 中每条边(v,u) doif d(v)hd(u) and w(v,u)<closet(d(v) then(i ) closet(d(v) = w(v,u)(ii) edge(d(v) = (v,u)/*以下是

27、树的合并*/(3.3) for 每棵树 i do(i ) (v,u) edge(i)(ii) if d(v)hd(u) thent = t+(v,u)树d(v)和d(u)合并endifendforendwhileend(4.4) 2最小生成树并行算法在上一小节sollin算法的基础上,本节将其并行化。基本思路是市多个处理器同时负责为多个树查找 最短边。为了方便并行处理,各树寻找外连最短边的的任务分两步进行:所有处理器独立并行为每个顶 点找连向其它树的最短边,并将这些数据保存;各处理器独立并行检索每棵树的各顶点,为整棵树找出 外连最短边。注意在以上两步中,处理器间分别按照顶点和树进行分配,对象有

28、了变化。为了配合算法运行,设置了 4个一维数组d、c、j、w:d(i)为顶点i所在的树的编号,也就是该 树中最初的顶点号,初始化为i;c(i)为离顶点i最近的其它树的编号;j(i)为对应的顶点号;w(i) 为对应的边权,即距离。以上变暈约定对mst并行算法的源程序同样适用。运行期间每个处理辭处理n=n/p 个顶点或n个连通分量。各树找出外连最短边后,接下来分3步进行树的合并:让所有的d(i)=c(i);对所有i,进行 c(i)=c(c(i)运算,并循环bg n次;对所有i,更新d(i)为c(i)和d(c(i)中较小者。以上合并过程类似顶 点倒塌算法中超顶点的合并。设mst为输出的最小生成树的邻

29、接矩阵,运行期间由0号处理器维护,则并行算法的描述见算法15.7, 使用了 p个处理器,其时间复杂度为o(n?/p log n)o算法15.7并行sollin mst算法输入:原始图g的邻接矩阵a输出:所求最小牛成树的邻接矩阵mstprocedure sollin-mst-parallelbegin/*以下初始化将图初始化为n棵树*/for每个顶点i par_dod(i) = iendfor(2) while图g未连通do/*以下各处理器为所负责的顶点找出距离最近的树 对应源程序中d_to_c()函数*/for 每个顶点 i par_do(i ) w(i) = maxfor每个顶点j doif

30、 a(i, j)>0 and d(j)hd(i) and a(i, j)<w(i) then c(i) = d(j)w(i) = a(i,j)endifendforifw(i)=maxthenc(i) = d(i)endifendfor/*以下各处理器为所负责的树找出外连的最短边 对应源程序中c_to_c()函数*/for 每棵树 i par_do(i ) tempj = n+ltempw = maxfor每个顶点j doif d(j)=i and c(j)hi and w(j)<tempw thenc(i) = c(j)tempw = w(j)tempj = j(iv) i

31、f tempj<n and j(tempj)<n then通知处理器0将边(tempj, j(tempj)加入mst数组endifendforfor i=0 to n-l par_dod(i) = c(i)endforfor i= 1 to bg n do/*以下对应源程序中cc_to_c()函数*/for j=0 to n-l par_doc(j) = c(c(j)endforendfor/*以下对应源程序中cd_to_d()函数*/for i=0 to n-l par_dod= min c(i), d(c(i) endforendwhileendmpi源程序请参见所附光盘。5小

32、结本章针对传递闭包、连通分量、单源最短路径、最小牛成树等4个经典图论问题,分别介绍了它们的 -种典型算法,以及在mpi并行环境下的算法实现。其屮除连通分量外,其它3个问题的并行算法实现均 由串行算法并行化而得到;通过这3个问题,较为详细的介绍了图论问题串行解法并行化的一般思路:均 匀数据划分,独立计算。如何划分才能尽量做到计算的独立,是划分的关键。在最小生成树sollin算法的 并行化中,其至在程序运行中按照不同的对彖对数据进行了划分。除了常见的串行算法并行化z外,本章还通过连通分量问题的解法,接触了根据并行机特点,直接为并行环境设计的图论问题解法。这种情况在非数值算法问题中并菲特例。int

33、p;int *d,*c;int *a;int temp;int myid;mpi_status status;/*输出必要信息*/void print(int *p)int i;if(myid=0)for(i=0;i<n;i+)printf(h%d “,pi);printf(mnh);本章的编写主要参考了文献。其中,并行传递闭包和连通分量算法也可以参见文献,单源最短路 径dijkstra算法也町以参见文献,而最小生成树sollin算法也对以参见文献叫参考文献.陈国良编著.并行算法的设计与分析(修订版)高等教育出版社,2002.11. hirschberg d s. parallel al

34、gorithms for transitive closure and the connected component problem. proc. 8thannu. acm stoc, new york, 1976,55-57. dijkstra e. a note on two problems in connetion with graphs. numerische mathematic, 1959,1:269-271. goodman s e and hedetnimi s t ed. introduction to the design and analysis of algorit

35、hms(in an algorithmattributed to sollin). mcgraw-hill, new york, 1977附录连通分量并行算法的mpi源程序1.源程序 connect.c/*本算法中处理器数忖须小于图的顶点数*/#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <math.h>#includc <mpi.h>/*使用动态分配的内存存储邻接矩阵,以下为宏定义*/#define a(i,j) ai*n+j严以下为n:顶点数n:各

36、处理器分配的顶点数p:处理器数*/intn;int n;/*读入邻接矩阵*/void reada()char * filename;int ij;printf("n");printf("input the vertex num:n");scanf(”d”,&n);n=n/p;if(n%p!=0) n+;a=(int*)malloc(sizeof(int)*(n*p)*n);if(a=null)printf(uerror when allocating memory'n");cxit(o);printf("input t

37、he adjacent matrix:nh);for(i=0;i<n;i+)for(j=0;j<n;j+)scanf("%d'&a(i,j);for(i=n;i<n*p;i+)for(j=0;jvn;j+)a(i,j)=o;/*处理器0广播特定数据*/void bcast(int *p)mpi_bcast(p,n ,mpint,0,mpi_comm_world);/*两者中取最小的数沖函数*/int min(int a,int b)return(a<b?a:b);)/*为各顶点找最小的邻接超顶点,对应算法步骤(2.1)*/void d_to_c

38、()int i,j;for(i=0;i<n;i+)cn*myid+i=n+l;for(j=0;j<n;j+)if(a(i,j)=l)&&(dj!=dn*myid+i)&&(d|j<cn*myid4-ij)cn*myid+i=dj;if(cn*myid+i=n+l)cn*myid+i=dn*myid+i;/*为各超顶点找故小邻接超顶点,对应算法步骤(2.2)*/void c_to_c()int i,j;for(i=0;i<n;i+) temp=n+1;for(j=0;j<n;j+) if(dj=n*myid+i)&&(

39、cj!=n*myid+i)&&(c|jl<temp)temp=c|j;if(temp=n+l) temp=dn*myid+i ;cmyid*n+i=temp;)严调整超顶点标识*/void cc_to_c()int i;for(i=0;i<n;i+)cfmyid*n+i=ccmyid*n+i;/*产生新的超顶点,对应算法步骤(2.5)*/void cd_to_d()int i;for(i=0;i<n;i+)dmyid*n+ij=min(cniyid*n+i,dcmyid*n+i);/*释放动态内存*/void freeall()free(a);free(d);

40、free(c);/*主函数*/void main(int argc,char *argv)int i,j,k;double 1;int group_size;严以下变量用来记录运行时间*/double starttime,endtime;mpi_i nit(&argc,&argv);mpi comm size(mpi comm world,& group_size);mpi comm rank(mpi comm world,& myid);p=group_sizc;mpi_barrier(mpi_comm_world);if(myid=0)starttime=m

41、pi_wtime();/*处理器0读邻接矩阵*/if(myid=0) reada();mpi_barrier(mpi_comm_world);mpi_bcast(&n, 1,mpi_int,o,mpi_comm_world);if(myid!=0)(n=n/p;if(n%p!二0) n+;)d=(int*)malloc(sizeof(int)*(n*p);c=(int*)malloc(sizeof(int)*(n*p);if(myid!=0)a=(int*)malloc(sizeof(int)*n*n);/*初始化数组d,步骤*/for(i=0;i<n;i+) dmyid*n+i=myid*n+i;mpi_baitier(mpi_comm_world);mpi_gather( &dmyid*n,n,mpint,d,mpint,0,mpi_comm_world);bcast(d);mpi_barrier(mpi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论