并行计算课程报告.docx
《并行计算课程报告.docx》由会员分享,可在线阅读,更多相关《并行计算课程报告.docx(16页珍藏版)》请在冰豆网上搜索。
并行计算课程报告
成绩:
并行计算导论
课程报告
专业:
软件工程
班级:
软件二班
学号:
140120010057
姓名:
蒋琳珂
2017年6月1日
1、并行计算的实际意义
并行计算或称平行计算是相对于串行计算来说的。
它是一种一次可执行多个指令的算法,目的是提高计算速度,及通过扩大问题求解规模,解决大型而复杂的计算问题。
所谓并行计算可分为时间上的并行和空间上的并行。
时间上的并行就是指流水线技术,而空间上的并行则是指用多个处理器并发的执行计算。
在应用需求方面,人类对计算机性能的需求总是永无止境的,在诸如预测模型的构造和模拟、工程设计和自动化、能源勘探、医学、军事以及基础理论研究等领域中都对计算提出了极高的具有挑战性的要求。
例如,在作数值气象预报时,要提高全球气象预报的准确性,据估计在经度、纬度和大气层方向上至少要取200*100*20=40万各网格点。
并行计算机产生和发展的目的就是为了满足日益增长的大规模科学和工程计算、事务处理和商业计算的需求。
问题求解最大规模是并行计算机的最重要的指标之一,也是一个国家高新技术发展的重要标志。
2、拟优化的应用介绍
应用jacobi迭代近似求解二维泊松方程。
二维泊松方程:
其中
,
和
为已知函数,分别定义在
的内部和边界上。
对于任意正整数
和
,将网格剖分成
个相同的方格。
在网格节点上,用二阶中心差分来近似二阶偏导数。
将差分近似代入泊松方程,便得到了五点差分离散格式,泊松方程的求
之后用经典的jacobi算法来求解此方程组。
从任意一初始近似解
出发,迭代计算:
迭代序号k=1,2,3…直至近似解满足误差要求。
若
,且在边界
上
那么泊松方程的解析解为
,若
,且
,那么泊松方程的一个解析解是
。
3、串行算法设计(或介绍)
最耗时的是主循环,是一个三重循环嵌套,时间复杂度为3^N。
4、并行算法设计
对主循环进行OpenMP并行优化,采用
#pragmaompparallelforreduction(+:
uerr)default(none)\
shared(c1,c2,fij,hy2,hx2,Nyp1)shared(u1,u0)private(ix,jy,tmp)
时间复杂度无太大变化。
但是多个线程运算也的确加速了其运算速度。
5、采用的并行计算机结构介绍
采用个人笔记本进行最终测试,其配置如下:
6、基于OpenMP的并行程序实现
#include
#include
#include
#include
#ifdefined(_WIN32)||defined(_WIN64)
#include
#definegettime(a)_ftime(a)
#defineusec(t1,t2)((((t2).time-(t1).time)*1000+\
((t2).millitm-(t1).millitm))*100)
typedefstruct_timebtimestruct;
#else
#include
#definegettime(a)gettimeofday(a,NULL)
#defineusec(t1,t2)(((t2).tv_sec-(t1).tv_sec*1000000+\
((t2).tv_usec-(t1).tv_usec))
typedefstructtimevaltimestruct;
#endif//defined(_WIN32)||defined(_WIN64)
#defineMx8191
#defineNy1023
floatuval(floatx,floaty)
{
return(x*x+y*y);
}
intmain()
{
floatWidthy=2.0,Heightx=1.0;
float*u0,*u1;
floathx,hy,hx2,hy2,fij,c1,c2;
floatuerr,errtol,tmp,*tprt;
intix,jy,maxIter,iter;
intNyp1=Ny+1;
timestructt1,t2;
longlongtelapsed;
u0=(float*)malloc(sizeof(float)*(Mx+1)*(Ny+1));
u1=(float*)malloc(sizeof(float)*(Mx+1)*(Ny+1));
maxIter=100;
errtol=0.00f;
hx=Heightx/Mx;
hy=Widthy/Ny;
//初始化u0/u1的左右边界
for(ix=0;ix<=Mx;ix++)
{
u0[ix*Nyp1+0]=u1[ix*Nyp1+0]=uval(ix*hx,0.0f);
u0[ix*Nyp1+Ny]=u1[ix*Nyp1+Ny]=uval(ix*hx,Ny*hy);
}
//初始化u0/u1的上下边界
for(jy=0;jy<=Ny;jy++)
{
u0[jy]=u1[jy]=uval(0.0f,jy*hy);
u0[Mx*Nyp1+jy]=u1[Mx*Nyp1+jy]=uval(Mx*hx,jy*hy);
}
//初始化u0的内部点
for(ix=1;ix{
for(jy=1;jy{
u0[ix*Nyp1+jy]=0.0f;
}
}
fij=-4.0f;
c1=hx*hx*hy*hy;
c2=1.0f/(2.0*(hx*hx+hy*hy));
hx2=hx*hx;
hy2=hy*hy;
gettime(&t1);
//主要迭代
for(iter=1;iter<=maxIter;iter++)
{
uerr=0.0f;
#pragmaompparallelforreduction(+:
uerr)default(none)\
shared(c1,c2,fij,hy2,hx2,Nyp1)shared(u1,u0)private(ix,jy,tmp)
for(ix=1;ix{
for(jy=1;jy{
u1[ix*Nyp1+jy]=(c1*fij+hy2*(u0[(ix-1)*Nyp1+jy]+u0[(ix+1)*Nyp1+jy])+
hx2*(u0[ix*Nyp1+jy-1]+u0[ix*Nyp1+jy+1]))*c2;
tmp=fabs(u0[ix*Nyp1+jy]-u1[ix*Nyp1+jy]);
uerr=tmp>uerr?
tmp:
uerr;
}
}
printf("iter=%duerr=%e\n",iter,uerr);
if(uerr{
break;
}
tprt=u0;
u0=u1;
u1=tprt;
}
gettime(&t2);
telapsed=usec(t1,t2);
printf("历时=%13ld微秒\n",telapsed);
free(u0);
free(u1);
return0;
}
7、并行优化结果分析
编译平台:
VS2017
并行编程平台:
OpenMP
测试数据集合:
100次jacobi迭代求二维泊松方程的近似解。
集群测试:
串行算法结果:
iter为迭代次数,uerr为误差。
时间单位为微秒。
并行算法结果:
加速比:
15241150/2552944=5.97
本机测试:
串行算法:
并行算法:
加速比:
13000617/6000371=2.17
结论:
每次测试中,误差单调减少,且趋于平稳。
代码中设定误差阈值为0,保证每次迭代相同次数。
在集群和本机上,串行算法精确度一样,本机速度较快。
采用cpu并行,集群的并行程度更高,所以速度有明显优势。
本机速度相对较慢。
主要原因是本机核数不如集群多。
但由于reduction(+:
uerr)字句,归约了误差,所以并行程度越高,误差越大,导致集群误差较大,而本机相对误差较小。
8、并行计算导论学习体会
并行计算导论这门课,概述介绍了并行计算的内容、特点和发展方向,并介绍了并行计算机的体系结构和一些著名的超级计算机。
又深入介绍了几门并行编程方法,如MPI、OpenMP、CUDA等,让我们对并行编程有一个初步的认识。
概述部分可以引发学生的学习兴趣,编程实战正好也满足了学生的学习欲望。
老师提供了先进的计算平台也使学生们更好的了解、认识、学习并行计算。
并行计算是一个热门而且很有作用的方向,这门课给学生打开了一扇求知的窗户,开阔了眼界,学习了知识。
非常感谢老师给我们上了这么有意义的课程。
我们也会继续努力,在这条路上越走越远。