多核程序設計總結報告——並行fft算法的實現與研究小組成員.docVIP

多核程序設計總結報告——並行fft算法的實現與研究小組成員.doc

  1. 1、本文档共10页,可阅读全部内容。
  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文档。上传文档
查看更多
多核程序設計總結報告——並行fft算法的實現與研究小組成員.doc

多核程序设计总结报告 ——并行FFT算法的实现与研究 小组成员: 陈慧 姜立波 报告时间: 2011年3月30日 一、实验目的 通过引入多线程的并行处理,使得快速傅里叶变换在多核处理器上获得更加的处理性能。利用将串行算法中的性能瓶颈部分并行化,达到提高效率的目的,并通过实验研究多线程在机器上的实际性能,加深对多核及其相关概念的理解。 二、设计思路 1、基本算法 设序列点数为N=2^L,L为整数,如果不满足,可人为添加零项使之达到这一要求。并且将x(n)分为奇偶两组,其中x1(r)=x(2r), x2(r)=x(2r+1)r=0,1,……,N/2-1 DFT根据公式可以表示为:,令?,k,r取值为0,1,……,N/2-1因,,所以可得:,因此只需计算0到(N/2-1)区间的所有X1(k)和X2(k)即可,这种方法把一个N点的DFT序列分解为两个N/2个点的子DFT序列,将子序列按同样的方法分解下去直到不能为止,最后即可计算出N点的DFT序列 2、并行化 由于将结点每次分两组,两组之间的计算互不干扰,则有关这两组的计算可以在多核处理器上并行。理论上每次对结点分解后都可以创建新的线程来对其进行并行处理,但由于测试所用CPU为Intel Core2双核处理器,因此我们提交的程序仅仅创建了两个线程对第一次分解后的结点作并行化。更多的线程我们也作了实现,但在双核处理器上出现了性能的退化。 三、主要函数及注释 1、FFT计算的主体calculate()函数 if(!y || !x) return 0; else { change(n,begin); //用于对结点进行排序 if(n == 2) { y_temp[begin]=x[begin]+x[begin+1]; y_temp1[begin]=x_1[begin]+x_1[begin+1]; y_temp[begin+1]=x[begin]-x[begin+1]; y_temp1[begin+1]=x_1[begin]-x_1[begin+1]; } else { p_1[0]=n/2; //以p开头的数组存放了长度、起始值等参数用于传递给线程 p_1[1]=begin; p_2[0]=n/2; p_2[1]=begin+n/2; hThread[0] =CreateThread(NULL, 0,calculate1, p_1, 0, NULL );//创建新线程执行calculate1函数 hThread[1] = CreateThread(NULL, 0, calculate1, p_2, 0, NULL );//创建新线程执行calculate1函数 WaitForMultipleObjects(2, hThread, TRUE, INFINITE); //等待两个线程执行完成后合并 double w=2*pi/length; for(int i=begin;ibegin+n/2;i++) //对前半段结点处理 { y[i]=y_temp[i]+cos(w*length*(i-begin)/n)*y_temp[i+n/2]-sin(w*length*(i-begin)/n)*y_temp1[i+n/2]; y_1[i]=y_temp1[i]+cos(w*length*(i-begin)/n)*y_temp1[i+n/2]+sin(w*length*(i-begin)/n)*y_temp[i+n/2]; } for(int j=begin+n/2;jbegin+n;j++) //对后半段结点处理 { y[j]=y_temp[j-n/2]-cos(w*length*(j-begin-n/2)/n)*y_temp[j]+sin(w*length*(j-begin-n/2)/n)*y_temp1[j]; y_1[j]=y_temp1[j-n/2]-cos(w*length*(j-begin-n/2)/n)*y_temp1[j]-sin(w*length*(j-begin-n/2)/n)*y_temp[j]; } for(int k=begin;kbegin+n;k++)

文档评论(0)

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

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

1亿VIP精品文档

相关文档