- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
并行dijkstra最短路径算法
并行dijkstra最短路径算法
一,并行算法设计与分析
1.1 并行化思路
串行的dijkstra算法有两层N次循环,第一层循环必须得按次序执行,不可并行。那么只有将第二层循环并行。
第二层循环有两个N次的循环,第一次循环是求dist数组的最小值。复杂度为O(N)
第二次循环是更新dist数组的值,复杂度也是O(N)。
所以串行的总复杂度为O(N*N)
那么必须将这两次循环都并行才可以降低复杂度。
1.2 求最小值的并行方法
假设有p个处理器,N个顶点。给每个处理器分配N/p个顶点,求出局部的最小值,复杂度为O N/p 。然后后一半的处理器将自己的最小值发送给第前p/2个处理器。前一半处理器接收到传来的值后,与局部的最小值比较,作为新值。继续循环,直到剩下一个处理器为止。
注意:若p为偶数,则进行一次合并后,还剩p/2个处理器。 若p为奇数,则进行一次合并后,还剩p/2+1个处理器
复杂度为O N/p+logp
1.3 更新dist数组的并行方法
给每个处理器分配N/p个节点。设选取的dist最小的顶点为u。
for j 0;j mynum;j++ if dist[u]+w[u][j] dist[j] then dist[j] dist[u]+w[u][j]; 采用行块带状划分,这是为了可以连续的传送邻接矩阵。所以不采用行循环带状划分。
复杂度为O N/p
1.4 算法总复杂度
并行的dijkstra算法复杂度为O N* N/p+logp+N/p O N*N/p+Nlogp
二,行块带状划分方法
改进之前的代码采用此方法
比如5个处理器P0,P1,P2,P3,P4。
12个顶点
划分方法如下图所示
P1 0 1 2 P2 3 4 5 P3 6 7 8 P4 9 10 11 P1负责计算dist[0~2]
P2负责计算dist[3~5]
P3负责计算dist[6~8]
P4负责计算dist[9~11]
P1需要矩阵W[0~2][0~11]
P2需要矩阵W[3~5][0~11]
P3需要矩阵W[6~8][0~11]
P4需要矩阵W[9~11][0~11]
三,算法改进
3.1 无需单独分出一个处理器读数据 实际上当0号处理器读完邻接矩阵,并且初始化好其它处理器后,也可以参与并行dijkstra算法求解。而不必将其闲置下来。
3.2 负载均衡
3.2.1 原先的分配方法 比如nodenum 100,groupsize 4,则编号依次为0,1,2,3。0号进程不分配顶点
则按原先的方法ep 34;分配的顶点数依次为34,34,32,
显然保证负载最均衡的分配应该为34,33,33 3.2.2 改进的分配方法 ep nodenum/group_size; mod nodenum%group_size; if my_rank mod mynum ep+1; else mynum ep; 这样可以保证任意两个处理器之间的任务数最多差1 计算全局节点编号的方法如下:比如i号进程中的局部编号j的节点,全局编号 id为: If i mod id ep+1 *i+j; else id ep+1 *mod+ep* i-mod +j; 3.3 适用范围局限性 3.3.1 行块带状划分仅适用于对称矩阵的情况 num + W j,index dist[j]实际上应该为num + W index,j dist[j]。 若为对称邻接矩阵W index,j W j,index 。
3.3.2 改进方法:列块带状划分
若要对非对称邻接矩阵也适用,最好采用列块带状划分。 如图所示:
P1 0 1 2 P2
3 4 5 P3
6 7 8 P4
9 10 11 P1负责计算dist[0~2]
P2负责计算dist[3~5]
P3负责计算dist[6~8]
P4负责计算dist[9~11]
P1需要矩阵W [0~11] [0~2]
P2需要矩阵W [0~11] [3~5]
P3需要矩阵W [0~11] [6~8]
P4需要矩阵W [0~11] [9~11]
这样发送的时候需要逐行发送,每行又分成p段发送。
3.4在求局部最小值时,可用堆的思想
可以将该部分复杂度将低为O log(N/p) 还未编码。
四,改进测试
原先的对称邻接矩阵的数据测试全部通过。
附加测试数据:test文件如下
3
0 1 4
3 0 2
1 5 0
正确的结果应该为:
Dist[0][0] 0;
dist[0][1] 1;
dist[0][2] 3;
但改进之前的代码求出的值却是错误的。
文档评论(0)