#include "mpi.h"
#include "stdio.h"
//矩阵A是NxN的; 小矩阵A[00] 是MxM的
int m=4;
int n=32;//n必须是m的倍数(n=4*m)
//这个函数就是我们需要定义的新类型
void newType(int m,int n,MPI_Datatype* newdt)
{
int blockLen[2],indices[2];
MPI_Datatype vec,types[2];
MPI_Type_vector(m,m,n,MPI_INT,&vec);//定义小块A[mxm]
MPI_Type_commit(&vec);
//定义大块,下界是0,上界是4*(2*m*n+2*m)字节
int stride=2*m*n+2*m;
int count=2;
types[0] = vec;
types[1] = MPI_UB;
blockLen[0] = 1;
blockLen[1] = 1;
indices[0] = 0;
indices[1] = sizeof(MPI_INT)*stride;
MPI_Type_struct(count,blockLen,indices,types,newdt);
MPI_Type_commit(newdt);
}
int main(int argc,char *argv[])
{
int rank,size;
int i,j;
int A[n][n];
MPI_Datatype newdt;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
newType(m,n,&newdt);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A[i][j]=0;
if(rank==0)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A[i][j]=10*i+j;
printf("初始化A矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%4d",A[i][j]);
}
printf("\n");
}
for(i=1;i<size;i++)
{
MPI_Send(A,i,newdt,i,i,MPI_COMM_WORLD);//向进程i发送i块A[00],A[22],A[44].....
}
}
else
{
MPI_Recv(A,rank,newdt,0,rank,MPI_COMM_WORLD,&status);
sleep(rank);
printf("进程%d里面矩阵变为:\n",rank);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%4d",A[i][j]);
}
printf("\n");
}
}
MPI_Finalize();
return (0);
}
07-13
07-14
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交