#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);
}
第二题
最新推荐文章于 2022-09-17 21:36:01 发布