正在加载图片...
printf("nn"); printf("oUtput of result") se MPI Recv(am*size, MPI FLOAT, 件0号处理器将sie广播给所有处理器 k MPI COMM WORld MPI Bcast(&size, 1, MPI INT,O, &status ); MPI COMM WORLD) MPI Recv(b, m, MPI FLOAT, O, my_ rank, maize/p if (size%p!=0)m++; MPI COMM WORLD, &status); v=(float ")malloc( floatsize* size) 所有处理器并行地对主对角元素右边的数 um(float")malloc(floatsize"m) 据求和* if(aF=NULL b==NULLIV=NULL r(i=0;1<m;计+) printf("allocate space fail! ) if(my rank==0 sum[j=0.0, for(F0 j<size j++) for(F0 i <size: 1++) if ((my rank*m+i) sumO=sum 0+a(ij*v0: 陴初始解向量ⅴ被广播给所有处理器* MPI Bcast(v, size, MPI FLOAT,O, MPI COMM WORLD) iteration 0号处理器采用行块划分将矩阵A划分为大 小为m*sie的p块子矩阵,将B划分为 for(F0 j<size j++) 大小为m的p块子向量,依次发送给1 至p-1号处理器* f (my rank==0 编号为q的处理器负责计算解向 量并广播给所有处理器* if(my for(=0; j<size: j++) a(lfA(1j; temp=v(my rank*m+r) for(F0, i<r; i++ b(l=B(), sum[r=sum[rl+ a(r,my rank"m+i)* v( my rank’m+i; MPI Send(&(a(m*,0)), m*size, /计算出的解向量考 MPI FLOATLI (my rank'mtrF MPI COMM WORLD) MPI Send&(B(m·)m, a(r, my_ rank*m +r); MPI FLOAT. LI if(fabs( v(my rank*m+r) MPI COMM WORLD) temp<e) Iteration++ free(A); free(B); free(V) 广播解向量*printf("\n\n"); printf("\nOutput of result\n"); } /*0 号处理器将 size 广播给所有处理器*/ MPI_Bcast(&size,1,MPI_INT,0, MPI_COMM_WORLD); m=size/p;if (size%p!=0) m++; v=(float *)malloc(floatsize*size); a=(float *)malloc(floatsize*m*size); b=(float *)malloc(floatsize*m); sum=(float *)malloc(floatsize*m); if (a==NULL||b==NULL||v==NULL) printf("allocate space fail!"); if (my_rank==0) { for(i=0;i<size;i++) v(i)=V(i); } /*初始解向量 v 被广播给所有处理器*/ MPI_Bcast(v,size,MPI_FLOAT,0, MPI_COMM_WORLD); /*0号处理器采用行块划分将矩阵 A 划分为大 小为 m*size 的 p 块子矩阵,将 B 划分为 大小为 m 的 p 块子向量,依次发送给 1 至 p-1 号处理器*/ if (my_rank==0) { for(i=0;i<m;i++) for(j=0;j<size;j++) a(i,j)=A(i,j); for(i=0;i<m;i++) b(i)=B(i); for(i=1;i<p;i++) { MPI_Send(&(A(m*i,0)), m*size, MPI_FLOAT,i,i, MPI_COMM_WORLD); MPI_Send(&(B(m*i)),m, MPI_FLOAT,i,i, MPI_COMM_WORLD); } free(A); free(B); free(V); } else { MPI_Recv(a,m*size,MPI_FLOAT, 0,my_rank,MPI_COMM_WORLD, &status); MPI_Recv(b,m,MPI_FLOAT,0,my_rank, MPI_COMM_WORLD,&status); } /*所有处理器并行地对主对角元素右边的数 据求和*/ for(i=0;i<m;i++) { sum[i]=0.0; for(j=0;j<size;j++) if (j>(my_rank*m+i)) sum[i]=sum[i]+a(i,j)*v(j); } while (total<size) { iteration=0; total=0; for(j=0;j<size;j++) { r=j%m; q=j/m; /*编号为 q 的处理器负责计算解向 量并广播给所有处理器*/ if (my_rank==q) { temp=v(my_rank*m+r); for(i=0;i<r;i++) sum[r]=sum[r]+ a(r,my_rank*m+i)* v(my_rank*m+i); /*计算出的解向量*/ v(my_rank*m+r)= (b(r)-sum[r])/ a(r,my_rank*m +r); if (fabs(v(my_rank*m+r) -temp)<E) iteration++; /*广播解向量*/
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有