英特尔多核编程大赛优化报告

上传人:自*** 文档编号:80710871 上传时间:2019-02-19 格式:DOC 页数:19 大小:112.30KB
返回 下载 相关 举报
英特尔多核编程大赛优化报告_第1页
第1页 / 共19页
英特尔多核编程大赛优化报告_第2页
第2页 / 共19页
英特尔多核编程大赛优化报告_第3页
第3页 / 共19页
英特尔多核编程大赛优化报告_第4页
第4页 / 共19页
英特尔多核编程大赛优化报告_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《英特尔多核编程大赛优化报告》由会员分享,可在线阅读,更多相关《英特尔多核编程大赛优化报告(19页珍藏版)》请在金锄头文库上搜索。

1、 英特尔多核编程大赛优化报告蒋黎首先要感谢CSDN和Intel为我们提供了这么好的学习机会。在比赛的过程中,我对多核体系有了更多的了解,对优化也有了更深的认识。希望能多跟大家讨论,共同进步。我优化的最终结果:单核:0.562s(Celeron 3.06G)双核:0.375s(AMD Athlon 64 X2 Dual 3800+)为了方便阅读,我把优化报告分成了几个部分:概要篇(简述优化思路和方法)源码篇(最终版本的源码)算法篇(分析主要的算法)大赛公布的原始代码:(组织者后来要求计算和输出精度到小数点后7位,这里的输出代码做了相应的调整。)/*computethepotentialenerg

2、yofacollectionof*/*particlesinteractingviapairwisepotential*/#include#include#include#include#include#defineNPARTS1000#defineNITER201#defineDIMS3intrand(void);intcomputePot(void);voidinitPositions(void);voidupdatePositions(void);doublerDIMSNPARTS;doublepot;doubledistx,disty,distz,dist;intmain()inti;

3、clock_tstart,stop;initPositions();updatePositions();start=clock();for(i=0;iNITER;i+)pot=0.0;computePot();if(i%10=0)printf(%5d:Potential:%10.7f ,i,pot);updatePositions();stop=clock();printf(Seconds=%10.9f ,(double)(stop-start)/CLOCKS_PER_SEC);voidinitPositions()inti,j;for(i=0;iDIMS;i+)for(j=0;jNPARTS

4、;j+)rij=0.5+(double)rand()/(double)RAND_MAX);voidupdatePositions()inti,j;for(i=0;iDIMS;i+)for(j=0;jNPARTS;j+)rij-=0.5+(double)rand()/(double)RAND_MAX);intcomputePot()inti,j;for(i=0;iNPARTS;i+)for(j=0;ji-1;j+)distx=pow(r0j-r0i),2);disty=pow(r1j-r1i),2);distz=pow(r2j-r2i),2);dist=sqrt(distx+disty+dist

5、z);pot+=1.0/dist;return0;代码执行时间3.97秒优化报告1-概要篇最终优化版本运行时间:单核:0.562s(Celeron 3.06G)双核:0.375s(AMD Athlon 64 X2 Dual 3800+ 2.01GHz)/优化步骤和执行时间测试系统主要使用使用Celeron 3.06G。每一步优化后均使用VTune分析主要函数的运行情况。多核测试使用AMD Athlon 64 X2 Dual 3800+ 2.01GHz。1 原始代码(4.39s)使用VS2005转化原始的工程文件,编译并运行。用VTune分析,可以看出,性能主要损失在computePot函数以及

6、其子函数上,其中SQRT操作非常耗费时间。2 优化pow为mul(3.156s)容易看到pow(x, 2)等价于x*x。乘法操作比pow要高效很多。用VTune分析,发现computePot函数占用CPU降为19%。3 使用Intel编译器(2.734s)转化工程文件,使用IntelC+编译器。用VTune分析,发现computePot函数占用CPU为99.29%。可以看出,SQRT等函数都被computePot函数囊括在内了。4 使用SSE2指令优化关键运算(2.453s)通过应用SSE2指令,把数据每四组一起进行并发的运算。经检测,每四组进行运算和每两组进行运算效果差不多,这应该是因为FD

7、IV运算单元已经饱和的缘故。时间主要耗费在SQRT和DIV上了。用VTune分析,computePot函数占用CPU为99%。5 迭代运算1/sqrt(x)(0.875s)使用RSQRTPS计算近似值,通过两次迭代求出精确值。必须迭代两次,否则精度不够。用VTune分析,computePot函数占用CPU为98%。6 汇编优化(0.609s)为减少内存读写次数,提高指令并发程度,使用汇编语言进行关键算法优化。每次进行8组数据的运算(sum_rsqrt函数),不足8组的剩余数据单独计算(sum_rsqrt_trailing函数)。用VTune分析,computePot函数及子函数占用CPU约为9

8、8%。7 指令重排(0.578s)优化主要针对sum_rsqrt函数。通过调整指令的运算顺序,增加指令并发度。每次调整都通过VTune查看sum_rsqrt函数的运行时间。重排前,Clockticks为575,重排后Clockticks为524。8 rand函数优化(0.562s)自行实现rand函数,减少系统调用和线程同步的开销。9 双核测试(0.375s)由于条件所限,使用AMD Athlon 64 X2 Dual 3800+作为测试CPU。10 多线程代码(0.375s)自行实现的多线程代码,替代OpenMP。优化报告2-源码篇#include #include #include #in

9、clude #include #include #include #define NPARTS 1000#define NITER 201#define DIMS 3int rand( void );int computePot(void);void initPositions(void);void updatePositions(void);void t_create();void t_destroy();_declspec(align(16) double rDIMSNPARTS;double pot;double distx, disty, distz, dist;int main()

10、int i; clock_t start, stop; initPositions(); updatePositions(); t_create(); start=clock(); for( i=0; i 16) & 0x7fff );const double inv_rand_max = 1.0/(double)RAND_MAX;void initPositions() int i, j; for( i=0; iDIMS; i+ ) for( j=0; jNPARTS; j+ ) rij = 0.5 + ( (double) q_rand() * inv_rand_max );_declsp

11、ec(naked) void updatePositions_sse() static unsigned s_mul1 = 0x343FD; static unsigned s_add1 = 0x269EC3; static unsigned s_mul2 = 0xA9FC6809; static unsigned s_add2 = 0x1E278E7A; static double s_inv_max = inv_rand_max; static double s_half = 0.5; _asm movd xmm0, q_rand_hold movd xmm2, s_mul2 movd xmm6, s_mul1 movss xmm1, xmm0 pmuludq xmm0, xmm6

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号