并行计算MPI程序设计.docx

上传人:b****6 文档编号:3327866 上传时间:2022-11-21 格式:DOCX 页数:14 大小:258.51KB
下载 相关 举报
并行计算MPI程序设计.docx_第1页
第1页 / 共14页
并行计算MPI程序设计.docx_第2页
第2页 / 共14页
并行计算MPI程序设计.docx_第3页
第3页 / 共14页
并行计算MPI程序设计.docx_第4页
第4页 / 共14页
并行计算MPI程序设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

并行计算MPI程序设计.docx

《并行计算MPI程序设计.docx》由会员分享,可在线阅读,更多相关《并行计算MPI程序设计.docx(14页珍藏版)》请在冰豆网上搜索。

并行计算MPI程序设计.docx

并行计算MPI程序设计

*******************

实践教学

*******************

 

兰州理工大学

理学院

2016年春季学期

 

并行计算课程设计

 

专业班级:

2013级信息与计算科学

姓名:

学号:

13550418

指导教师:

成绩:

摘要

FFT,即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。

   

设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N^2次运算。

当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)^2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。

这样变换以后,总的运算次数就变成N+2(N/2)^2=N+N^2/2。

继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。

而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog

(2)(N)次的运算,N在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性

关键字:

FFT蝶式计算傅里叶变换

 

一、题目及要求

1.1题目

对给定的

=(1,2,4,3,8,6,7,2),利用串行FFT递归算法(蝶式递归计算原理)计算其傅里叶变换的结果

1.2要求

利用串行递归与蝶式递归原理,对给定的向量求解傅里叶变换的结果

 

二、算法设计与算法原理

2.1算法原理与设计

令为n/2次单位元根,则有.

将b向量的偶数项和奇数项分别记为

注意推导中反复使用

图2.1

 

 

2.2设计求解步骤

三、算法描述与算法流程

3.1算法描述

n=8的FFT蝶式计算图

图3.1

图3.2FFT递归计算流程图

3.2流程图

 

图3.3

四、源程序代码与运行结果

4.1源程序

/************FFT***********///整个程序输入和输出利用同一个空间x[N],节约空间

#include

#include

#include

#defineN1000//定义输入或者输出空间的最大长度

typedefstruct

{

doublereal;

doubleimg;

}complex;//定义复数型变量的结构体

voidfft();//快速傅里叶变换函数声明

voidinitW();//计算W(0)~W(size_x-1)的值函数声明

voidchange();//码元位置倒置函数函数声明

voidadd(complex,complex,complex*);/*复数加法*/

voidmul(complex,complex,complex*);/*复数乘法*/

voidsub(complex,complex,complex*);/*复数减法*/

voiddivi(complex,complex,complex*);/*复数除法*/

voidoutput();/*输出结果*/

complexx[N],*W;/*输出序列的值*/

intsize_x=0;/*输入序列的长度,只限2的N次方*/

doublePI;//pi的值

intmain()

