int main(int argc,char * argv[]) { int rank,size,i; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank==0) { if(!readFromFile()) exit(-1); if(size>2*variableNum) { printf("Too many Processors,reduce your -np value \n"); MPI_Abort(MPI_COMM_WORLD,1); } beginTime=MPI_Wtime(); for(int i=1;i<size;i++) { MPI_Send(&variableNum,1,MPI_INT,i,V_TAG,MPI_COMM_WORLD); MPI_Send(p,variableNum*2,MPI_DOUBLE,i,P_TAG,MPI_COMM_WORLD); } addTransTime(MPI_Wtime()-beginTime); } else { MPI_Recv(&variableNum,1,MPI_INT,0,V_TAG,MPI_COMM_WORLD,&status); MPI_Recv(p,variableNum*2,MPI_DOUBLE,0,P_TAG,MPI_COMM_WORLD,&status); } int wLength=2*variableNum; for(i=0;i<wLength;i++) { w[i].real=cos(i*2*PI/wLength); w[i].imag=sin(i*2*PI/wLength); } int everageLength=wLength/size; int moreLength=wLength%size; int startPos=moreLength+rank*everageLength; int stopPos=startPos+everageLength-1; if(rank==0) { startPos=0; stopPos=moreLength+everageLength-1; } evaluate(p,0,variableNum-1,w,s,startPos,stopPos,wLength); if(rank>0) { MPI_Send(s+startPos,everageLength*2,MPI_DOUBLE,0,S_TAG,MPI_COMM_WORLD); MPI_Recv(s,wLength*2,MPI_DOUBLE,0,S_TAG2,MPI_COMM_WORLD,&status); } else { double tempTime=MPI_Wtime(); for(i=1;i<size;i++) { MPI_Recv(s+moreLength+i*everageLength,everageLength*2,MPI_DOUBLE,i,S_TAG,MPI_COMM_WORLD,&status); } for(i=1;i<size;i++) { MPI_Send(s,wLength*2,MPI_DOUBLE,i,S_TAG2,MPI_COMM_WORLD); } printf("The final results :\n"); printres(s,wLength); addTransTime(MPI_Wtime()-tempTime); } if(rank==0) { totalTime=MPI_Wtime(); totalTime-=beginTime; printf("\nUse prossor size=%d\n",size); printf("Total running time=%f(s)\n",totalTime); printf("Distribute data time = %f(s)\n",transTime); printf("Parallel compute time = %f(s)\n ",totalTime-transTime); } MPI_Finalize(); return 0; }
int main(int argc,char * argv[]) { int rank,size,i; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); // 分发数据 if(rank==0) { // 0# 进程从文件读入多项式p的阶数和系数序列 if(!readFromFile()) exit(-1); // 进程数目太多,造成每个进程平均分配不到一个元素,异常退出 if(size>2*variableNum) { printf("Too many Processors,reduce your -np value \n"); MPI_Abort(MPI_COMM_WORLD,1); } beginTime=MPI_Wtime(); // 0#进程把多项式的阶数,p发送给其它进程 sendOrigData(size); // 累计传输时间 addTransTime(MPI_Wtime()-beginTime); } else // 其它进程接收进程0发送来的数据,包括variableNum、数组p { recvOrigData(); } // 初始化数组w,用于进行傅立叶变换 int wLength=2*variableNum; for(i=0;i<wLength;i++) { w[i].r=cos(i*2*PI/wLength); w[i].i=sin(i*2*PI/wLength); } // 划分各个进程的工作范围 startPos ~ stopPos int everageLength=wLength/size; // 8/2=4 (假设有两个进程) int moreLength=wLength%size; // 8%2=0 int startPos=moreLength+rank*everageLength; // 0+0*4=0; 0+1*4=4; int stopPos=startPos+everageLength-1; // 0+4-1=3; 4+4-1=7; //[0,1,2,3,4,5,6,7], 片段: [0,3], [4,7] if(rank==0) { startPos=0; // 0 stopPos=moreLength+everageLength-1; // 0+4-1=3 } // 对p作FFT,输出序列为s,每个进程仅负责计算出序列中位置为 startPos 到 stopPos 的元素 evaluate(p,0,variableNum-1,w,s,startPos,stopPos,wLength); // p 原始序列 // 0 原始序列在数组f中的第一个下标 // variableNum-1 原始序列在数组f中的最后一个下标 // w 存放单位根的数组,其元素为w,w^2,w^3... // s 输出序列 // startPos 所负责计算输出的y的片断的起始下标 // stopPos 所负责计算输出的y的片断的终止下标 // wLength s的长度 printf("partial results, process %d.\n",rank); myprint(s,wLength); // 输出每个进程的结果(部分结果) // 各个进程都把s中自己负责计算出来的部分发送给进程0,并从进程0接收汇总的s if(rank>0) { MPI_Send(s+startPos,everageLength*2,MPI_DOUBLE,0,S_TAG,MPI_COMM_WORLD); MPI_Recv(s,wLength*2,MPI_DOUBLE,0,S_TAG2,MPI_COMM_WORLD,&status); } else // 进程0接收s片段,向其余进程发送完整的s { double tempTime=MPI_Wtime(); // 进程0接收s片段 for(i=1;i<size;i++) { MPI_Recv(s+moreLength+i*everageLength,everageLength*2,MPI_DOUBLE,i,S_TAG,MPI_COMM_WORLD,&status); } //进程0向其余进程发送完整的结果s for(i=1;i<size;i++) { MPI_Send(s,wLength*2,MPI_DOUBLE,i,S_TAG2,MPI_COMM_WORLD); } printf("The final results :\n"); printres(s,wLength); //结果占s一半空间 addTransTime(MPI_Wtime()-tempTime); } if(rank==0) { totalTime=MPI_Wtime(); totalTime-=beginTime; printf("\nUse prossor size=%d\n",size); printf("Total running time=%f(s)\n",totalTime); printf("Distribute data time = %f(s)\n",transTime); printf("Parallel compute time = %f(s)\n ",totalTime-transTime); } MPI_Finalize(); }