实验一串匹配OpenMPI并行编程.pdfVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

实验概述

【实验目的及要求】

本实验的目的是通过练习掌握共享存储并行编程的知识和技巧。

掌握OpenMP并行程序编写的基本步骤

熟悉OpenMP编程环境和工具的使用

了解OpenMP程序调试和调优的技巧

【实验原理】

通过对KMP串匹配的串行算法的修改,以及开拓你其并行结构,就可以达到用openMP

并行化串匹配算法来改进匹配的效率,达到高效的目的。

设计的思路为:将长为n的文本串T均匀划分成互不重叠的p段,分布于处理器0到p-1

中,且使得相邻的文本段分布在相邻的处理器中,显然每个处理器中局部文本段的长度为

n/p(最后一个处理器可在其段尾补上其它特殊字符使其长度与其它相同)。再将长为m的



模式串P和模式串的newnext函数播送到各处理器中。各处理器使用改进的KMP算法并行地对

局部文本段进行匹配,找到所有段内匹配位置。

但是每个局部段(第p-1段除外)段尾m-1字符中的匹配位置必须跨段才能找到。一个简单

易行的办法就是每个处理器(处理器p-1除外)将本局部段的段尾m-1个字符传送给下一处理器,

下一处理器接收到前一处理器传来的字符串后,再接合本段的段首m-1个字符构成一长为2(m-1)

的段间字符串,对此字符串做匹配,就能找到所有段间匹配位置。但是算法的通信量很大,采

用下述两种改进通信的方法可以大大地降低通信复杂度:①降低播送模式串和newnext函数的通

信复杂度。利用串的周期性质,先对模式串P作预处理,获得其最小周期长度|U|、最小周期个

s

数s及后缀长度|V|(P=UV),只需播送U,s,|V|和部分newnext函数就可以了,从而大大减少

了播送模式串和newnext函数的通信量。而且串的最小周期和next函数之间的关系存在着下面定

理1所示的简单规律,使得能够设计出常数时间复杂度的串周期分析算法。②降低每个处理器

(处理器p-1除外)将本局部文本段的段尾m-1个字符传送给下一处理器的通信复杂度。每个处

理器在其段尾m-1个字符中找到模式串P的最长前缀串,因为每个处理器上都有模式串信息,所

以只需传送该最长前缀串的长度就行了。这样就把通信量从传送模式串P的最长前缀串降低到

传送一个整数,从而大大地降低了通信复杂度。而且KMP算法结束时模式串指针j-1的值就是文

本串尾模式串最大前缀串的长度,这就可以在不增加时间复杂度的情况下找到此最大前缀串的

长度。

【实验环境】

操作系统:Windows7

处理器:Intel(R)Core(TM)DuoCPUP7350@2.00GHz

编译软件:MicrosoftVisualStudio2008

【实验内容】

具体的实验代码和可执行程序在附件项目中,现在主要是介绍其中一些重要的函数及

其用途:

//next函数和newnext函数的计算算法

voidnextfunc(stringp,intm,int*next,int*newnext){

inti,j;

next[1]=0;

j=2;

while(j<=m+1)

{

i=next[j-1];

while(i!=0&&p[i]!=p[j-1])

i=next[i];

next[j]=i+1;

j=j+1;

}

newnext[1]=0;

j=2;

while(j<=m)

{

i=next[j];

if(i==0||p[j]!=p[i])

newnext[j]=i;

else

newnext[j]=newnext[i];

j=j+1;

}

}

内层while循环遇到成功比较时和找到文本串中模式串的一个匹配位置时文本串指针i均加

1,所以至多做n次比较;内while循环每次不成功比较时文本串指针i保持不变,但是模式串指

针j减小,所以i-j的值增加且上一次出内循环时的i-j值

文档评论(0)

idowen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档