{

inti;

system("cls");

PI=atan

(1)*4;

printf("Pleaseinputthesizeofx:

\n");/*输入序列的长度*/

scanf("%d",&size_x);

printf("Pleaseinputthedatainx[N]:

(suchas:

56)\n");/*输入序列对应的值*/

for(i=0;i

scanf("%lf%lf",&x[i].real,&x[i].img);

initW();//计算W(0)~W(size_x-1)的值

fft();//利用fft快速算法进行DFT变化

output();//顺序输出size_x个fft的结果

return0;

}

/*进行基-2FFT运算,蝶形算法。

这个算法的思路就是,

先把计算过程分为log(size_x)/log

(2)-1级(用i控制级数);

然后把每一级蝶形单元分组(用j控制组的第一个元素起始下标);

最后算出某一级某一组每一个蝶形单元(用k控制个数,共l个)。

*/

voidfft()

{

inti=0,j=0,k=0,l=0;

complexup,down,product;

change();//实现对码位的倒置

for(i=0;i

(2);i++)//循环算出fft的结果

{

l=1<

for(j=0;j

//算出第m=i级的结果【i从0到(log(size_x)/log

(2))-1】

{

for(k=0;k

{//算出j组中第k个蝶形单元

mul(x[j+k+l],W[(size_x/2/l)*k],&product);/*size/2/l是该级W的相邻上标差,l是该级该组取的W总个数*/

add(x[j+k],product,&up);

sub(x[j+k],product,&down);

x[j+k]=up;//up为蝶形单元右上方的值

x[j+k+l]=down;//down为蝶形单元右下方的值

}

}

}

}

voidinitW()//计算W的实现函数

{

inti;

W=(complex*)malloc(sizeof(complex)*size_x);/*申请size_x个复数W的空间(这部申请的空间有点多,实际上只要申请size_x/2个即可)*/

for(i=0;i<(size_x/2);i++)/*预先计算出size_x/2个W的值,存放,由于蝶形算法只需要前size_x/2个值即可*/

{

W[i].real=cos(2*PI/size_x*i);//计算W的实部

W[i].img=-1*sin(2*PI/size_x*i);//计算W的虚部

}

}

 

voidchange()//输入的码组码位倒置实现函数

{

complextemp;

unsignedshorti=0,j=0,k=0;

doublet;

for(i=0;i

{

k=i;

j=0;

t=(log(size_x)/log

(2));

while((t--)>0)

{

j=j<<1;

j|=(k&1);

k=k>>1;

}

if(j>i)

{

temp=x[i];

x[i]=x[j];

x[j]=temp;

}

}

}

 

voidoutput()//输出结果实现函数

{

inti;

printf("Theresultareasfollows\n");

for(i=0;i

{

printf("%.4f",x[i].real);//输出实部

if(x[i].img>=0.0001)//如果虚部的值大于0.0001,输出+jx.img的形式

printf("+j%.4f\n",x[i].img);

elseif(fabs(x[i].img)<0.0001)//如果虚部的绝对值小于0.0001,无需输出

printf("\n");

else

printf("-j%.4f\n",fabs(x[i].img));

//如果虚部的值小于-0.0001,输出-jx.img的形式

}

}

voidadd(complexa,complexb,complex*c)//复数加法实现函数

{

c->real=a.real+b.real;//复数实部相加

c->img=a.img+b.img;//复数虚部相加

}

voidmul(complexa,complexb,complex*c)//复数乘法实现函数

{

c->real=a.real*b.real-a.img*b.img;//获取相乘结果的实部

c->img=a.real*b.img+a.img*b.real;//获取相乘结果的虚部

}

voidsub(complexa,complexb,complex*c)//复数减法实现函数

{

c->real=a.real-b.real;//复数实部相减

c->img=a.img-b.img;//复数虚部相减

}

voiddivi(complexa,complexb,complex*c)//复数除法实现函数

{

c->real=(a.real*b.real+a.img*b.img)/(b.real*b.real+b.img*b.img);

//获取相除结果的实部

c->img=(a.img*b.real-a.real*b.img)/(b.real*b.real+b.img*b.img);

//获取相除结果的虚部

}

4.2运行结果

(1)处理器p=4

图4.2.1

(2)处理器p=2

图4.2.2

五、算法分析及其优缺点

5.1算法分析

(1)FFT算法的基本原理是把长序列的DFT逐次分解为较短序列的DFT。

按照抽取方式的不同可分为DIT-FFT(按时间抽取)和DIF-FFT(按频率抽取)算法。

按照蝶形运算的构成不同可分为基2、基4、基8以及任意因子(2n,n为大于1的整数),基2、基4算法较为常用。

(2)总体结构说明 

输入数据为串行的数据流,故在第一级蝶形运算模块前加入串并转换模块,将串行数据流转换为并行的两列数据流以适应基2蝶形运算模块的输入信号要求。

 

由于每级蝶形运算一次处理的两个输入数据不能直接由前一级蝶形运算一次性输出,故在两个蝶形运算单元之间插入延时对齐模块,将前一级蝶形运算的结果(两列并行的数据流)作适当的延时并通过转接器对齐,形成后一级蝶形运算模块所需要的2列输入序列。

 

在最后一级蝶形运算后加入串并转换模块,将2列并行的数据流合成为1列。

最后加入倒序模块将DIF-FFT得到的倒序输出序列整理为顺序输出。

 

旋转因子产生模块产生各级基2蝶形运算所需的旋转因子。

由运算流图可以看出最后一级的旋转因子其实是1,故可省略最后一级蝶形运算单元中的旋转因子乘法器。

因此用一个双口ROM将两组数据分别输出到第一级和第二级的蝶形运算单元即可。

 

基2蝶形运算模块由两个复数加法器和一个复数乘法器构成。

旋转因子由ROM产生后,作为复数乘法器的输入之一,与前面复数加法器得到的结果相乘完成一次蝶形运算。

为提高系统的运行速度可在蝶形运算单元中插入流水线寄存中间结果

(3)蝶形运算单元如下所示:

5.2优缺点

(1)优点:

结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。

 

(2)缺点:

递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

 

六、总结

通过这次课程设计,让我更加深刻了解课本知识,和以往对知识的疏忽得以补充。

虽然这次课程是那么短暂的1周时间,我感觉到这些天我的所学胜过我这一学期所学,这次任务原则上是设计,其实就是一次大的作业,是让我对课本知识的巩固和对基本公式的熟悉和应用

课程设计是一个重要的教学环节,通过课程设计使我们了解到一些实际与理论之间的差异。

通过课程设计不仅可以巩固专业知识,为以后的工作打下了坚实的基础,而其还可以培养和熟练使用资料,运用工具书的能力,把我们所学的课本知识与实践结合起来,起到温故而知新的作用。

课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门设计课,给了我许多道,给了我很多思,给了我莫大的空间。

同时,设计让我感触很深。

使我对抽象的理论有了具体的认识。

在课程设计过程中。

我们要比较系统的了解串行算法FFT的设计中的每一个环节,包括从总体设计原则,以《设计任务书》的指导思想为中心,参照有关资料,有计划有头绪、有逻辑地把这次设计搞好!

 

总之,这次课程设计使我收获很多、学会很多、比以往更有耐心很多。

感谢学校及老师给我们这次课程设计的机会,最真挚的感谢我们的辅导老师 ,在设计过程中,老师精心的辅导和不厌其烦地的态度才使得我们以顺利的完成这次设计,他那无私的奉献的精神照耀着我们对学习的热爱,同时也增加我们对知识的追求和欲望度

 

七、参考文献

[1]陈国良编著.并行计算-结构?

算法?

编程.高等教育出版社(修订版),2003

  [2]陈国良编著.并行算法的设计与分析.高等教育出版社(修订版),2002

[3]陈国良等编著.并行计算机体系结构.高等教育出版社,2002

[4]李晓梅等编著.并行算法.湖南科技出版社,1992

  [5]沈志宇等编著.并行程序设计.国防科大出版社,1997

  [6]孙家昶等编著.网络并行计算与分布式编程环境.科学出版社,1996

  [7]王鼎兴,陈国良编著.互联网络结构分析.科学出版社,1990

  [8]许士良编著.计算机常用算法(第二版).清华大学出版社,1996

[9]都志辉编著.高性能计算并行技术—MPI并行程序设计,清华大学出版社,2001

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1