并行實驗源代碼_第1頁
并行實驗源代碼_第2頁
并行實驗源代碼_第3頁
并行實驗源代碼_第4頁
并行實驗源代碼_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

實驗一l.Hello.c#include"mpi.h"#include<stdio.h>intmain(intargc,char**argv){MPI_Init(&argc,&argv);printf("helloparallelworld!\n");MPI_Finalize();}一2.isend.c#include<stdio.h>#include<stdlib.h>#include"mpi.h"intmain(intargc,char**argv){inti,numprocs,namelen,myid;charprocessor_name[MPI_MAX_PROCESSOR_NAME];intbuf[5];intflag=0;MPI_Statusstatus;MPI_Requestr;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Get_processor_name(processor_name,&namelen);if(myid==0){for(i=0;i<5;i++){buf[i]=i;}MPI_Isend(&buf,5,MPI_INT,1,99,MPI_COMM_WORLD,&r);}else{MPI_Irecv(&buf,5,MPI_INT,0,99,MPI_COMM_WORLD,&r);MPI_Test(&r,&flag,&status);printf("BeforeMPI_Waitflag=%d.Thebufiscan'tbeused!\n",flag);for(i=0;i<5;i++){printf("buf[%d]=\t%d\n”,i,buf[i]);}MPI_Wait(&r,&status);MPI_Test(&r,&flag,&status);printf("AfterMPI_Waitflag=%d.Thebufiscanbeused!\n",flag);for(i=0;i<5;i++){printf("buf[%d]=\t%d\n",i,buf[i]);}}MPI_Finalize();return0;}message.c#include<stdio.h>#include"mpi.h"intmain(intargc,char**argv){intmyid,numprocs,source;MPI_Statusstatus;charmessage[100];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);if(myid!=0){strcpy(message,"HelloWorld!");MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);}else{for(source=1;source<numprocs;source++){MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,&status);printf("Iamprocess%d.Irecvstring'%s'fromprocess%d.\n",myid,message,source);}}MPI_Finalize();}mtpi.c#include"mpi.h”#include<stdio.h>#include<stdlib.h>#include"time.h”main(intargc,char**argv){intmyid,numprocs;intnamelen,source;longcount=1000000;doubley;doublex;longm=0,m1=0,i=0,p=0;doublepi=0.0,n=0.0;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Get_processor_name(processor_name,&namelen);srand((int)time(0));for(i=0;i<count;i++){x=(double)rand()/(double)RAND_MAX;y=(double)rand()/(double)RAND_MAX;if((x-0.5)*(x-0.5)+(y-0.5)*(y-0.5)<0.25)m++;}n=4.0*m/count;printf("Process%dof%don%spi=%f\n",myid,numprocs,processor_name,n);if(myid!=0){MPI_Send(&m,1,MPI_DOUBLE,0,1,MPI_COMM_WORLD);}else{p=m;for(source=1;source<numprocs;source++){MPI_Recv(&m1,1,MPI_DOUBLE,source,1,MPI_COMM_WORLD,&status);p=p+m1;}printf("pi=%f\n”,4.0*p/(count*numprocs));}MPI_Finalize();}5.who.c#include"mpi.h"#include<stdio.h>intmain(intargc,char**argv){intmyid,numprocs;intnamelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Get_processor_name(processor_name,&namelen);printf("HelloWorld!Process%dof%don%s\n",myid,numprocs,processor_name);MPI_Finalize();}一實驗二1.共享存儲模型#include<stdio.h>#include<stdlib.h>#include<omp.h>#defineN10000intmain(intargc,char*argv[])(inti;intarray[N];intcount,nthreads,tid,chunk;unsignednum;chunk=100;count=0;doublestart,end;printf("pleasechoosenumberofthreads:1,2or4.\n")scanf("%d”,&num);//提示輸入計算線程數(shù)omp_set_num_threads(num);#pragmaompparallelshared(nthreads)(tid=omp_get_thread_num();if(tid==0)nthreads=omp_get_num_threads();printf("\nStartingcountwith%dthreads\n”,nthreads);}}start=omp_get_wtime();#pragmaompparallelforreduction(+:count)schedule(static,chunk)for(i=0;i<N;i++)(array[i]=rand()%10;if(array[i]==3)count++;}end=omp_get_wtime();printf("Thecountcost%fsec.time.\n",end-start);printf("Thenumberof3appearedinthearrayare%d”,count);}2.消息傳遞模型#include<time.h>#defineMPICH_SKIP_MPICXX#include<stdio.h>#include"mpi.h"#include"stdlib.h"#defineRrand()#defineN10000intmain(intargc,char**argv){intmyid,numprocs;intarray[N];intcountall=0;MPI_Statusstatus;srand((int)time(0));for(inti=0;i<N;i++){array[i]=rand()%10;}MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);intcount=0,counti=0;for(intj=N/numprocs*myid;j<N/numprocs*myid+N/numprocs;j++){if(array[j]==3)count++;}if(myid!=0)

