计算机系统结构实验报告专业:计算机科学与技术指导老师:雷咏梅姓名:钱成浩学号:12121469计算机工程与科学学院实验二多核环境下OpenMP并行编程实验2-1.OpenMP程序的编译和运行1.实验目的1)在Linux平台上编译和运行OpenMP程序;2)在Windows平台上编译和运行OpenMP程序。3)掌握OpenMP并行编程基础。2.实验环境1)硬件环境:i5双核四线程pc机2)软件环境:centos6+gcc,以及win8.1+VisualStudio20133.运行内容代码如下:#includeomp.h#includestdio.hintmain(){intnthreads,tid;omp_set_num_threads(8);#pragmaompparallelprivate(nthreads,tid){tid=omp_get_thread_num();printf(HelloWorldfromOMPthread%d\n,tid);if(tid==0){nthreads=omp_get_num_threads();printf(Numberofthreadsis%d\n,nthreads);}}}4.运行结果linuxWindows实验2-2矩阵乘法的OpenMP实现及性能分析1.实验目的1)用OpenMP实现最基本的数值算法“矩阵乘法”2)掌握for编译制导语句3)对并行程序进行简单的性能调优2.实验要求1)运行并测试OpenMP编写两个n阶的方阵a和b的相乘程序,结果存放在方阵c中,其中乘法用for编译制导语句实现并行化操作,并调节for编译制导中schedule的参数,使得执行时间最短。要求在window环境(不用虚拟机),在linux环境(用和不用虚拟机情况下)测试程序的性能,并写出详细的分析报告。3.实验内容1.用OpenMP编写两个n阶的方阵a和b的相乘程序,结果存放在方阵c中,其中乘法用for编译制导语句实现并行化操作,并调节for编译制导中schedule的参数,使得执行时间最短,写出代码。方阵a和b的初始值如下:12,...,2,1,..2,...,5,4,31,...,4,3,2,...,3,2,1nnnnnnna1,...,1,1,1..1,...,1,1,11,...,1,1,11,...,1,1,1b输入:方阵的阶n、并行域的线程数输出:c中所有元素之和、程序的执行时间提示:a,b,c的元素定义为int型,c中所有元素之和定义为longlong型。Windows计时:用time.h中的clock_tclock(void)函数得到当前程序执行的时间在windows下使用MicrosofeVisualStudio编程,源代码如下:#includestdio.h#includeomp.h#includetime.hvoidcomput(float*A,float*B,float*C)//两个矩阵相乘传统方法{intx,y;for(y=0;y4;y++){for(x=0;x4;x++){C[4*y+x]=A[4*y+0]*B[4*0+x]+A[4*y+1]*B[4*1+x]+A[4*y+2]*B[4*2+x]+A[4*y+3]*B[4*3+x];}}}intmain(){doubleduration;clock_ts,f;intx=0;inty=0;intn=0;intk=0;floatA[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};floatB[]={0.1f,0.2f,0.3f,0.4f,0.5f,0.6f,0.7f,0.8f,0.9f,0.10f,0.11f,0.12f,0.13f,0.14f,0.15f,0.16f};floatC[16];s=clock();//#pragmaompparallelif(false)for(n=0;n1000000;n++){comput(A,B,C);}f=clock();duration=(double)(f-s)/CLOCKS_PER_SEC;printf(s---1,000,000:%f\n,duration);for(y=0;y4;y++){for(x=0;x4;x++){printf(%f,,C[y*4+x]);}printf(\n);}printf(\n======================\n);s=clock();//parallel2#pragmaompparallelforfor(n=0;n2;n++)////CPU是核线程的{for(k=0;k500000;k++)//每个线程管个循环{comput(A,B,C);}}f=clock();duration=(double)(f-s)/CLOCKS_PER_SEC;printf(p2-1,000,000:%f\n,duration);//parallel3s=clock();#pragmaompparallelforfor(n=0;n4;n++)//CPU是核线程的{for(k=0;k250000;k++)//每个线程管个循环{comput(A,B,C);}}f=clock();duration=(double)(f-s)/CLOCKS_PER_SEC;printf(p3-1,000,000:%f\n,duration);//parallel1s=clock();#pragmaompparallelforfor(n=0;n1000000;n++){comput(A,B,C);}f=clock();duration=(double)(f-s)/CLOCKS_PER_SEC;printf(p1-1,000,000:%f\n,duration);for(y=0;y4;y++){for(x=0;x4;x++){printf(%f,,C[y*4+x]);}printf(\n);}getchar();return0;}4.运行结果Linux(shell中运行)Windows线程为2线程为4线程为82)请自己找一个需要大量计算但是程序不是很长的程序,实现OMP的多线程并行计算,要求写出并行算法,并分析并行的效果(注:必须核对串行和并行的计算结果,保证正确性)运行代码:1#includestdio.h2#includeiostream3#includeiomanip4#includeomp.h5#includetime.h6usingstd::cout;7usingstd::setprecision;8usingstd::endl;9voidderivative(doublex,doubley,doubleresult)10{11result=((x+y)*(x+y)-x*x)/y;12}1314intmain()15{16doubleduration;17clock_ts,f;18intn=0;19intk=0;20doublex=2.0,y=0.01;21doubleresult;22s=clock();23#pragmaompparallelif(false)24for(n=0;n1000000;n++)25{26derivative(x,y,result);27/*for(inti=0;i10;++i)28{29derivative(x,y,result);30coutsetprecision(20)resultendl;31y/=10;32}*/33}34f=clock();35duration=(double)(f-s)/CLOCKS_PER_SEC;36couts---1000000:durationendl;37for(inti=0;i10;++i)38{39coutsetprecision(20)resultendl;40y/=10;41}42cout===================endl;43s=clock();44#pragmaompparallelfor45for(n=0;n2;n++)46{47for(k=0;k500000;k++)48{49derivative(x,y,result);50}51}52f=clock();53duration=(double)(f-s)/CLOCKS_PER_SEC;54coutp2-1000000:durationendl;55s=clock();56#pragmaompparallelfor57for(n=0;n4;n++)58{59for(k=0;k250000;k++)60{61derivative(x,y,result);62}63}64f=clock();65duration=(double)(f-s)/CLOCKS_PER_SEC;6667coutp3-1000000:durationendl;68s=clock();69#pragmaompparallelfor70for(n=0;n1000000;n++)71{72derivative(x,y,result);73}74f=clock();75duration=(double)(f-s)/CLOCKS_PER_SEC;76coutp1-1000000:durationendl;7778for(inti=0;i10;++i)79{80coutsetprecision(20)resultendl;81y/=10;82}8384return0;85}代码分析:这是一个计算y=x*x函数中x=2处点的导数的程序。并行程序运行时间短,速度快,能够有效的利用内存。其他的算法太繁杂,需要太多循环运行截图: