2009并行程序設計期末考試卷-參考解答_第1頁
2009并行程序設計期末考試卷-參考解答_第2頁
2009并行程序設計期末考試卷-參考解答_第3頁
2009并行程序設計期末考試卷-參考解答_第4頁
2009并行程序設計期末考試卷-參考解答_第5頁
已閱讀5頁,還剩6頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

考試科目:并行程序設 得分 學生所在系

姓名

學號 MPI_SendMPI_RecvMPI_Allgather函數功能的偽代碼。(20)MPI_Send(buf,count,datatype,dest,tag,MPI_Recv(buf,count,datatype,source,tag,comm,MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm)for(i=0;i<GroupSize;i++}for(i=0;i<GroupSize;i++){recvtype,i,i,}C語言描述的計算(30分staticlongnum_steps=100000;doublestep;voidmain inti;doublex,pi,sum=0.0;step=1.0/(double)num_steps;for(i=1;i<=num_steps;i++){x=(i-sum=sum+}pi=step*}請給出OpenMP程序實現來并行計算。//OpenMPPI//ParallelRegionexample(SPMDProgram)#include<omp.h>staticlongnum_steps=100000;doublestep;#defineNUM_THREADS2voidmain() intdoublex,pi,sum[NUM_THREADS];step=1.0/(double)num_steps;#pragmaompparallel doublex;intid;id=for(i=id,sum[id]=0.0;i<num_steps;i=i+NUM_THREADS){x=(i+0.5)*step;sum[id]+=}}for(i=0,pi=0.0;i<NUM_THREADS;i++)pi+=sum[i]*}//OpenMPPI//Worksharingconstruct#include<omp.h>staticlongnum_steps=100000;doublestep;#defineNUM_THREADS2voidmain() intdoublex,pi,sum[NUM_THREADS];step=1.0/(double)num_steps;#pragmaompparallel doublex;intid;2009-2010學年第一學期《并行程序設計》期末考 第1頁(共1頁id=omp_get_thraead_num();sum[id]=0;#pragmaompfor(i=0;i<num_steps;i++){x=(i+0.5)*step;sum[id]+=}}for(i=0,pi=0.0;i<NUM_THREADS;i++)pi+=sum[i]*}privatecritical//OpenMPPI//privateclauseandacriticalsection#include<omp.h>staticlongnum_steps=100000;doublestep;#defineNUM_THREADS2voidmain() intdoublex,sum,step=1.0/(double)num_steps;#pragmaompparallelprivate(x,{id=for(i=id,sum=0.0;i<num_steps;i=i+NUM_THREADS){x=(i+0.5)*step;sum+=}#pragmaomppi+=}}//OpenMPPIProgram//Parallelforwithareduction#include<omp.h>staticlongnum_steps=double#defineNUM_THREADS2voidmain() intdoublex,pi,sum=step=1.0/(double)num_steps;#pragmaompparallelforreduction(+:sum)private(x)for(i=1;i<=num_steps;i++){x=(i-sum=sum+}pi=step*}OpenMP(20分voidqs(int*v,intfirst,intlast){intstart[2],end[2],pivot,i,temp;if(first<last){start[1]=first;end[0]=last;pivot=v[(first+last)/2];while(start[1]<=end[0]){while(v[start[1]]<pivot)start[1]++;while(pivot<v[end[0]]) if(start[1]<=end[0]){temp=v[start[1]];v[start[1]]=v[end[0]];v[end[0]]=temp;}}start[0]=first; =last;#pragmaomp#pragmaomp{#pragmaompfornowaitfor(i=0;i<=1;i++)qs(v,start[i],}}2009-2010學年第一學期《并行程序設計》期末考 第1頁(共1頁}//end-}//end-of-矩陣乘法也可以用分塊的思想實現并行,即分塊矩陣乘法(BlockMatrixMultiplication),A(mXn)p塊(p為處理器個數),設umpu行A0,A1,…,Ap-10,1,…,p-1的處理器中。對B(nXk)p塊,記vkpv列向量,這些列塊依次B0,B1,…,Bp-10,1,…p-1C也相應地p×pu×vij列的子矩陣為CijCij=Ai×Bj,其中,Aiu×n,Bjn×v。開始,各處理器的存儲內容如圖(a)所示。此時各處理器并行計算Cii=Ai×Bi其中i=0,1,…,p-1iBi-1號處理器(0號處理Bp-1號處理器中,形成循環傳送,各處理器中的存儲內容如圖(b)CijAi×Bjj=(i+1)modp。B的列塊在各處理器中以這樣p-1pC的所有子矩陣。最終,iCCi0,Ci1,…,Ci(p-1)。BB-A--………210A--………210輸入:Am×n,Bn×k,對所有處理器Cl=(i+my_rank)modforz=0tou-1doforj=0tov-1dofors=0ton-1endforendforendmm1=(p+my_rank-1)modmp1=(my_rank+1)modif(i≠p-1)(4.1)if(my_rankmod2=0)then (i)B的子塊發送到其左鄰處理器中Bend(4.2)if(my_rankmod2≠0)then (i)Bbuffer中做備份BbufferBendendMPI#include"stdio.h"#include"stdlib.h"#include"mpi.h"#defineintsizesizeof(int)#definefloatsizesizeof(float)#definecharsizesizeof(char)#defineA(x,y)A[x*K+y]#defineB(x,y)B[x*N+y]#defineC(x,y)C[x*N+y]#definea(x,y)a[x*K+y]#defineb(x,y)b[x*n+y]#definebuffer(x,y)/**/#definec(l,x,y)c[x*N+y+l*n]float*a,*b,*c,*buffer;ints;floatintM,N,K,P;intm,n;intint /*FILE*dataFile; /*用于讀取輸入文件內容和將計算結果輸出到結果文件的臨時文件指針*/MPI_Statusstatus;doubletime1;double函數名功能:此函數被rankID0dataIn.txt輸入:2009-2010學年第一學期《并行程序設計》期末考 第1頁(共1頁void{intstarttime=fscanf(dataFile,"%d%d",&M,&K); /*讀取矩陣A的行,列數M,K*/A=(float*)malloc(floatsize*M*K); /*為矩陣A分配空間*/for(i0;iM /*A{for(j=0;j<K;{}},, /*BP,Nif /*KP,{printf("theinputiswrong\n");}B=(float /*Bfor(i0;iK /*B{for(j=0;j<N;{}}printf("Inputoffile, /*A /*A{for(j=0;j<K;j++)printf("%f\t",A(i,j));}, /*B /*B{for(j=0;j<N;j++)printf("%f\t",B(i,j));}C=(float /*C[M,N]}函數名group_size輸入:M,N:intgcd(intM,intN,int{int{returni;}return}函數名void{intprintf("\nOutputofMatrixC= /*C{for(j=0;j<N;j++)printf("%f\t",C(i,j));}printf("Wholerunningtime =%fseconds\n",endtime-starttime);printf("Distributedatatime =%fseconds\n",time1-starttime);printf("Parallelcomputetime=%fseconds\n",endtime-time1);}函數名intmain(intargc,char{int2009-2010學年第一學期《并行程序設計》期末考 第1頁(共1頁{}if/*0A,BM,K,N*/{}

/*0A,BM,K,N{}/*m*//*m{a=(float/*a[m,K]A*/b=(float*)malloc(floatsize*K*n);/*b[K,n]B*/c=(float*)malloc(floatsize*m*N);/*c[m,N]p-1if/*為標號為奇數的處理器分配發送緩沖空間*/buffer=(float*)malloc(K*n*floatsize);if/*printf("Allocatespacefora,borcif/*0A,Ba,b{forfor(j=0;j<K;j++)forfor(j=0;j<n;j++)}if/*0{for{for(j=0;j<K;j++)}/*至此,A,BA,B}/*00{for(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論