{MPI_Send(&count,10,MPI_CHAR,0,99,MPI_COMM_WORLD);}else{countall=count;printf("Iamprocess%d,inmyprocessthenumberis%d.\n",myid,count);for(intsource=1;source<numprocs;source++){MPI_Recv(&counti,10,MPI_CHAR,source,99,MPI_COMM_WORLD,&status);countall=countall+counti;printf("Iamprocess%d,Ireceivethenumber%dfrom%d.\n",myid,counti,source);}printf("Iamprocess%d,Thetotalof3fortheallareais%d.\n",myid,countall);}MPI_Finalize();}實驗三1.矩陣相乘簡單劃分并行算法#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)buffer[x*n+y]/*此宏用來簡化對標(biāo)號為奇數(shù)的處理器內(nèi)的緩沖空間的訪問*/float*a,*b,*c,*buffer;ints;float*A,*B,*C;#definec(l,x,y)c[x*N+y+l*n]/*A[M,K],B[P,N].正確的情況下K應(yīng)該等于P,否則無法

進(jìn)行矩陣相乘*/intM,N,K,P;intm,n;intmyid;intp;/*保存工作站集群中處理器數(shù)目,也即通信子大小*/FILE*dataFile;/*用于讀取輸入文件內(nèi)容和將計算結(jié)果輸出到結(jié)果文件的臨時文件指針*/MPI_Statusstatus;float*a,*b,*c,*buffer;ints;float*A,*B,*C;函數(shù)名:readData*功能:此函數(shù)被rankID為0的進(jìn)程調(diào)用,負(fù)責(zé)從dataIn.txt文件中讀入A[M,K],B[P,N]兩個相乘矩陣的數(shù)據(jù),并為結(jié)果矩陣C[M,N]分配空間。其中C[N,N]=A[M,K]*B[P,N]*輸入:無*返回值:無*/voidreadData(){inti,j;starttime=MPI_Wtime();dataFile=fopen("dataIn.txt","r");/*讀取矩陣A的行,列數(shù)/*為矩陣A/*讀取矩陣A的行,列數(shù)/*為矩陣A分配空間*//*讀入矩陣A的各元素*//*讀取矩陣B的行,列數(shù)P,N/*K應(yīng)該等于?,否則矩陣A=(float*)malloc(floatsize*M*K);for(i=0;i<M;i++){for(j=0;j<K;j++){fscanf(dataFile,"%f",A+i*K+j);}}fscanf(dataFile,"%d%d",&P,&N);*/if(K!=P)無法相乘*/{printf("theinputiswrong\n");exit(1);

}B=(float*)malloc(floatsize*K*N);for(i=0;i<K;i++)素*/{for(j=0;j<N;j++){fscanf(dataFile,"%f”,B+i*N+j);}}fclose(dataFile);printf("Inputoffile\"dataIn.txt\"\n");printf("%d\t%d\n",M,K);for(i=0;i<M;i++){for(j=0;j<K;j++)printf("%f\t",A(i,j));printf("\n");}printf("%d\t%d\n",K,N);for(i=0;i<K;i++){for(j=0;j<N;j++)printf("%f\t",B(i,j));printf("\n");}C=(float*)malloc(floatsize*M*N);間*//*為矩陣B分配空間*//*/*為矩陣B分配空間*//*從文件中讀入矩陣B的各元/*輸出A矩陣的維數(shù)*//*輸出A矩陣的數(shù)據(jù)*//*輸出B矩陣的維數(shù)*//*輸出B矩陣的數(shù)據(jù)*//*為結(jié)果矩陣C[M,N]分配空*函數(shù)名:gcd*功能:此函數(shù)用來返回兩個整數(shù)的不大于group_size的最大公因子*輸入:M,N:要求最大公因數(shù)的兩個整數(shù)*group_size所求公因子必須小于此參數(shù),此參數(shù)代表用戶指定的通信子大小*返回值:M和N的不大于group_size的最大公因子*/intgcd(intM,intN,intgroup_size){inti;for(i=M;i>0;i--){if((M%i==0)&&(N%i==0)&&(i<=group_size))returni;}return1;}/*函數(shù)名:printResult*功能:此函數(shù)被rankID為0的進(jìn)程調(diào)用,用來將A,B,C矩陣打印輸出給用戶,并輸出用于分發(fā)數(shù)據(jù)和并行計算的時間*輸入:無*返回值:無*/voidprintResult(){inti,j;printf("\nOutputofMatrixC=AB\n");for(i=0;i<M;i++)/*輸出C矩陣的結(jié)果數(shù)據(jù)*/{for(j=0;j<N;j++)printf("%f\t",C(i,j));printf("\n");}endtime=MPI_Wtime();printf("\n");printf("Wholerunningtime=%fseconds\n",endtime-starttime);printf("Distributedatatime=%fseconds\n",time1-starttime);printf("Parallelcomputetime=%fseconds\n",endtime-time1);}/**函數(shù)名:main*功能:程序的主函數(shù)*輸入:argc為命令行參數(shù)個數(shù);*argv為每個命令行參數(shù)組成的字符串?dāng)?shù)組。*輸出:返回0代表程序正常結(jié)束;其它值表明程序出錯。*/intmain(intargc,char**argv){

inti,j,k,l,group_size,mp1,mm1;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&group_size);MPI_Comm_rank(MPI_COMM_WORLD,&myid);p=group_size;//下面一段程序負(fù)責(zé)從dataIn.txt文件中讀入A[M,K],B[P,N]兩個相乘矩陣的數(shù)據(jù),//并為結(jié)果矩陣C[M,N]分配空間。C[N,N]=A[M,K]*B[P,N]〃注意這段程序只有編號為0的處理器才執(zhí)行此步操作if(myid==0){readData();}if(myid==0)/*由編號為0的進(jìn)程將A,B兩矩陣的行列維數(shù)M,K,N發(fā)送給所有其他進(jìn)程*/for(i=1;i<p;i++){MPI_Send(&M,1,MPI_INT,i,i,MPI_COMM_WORLD);MPI_Send(&K,1,MPI_INT,i,i,MPI_COMM_WORLD);MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD);}else/*編號非0的進(jìn)程負(fù)責(zé)接收A,B兩矩陣的行列維數(shù)M,K,N*/{MPI_Recv(&M,1,MPI_INT,0,myid,MPI_COMM_WORLD,&status);MPI_Recv(&K,1,MPI_INT,0,myid,MPI_COMM_WORLD,&status);MPI_Recv(&N,1,MPI_INT,0,myid,MPI_COMM_WORLD,&status);}p=gcd(M,N,group_size);/*m代表將矩陣按行/*m/*m代表將矩陣按行/*m代表將矩陣按列/*a[m,K]用來存儲本處理器/*b[K,n]用來存儲此時處理器n=N/p;分塊后每塊的列數(shù)*/if(myid<p){a=(float*)malloc(floatsize*m*K);擁有的矩陣A的行塊*/b=(float*)malloc(floatsize*K*n);擁有的矩陣B的列塊*/c=(float*)malloc(floatsize*m*N);/*c[m,N]用來存儲本處理器計算p-1次得到所有結(jié)果*/if(myid%2!=0)/*為標(biāo)號為奇數(shù)的處理器分配發(fā)送緩沖空間*/buffer=(float*)malloc(K*n*floatsize);if(a==NULL||b==NULL||c==NULL)/*如果分配空間出錯,則打印出錯信息*/printf("Allocatespacefora,borcfail!");if(myid==0)/*標(biāo)號為0的處理器將應(yīng)該它擁有的矩陣A,B的元素讀入自己的a,b中*/{for(i=0;i<m;i++)for(j=0;j<K;j++)a(i,j)=A(i,j);for(i=0;i<K;i++)for(j=0;j<n;j++)b(i,j)=B(i,j);}if(myid==0)/*標(biāo)號為0的處理器將其他處理器的初始數(shù)據(jù)分別發(fā)給各處理器*/{for(i=1;i<p;i++){MPI_Send(&A(m*i,0),K*m,MPI_FLOAT,i,i,MPI_COMM_WORLD);for(j=0;j<K;j++)MPI_Send(&B(j,n*i),n,MPI_FLOAT,i,i,MPI_COMM_WORLD);}free(A);free(B);/*至此,A,B兩矩陣的數(shù)據(jù)已經(jīng)完全被分散到各處理器。釋放A,B所占空間*/}else/*標(biāo)號非0的處理器從0處理器接受各自的初始矩陣數(shù)據(jù)*/{MPI_Recv(a,K*m,MPI_FLOAT,0,myid,MPI_COMM_WORLD,&status);for(j=0;j<K;j++)MPI_Recv(&b(j,0),n,MPI_FLOAT,0,myid,MPI_COMM_WORLD,&status);}if(myid==0)time1=MPI_Wtime();/*標(biāo)號為0的處理器記錄開始矩陣相乘計算的時間*/for(i=0;i<p;i++)/*一共進(jìn)行p輪計算*/{l=(i+myid)%p;for(k=0;k<m;k++)for(j=0;j<n;j++)for(c(l,k,j)=0,s=0;s<K;s++)c(l,k,j)+=a(k,s)*b(s,j);mm1=(p+myid-1)%p;/*計算本進(jìn)程的前一個進(jìn)程的標(biāo)號*/mp1=(myid+1)%p;/*計算本進(jìn)程的后一個進(jìn)程的標(biāo)號*/if(i!=p-1){if(myid%2==0)/*偶數(shù)號處理器先發(fā)送后接收*/{MPI_Send(b,K*n,MPI_FLOAT,mm1,mm1,MPI_COMM_WORLD);MPI_Recv(b,K*n,MPI_FLOAT,mp1,myid,MPI_COMM_WORLD,&status);}else/*奇數(shù)號處理器先將B的列塊存于緩沖區(qū)buffer中,然后接收編號在其后面的處理器所發(fā)送的B的列塊,最后再將緩沖區(qū)中原矩陣B的列塊發(fā)送給編號在其前面的處理器*/{for(k=0;k<K;k++)for(j=0;j<n;j++)buffer(k,j)=b(k,j);MPI_Recv(b,K*n,MPI_FLOAT,mp1,myid,MPI_COMM_WORLD,&status);MPI_Send(buffer,K*n,MPI_FLOAT,mm1,mm1,MPI_COMM_WORLD);}}}if(myid==0)/*標(biāo)號為0的進(jìn)程直接將計算結(jié)果保存到結(jié)果矩陣C中*/for(i=0;i<m;i++)for(j=0;j<N;j++)C(i,j)=*(c+i*N+j);if(myid!=0)/*標(biāo)號非0的進(jìn)程則要把計算結(jié)果發(fā)送到標(biāo)號為0的處理器中去*/MPI_Send(c,m*N,MPI_FLOAT,0,myid,MPI_COMM_WORLD);else/*標(biāo)號為0的進(jìn)程負(fù)責(zé)接收其他進(jìn)程的計算結(jié)果并保存到結(jié)果矩陣C中*/{for(k=1;k<p;k++){MPI_Recv(c,m*N,MPI_FLOAT,k,k,MPI_COMM_WORLD,&status);for(i=0;i<m;i++)for(j=0;j<N;j++)C((k*m+i),j)=*(c+i*N+j);}}if(myid==0)/*0號處理器負(fù)責(zé)將A,B,C矩陣打印輸出給用戶,并輸出用于分發(fā)數(shù)據(jù)和并行計算的時間*/printResult();}MPI_Finalize();if(myid<p)/*釋放所有臨時分配空間*/{free(a);free(b);free(c);if(myid==0)/*只有0號進(jìn)程要釋放C*/free(C);if(myid%2!=0)/*只有奇數(shù)號進(jìn)程要釋放buffer*/free(buffer);return(0);2.cannon算法#include<stdlib.h>#include<string.h>#include<mpi.h>#include<time.h>#include<stdio.h>#include<math.h>/*全局變量聲明*/float**A,**B,**C;/*總矩陣,C=A*B*/float*a,*b,*c,*tmp_a,*tmp_b;/*a、b、c表分塊,tmp_a、tmp_b表緩沖區(qū)*/intdg,dl,dl2,p,sp;/*dg:總矩陣維數(shù);dl:矩陣塊維數(shù);dl2=dl*dl;p:處理器個數(shù);sp=sqrt(p)*/intmy_rank,my_row,my_col;/*my_rank:處理器ID;(my_row,my_col):處理器邏輯陣列坐標(biāo)*/一--MPI_Statusstatus;/**函數(shù)名:get_index*功能:處理器邏輯陣列坐標(biāo)至rank號的轉(zhuǎn)換*輸入:坐標(biāo)、邏輯陣列維數(shù)*輸出:rank號*/intget_index(introw,intcol,intsp)(一return((row+sp)%sp)*sp+(col+sp)%sp;}/**函數(shù)名:random_A_B*功能:隨機(jī)生成矩陣A和B*/voidrandom_A_B(){inti,j;srand((unsignedint)time(NULL));/*設(shè)隨機(jī)數(shù)種子*//*隨機(jī)生成A,B,并初始化C*/for(i=0;i<dg;i++)for(j=0;j<dg;j++){A[i][j]=rand();B[i][j]=rand();C[i][j]=0.0;}}/*函數(shù)名:scatter_A_B*功能:rank為0一的處理器向其他處理器發(fā)送A、B矩陣的相關(guān)塊*/voidscatter_A_B(){inti,j,k,l;intp_imin,p_imax,p_jmin,p_jmax;for(k=0;k<p;k++){/*計算相應(yīng)處理器所分得的矩陣塊在總矩陣中的坐標(biāo)范圍*/p_jmin=(k%sp)*dl;p_jmax=(k%sp+1)*dl-1;p_imin=(k-(k%sp))/sp*dl;p_imax=((k-(k%sp))/sp+1)*dl-1;l=0;/*rank=0的處理器將A,B中的相應(yīng)塊拷至tmp_a,tmp_b,準(zhǔn)備向其他處理器發(fā)送*/for(i=p_imin;i<=p_imax;i++){for(j=p_jmin;j<=p_jmax;j++){tmp_a[l]=A[i][j];tmp_b[l]=B[i][j];l++;}}/*rank=0的處理器直接將自己對應(yīng)的矩陣塊從tmp_a,tmp_b拷至a,b*/if(k==0){memcpy(a,tmp_a,dl2*sizeof(float));memcpy(b,tmp_b,dl2*sizeof(float));}else/*rank=0的處理器向其他處理器發(fā)送tmp_a,tmp_b中相關(guān)的矩陣塊*/{MPI_Send(tmp_a,dl2,MPI_FLOAT,k,1,MPI_COMM_WORLD);MPI_Send(tmp_b,dl2,MPI_FLOAT,k,2,MPI_COMM_WORLD);}}}/**函數(shù)名:init_alignment*功能:矩陣A和B初始對準(zhǔn)*/voidinit_alignment(){/*將A中坐標(biāo)為(i,j)的分塊A(i,j)向左循環(huán)移動i步*/MPI_Sendrecv(a,dl2,MPI_FLOAT,get_index(my_row,my_col-my_row,sp),1,tmp_a,dl2,MPI_FLOAT,get_index(my_row,my_col+my_row,sp),1,MPI_COMM_WORLD,&status);memcpy(a,tmp_a,dl2*sizeof(float));/*將B中坐標(biāo)為(i,j)的分塊B(i,j)向上循環(huán)移動j步*/MPI_Sendrecv(b,dl2,MPI_FLOAT,get_index(my_row-my_col,my_col,sp),1,tmp_b,dl2,MPI_FLOAT,get_index(my_row+my_col,my_col,sp),1,MPI_COMM_WORLD,&status);memcpy(b,tmp_b,dl2*sizeof(float));}/**函數(shù)名:main_shift*功能:分塊矩陣左移和上移,并計算分塊c*/voidmain_shift(){inti,j,k,l;for(l=0;l<sp;l++){/*矩陣塊相乘,c+=a*b*/for(i=0;i<dl;i++)for(j=0;j<dl;j++)for(k=0;k<dl;k++)c[i*dl+j]+=a[i*dl+k]*b[k*dl+j];/*將分塊a左移1位*/MPI_Send(a,dl2,MPI_FLOAT,get_index(my_row,my_col-1,sp),1,MPI_COMM_WORLD);MPI_Recv(a,dl2,MPI_FLOAT,get_index(my_row,my_col+1,sp),1,MPI_COMM_WORLD,&status);/*將分塊b上移1位*/MPI_Send(b,dl2,MPI_FLOAT,get_index(my_row-1,my_col,sp),1,MPI_COMM_WORLD);MPI_Recv(b,dl2,MPI_FLOAT,get_index(my_row+1,my_col,sp),1,MPI_COMM_WORLD,&status);}}/**函數(shù)名:collect_c*功能:rank為j的處理器從其余處理器收集分塊矩陣c*/voidcollect_C()(一inti,j,i2,j2,k;intp_imin,p_imax,p_jmin,p_jmax;/*分塊矩陣在總矩陣中頂點邊界值*//*將rank為0的處理器中分塊矩陣c結(jié)果賦給總矩陣C對應(yīng)位置*/for(i=0;i<dl;i++)for(j=0;j<dl;j++)C[i][j]=c[i*dl+j];for(k=1;k<p;k++){/*將rank為0的處理器從其他處理器接收相應(yīng)的分塊c*/MPI_Recv(c,dl2,MPI_FLOAT,k,1,MPI_COMM_WORLD,&status);p_jmin=(k%sp)*dl;p_jmax=(k%sp+1)*dl-1;p_imin=(k-(k%sp))/sp*dl;p_imax=((k-(k%sp))/sp+1)*dl-1;i2=0;/*將接收到的c拷至C中的相應(yīng)位置,從而構(gòu)造出C*/for(i=p_imin;i<=p_imax;i++){j2=0;for(j=p_jmin;j<=p_jmax;j++){C[i][j]=c[i2*dl+j2];j2++;}i2++;}}}/*函數(shù)名:print*功能:打印矩陣*輸入:指向矩陣指針的指針,字符串*/voidprint(float**m,char*str){inti,j;printf("%s",str);/*打印矩陣m*/for(i=0;i<dg;i++){for(j=0;j<dg;j++)printf("%15.0f",m[i][j]);printf("\n");}printf("\n");}/**函數(shù)名:main*功能:主過程,Cannon算法,矩陣相乘*輸入:argc為命令行參數(shù)個數(shù),argv為每個命令行參數(shù)組成的字符串?dāng)?shù)組*/intmain(intargc,char*argv[]){inti;MPI_Init(&argc,&argv);/*啟動MPI計算*/MPI_Comm_size(MPI_COMM_WORLD,&p);/*確定處理器個數(shù)*/MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);/*確定各自的處理器標(biāo)識符*/sp=sqrt(p);/*確保處理器個數(shù)是完全平方數(shù),否則打印錯誤信息,程序退出*/if(sp*sp!=p)if(my_rank==0)printf("Numberofprocessorsi

溫馨提示

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

評論

0/150

提交評論