您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 里仁多核程序设计实验报告
多核程序设计实验报告Multi-coreProgrammingExperimentReport学生所在学院:里仁学院学生所在班级:学生姓名:学生学号:指导教师:教务处2014年4月-1-实验一Windows多线程编程模块一:基础练习一.实验目的与要求二.实验环境及软件三.实验内容四.实验代码stdio.htime.hstdlib.homp.hidtest(intn)for(inti=0;i10000;i++){}main(){doubledResult;longlBefore=clock();ompparallelforfor(inti=0;i10000;i++)test(i);dResult=(double)(clock()-lBefore);printf(\nTotalTime:%fms.\n,dResult);system(pause);return0;五.结果分析运行时间是串行的一半。明显降低了时间的消耗。-2-实验二各种同步机制的性能比较一.实验目的与要求二.实验环境及软件三.实验内容以矩阵乘进行并行串行比较四.实验代码和结果实验代码://juzhencheng.cpp:定义控制台应用程序的入口点。#includestdafx.h#includeomp.h#includestdio.h#includetime.h#defineNN2000intA[NN][NN],B[NN][NN];longlongC[NN][NN];voidsolve(intn,intnum_thread){inti,j,t,k,paralleltime,serialtime;clock_tstartTime,endTime;longlongsum;omp_set_num_threads(num_thread);//--------------对矩阵A和矩阵B进行初始化-------------for(i=0;in;i++){t=i+1;for(j=0;jn;j++){A[i][j]=t++;B[i][j]=1;}}//----------------矩阵乘法并行算法------------------startTime=clock();sum=0;#pragmaompparallelshared(A,B,C)private(i,j,k)-3-{#pragmaompforschedule(dynamic)for(i=0;in;i++){for(j=0;jn;j++){C[i][j]=0;for(k=0;kn;k++){C[i][j]+=A[i][k]*B[k][j];}}}}for(i=0;in;i++)for(j=0;jn;j++)sum+=C[i][j];endTime=clock();paralleltime=endTime-startTime;printf(矩阵C所有元素和为sum=%lld并行计算时间time=%dms\n,sum,paralleltime);startTime=clock();sum=0;for(i=0;in;i++){for(j=0;jn;j++){C[i][j]=0;for(k=0;kn;k++){C[i][j]+=A[i][k]*B[k][j];}}}for(i=0;in;i++)for(j=0;jn;j++)sum+=C[i][j];endTime=clock();serialtime=endTime-startTime;printf(矩阵C所有元素和为sum=%lld串行计算时间time=%dms\n,sum,serialtime);printf(相对加速比为:%d/%d\n,serialtime,paralleltime);-4-}int_tmain(intargc,_TCHAR*argv[]){intn,num_thread;printf(请输入矩阵的节数(整数N=2000),再输入并行的线程数。\n\n);while(scanf(%d%d,&n,&num_thread)!=EOF){printf(你输入的矩阵节数为:%d并行线程数为:%d\n,n,num_thread);solve(n,num_thread);}return0;}实验结果:实验三蒙特卡洛法并行求解Pi值一.实验目的与要求二.实验环境及软件三.实验内容四.实验代码和结果代码://Pi.cpp:定义控制台应用程序的入口点。//求圆周率PI#includestdafx.h#includewindows.h#includetime.h#includeomp.h#includeiostreamusingnamespacestd;staticlongnum_steps=1000000000;//定义所分的块数#defineNUM_THREADS2//定义所开启的线程数-5-int_tmain(intargc,_TCHAR*argv[]){inti;omp_set_num_threads(NUM_THREADS);//开启线程doublex,sum=0.0,pi;clock_tstart_time,end_time;doublestep=1.0/(double)num_steps;//并行--------------------------------------start_time=clock();#pragmaompparallelsectionsreduction(+:sum)private(x,i){#pragmaompsection{for(i=omp_get_thread_num();inum_steps;i=i+NUM_THREADS){x=(i+0.5)*step;sum=sum+4.0/(1.0+x*x);}}#pragmaompsection{for(i=omp_get_thread_num();inum_steps;i=i+NUM_THREADS){x=(i+0.5)*step;sum=sum+4.0/(1.0+x*x);}}}pi=step*sum;end_time=clock();coutPi=piendl;cout并行time=end_time-start_timeendl;//串行-----------------------------------sum=0.0;start_time=clock();for(i=0;inum_steps;i++){-6-x=(i+0.5)*step;sum=sum+4.0/(1.0+x*x);}pi=step*sum;end_time=clock();coutPi=piendl;cout串行time=end_time-start_timeendl;system(pause);return0;}结果:实验四多核并行排序实验一.实验目的与要求1、熟悉快速排序的串行算法2、熟悉快速排序的并行算法3、实现快速排序的并行算法二.实验环境及软件硬件环境:。。。,OS:,软件工具:VC三.实验内容1、快速排序的基本思想2、快速排序算法的性能3、快速排序算法并行化四.实验代码和结果实验代码://bingxingpaixu.cpp:定义控制台应用程序的入口点。#includestdafx.h-7-#includestdio.h#includeiostream#includestdlib.h#includetime.h#includeomp.husingnamespacestd;//intcount=0;voidswap(int&a,int&b)//{inttmp;tmp=a;a=b;b=tmp;}voidquicksort(int*A,intl,intu){inti,m,k;if(l=u)return;m=l;for(i=l+1;i=u;i++)if(A[i]A[l])/*不管是选第一个元素作为pivot还是最后一个作为pivot,假如我们想得到的是从小到大的序列,那么最坏的输入情况就是从大到小的;如果我们想得到从大到小的序列,那个最坏的输入情况就是从小到大的序列*/swap(A[++m],A[i]);swap(A[l],A[m]);quicksort(A,l,m-1);quicksort(A,m+1,u);}voidmain(intargc,char*argv){omp_set_num_threads(2);//----------------设置线程数为2,因为是双核的CPUintk=0,i=0;intm=0,n=0;doublecost=0;intlen=10000;-8-intshort_len=len/2;intB[10000],C[10000],D[5000],E[5000];//--------将B[]分为两个小的数组,并行的对他们调用快速排序算法#pragmaompparalleldefault(none)shared(B,C,len)private(i)//---这个for循环是并行的{intj=50000;#pragmaompforfor(i=0;ilen;i++){B[i]=j--;C[i]=j--;//初始化B[],C[]数组}}clock_tbegin=clock();//----------------计时开始点#pragmaompparalleldefault(none)shared(B,D,E,short_len)private(i)//---这个for循环是并行的{#pragmaompforfor(i=0;ishort_len;i++)//---这个for循环是并行的{D[i]=B[i];//将B[]的前5000个数放入D[]E[i]=B[i+5000];//将B[]的后5000个数放入E[]}}#pragmaompparalleldefault(none)shared(E,D,short_len)//private(i)------快速排序的并行region{#pragmaompparallelsections{#pragmaompsectionquicksort(D,0,short_len-1);//对D[]排序#pragmaompsectionquicksort(E,0,short_len-1);//对E[]排序}}-9-for(;klen;k++)//----------将D[]和E[]进行归并排序放入B[]里面{if(mshort_len&&nshort_len){if(D[n]=E[m]){B[k]=D[n];n++;}else{B[k]=E[m];m++;}}if(m==short_len||n==short_len){if(m==short_len)B[k]=E[m];elseB[k]=D[n-1];k+=1;break;}}if(/*m==short_len&&*/nshort_len){inttem=short_len-n;for(intp=0;ptem;p++){B[k]=D[n];n++;k++;}}elseif(/*n==short_len&&*/mshort_len){-10-inttem=short_len-m;for(intq=0;qtem;q++){B[k]=E[m];m++;k++;}}//----------------------------归并算法结束clock_tend=clock();//----------------计时结束点cost=(double)(end-begin);cout并行时间costendl;//串行开始begin=clock();quicksort(C,0,len-1);end=clock();cost=(double)(end-begin);cout串行时间costendl;system(pau
本文标题:里仁多核程序设计实验报告
链接地址:https://www.777doc.com/doc-1963792 .html