- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
并行算法设计与分析 第2章 并行算法的设计技术 本章主要内容 2.1 平衡树方法 2.2 倍增技术 2.3 分治策略 2.4 划分原理 2.5 流水线技术 2.6 加速级联策略 2.7 破对称技术 2.1 平衡树方法 设计思想 将树叶结点作为输入,中间结点作为处理结点,由叶向根 或 由根向叶逐层并行处理。 并行处理过程相当于由底向上(自顶向下)动态生成一个逻辑平衡二叉树。 2.1.1 并行求n个元素的最大值 算法2.1 SIMD-SM上求最大值算法 Begin // m=logn——逻辑二叉树的高度 for k=m-1 to 0 do // k为树的层号 for j=2k to 2k+1-1 par-do // k层上2k结点(处理器)并行求最大值 A[j]=max{A[2j], A[2j+1]} end for end for End 复杂度分析:t(n)=m×O(1) =O(m) =O(logn),p(n)=n/2 c(n)=O(nlogn) ,代价非最优(原因:活跃处理器数目逐层减半) 2.1.2 前缀和的并行计算 前缀和问题定义:n个元素S={x1,x2,…,xn}, S的第i 个前缀和Si=x1*x2*…*xi, 1≤i≤n, 这里*可以是+或×。 (递归)前缀和串行算法: Si=Si-1*xi ,i=2~n, S1=x1, 计算时间为 O(n) 。 前缀和并行算法的设计思想 令A[i]=xi, i=1~n, 引入辅助数组B[h,j]和C[h,j],h=0~logn, j=1~n/2h B[0,j]保存第j 个前缀和的初始值, j=1~ n。 数组B记录由叶到根逐层正向并行遍历树中各结点的信息(并行求“前缀子和”)。 数组C记录由根到叶逐层反向并行遍历树中各结点的信息(并行播送“前缀子和”) 。 C[0,j]保存最终的第j个前缀和, j=1~ n。 算法2.2 SIMD-SM上非递归并行求前缀和高层描述算法 Begin //高层描述并行算法——不考虑可用处理器的数目 (1)for j=1 to n par-do //初始化 B[0,j]=A[j] end for //由叶到根生成高为logn的逻辑二叉树 // 正向遍历二叉树求前缀子和 (2)for h=1 to logn do // h为树层号 for j=1 to n/2h par-do //n/2h 为h层结点数 B[h,j]=B[h-1,2j-1]*B[h-1,2j] end for end for 2.2 倍增技术(指针跳跃技术,pointer jumping) 设计思想 对于规模为n的问题,每当递归(迭代)调用时,将所要处理数据之间的距离(下标,规模)逐步加倍,经过k=logn步后,即可完成距离(规模)为2k =n的所有数据的计算(处理)。 倍增技术特别适合于处理链表或有向树之类的数据结构。 2.2.1 表序问题设L为n个元素的线性表,求出L中每个元素k在L中的次第号rank(k) (位序,秩), rank(k) =L中“小于”k的元素数目。 算法2.4 SIMD-EREW上求元素表序并行算法引入指针数组next(k),定义next(k)为k 的下一个元素,若为最后一个元素,则next(k)=k Begin (1) for all k in L do in parallel // O(1) (1.1) P(k)=next(k); // P(k)表示k的后继 (1.2) if P(k) != k then distance(k) =1 else distance(k) =0 // distance(k)为k的距离 (2) repeat logn 次 // O(logn) (2.1) for all k in L do in parallel // O(1) if P(k)!=P(P(k)) then // 如果k的后继不等于k的后继之后继 (i) distance(k)= distance(k)+ distance(P(k)) //
文档评论(0)