}
int p=sqrt(nodeNum);
/*************计算local A B行列数*************************/
int localHighA=matrixHighA/p;
int localLenA=matrixLenA/p;
int localHighB=matrixHighB/p;
int localLenB=matrixLenB/p;
int i;
int j;
int k;
int l;
int * A=(int *)malloc(localLenA*localHighA*sizeof(int));
RandomMatrix(A,localHighA*localLenA);
int * B=(int *)malloc(localLenB*localHighB*sizeof(int));
RandomMatrix(B,localHighB*localLenB);
int * C=(int *)malloc(localHighA*localLenB*sizeof(int));
for(i=0;i
/* printf("%d local A:\n",rank);
PrintMatrixForVector(A,localHighA,localLenA);
printf("%d local B:\n",rank);
PrintMatrixForVector(B,localHighB,localLenB);*/
int myRow=rank/p;//计算当前节点在mesh中的行列值
int myCol=rank%p;
//将数据发送到0号进程收集显示
MPI_Send(A,localHighA*localLenA,MPI_INT,0,rank+100,MPI_COMM_WORLD);
MPI_Send(B,localHighB*localLenB,MPI_INT,0,rank+200,MPI_COMM_WORLD);
if(rank==0)
{
int **matrixA=(int **)malloc(matrixHighA*sizeof(int *));
for (i=0;i
int **matrixB=(int **)malloc(matrixHighB*sizeof(int *));
for (i=0;i
for(i=0;i
int *receiveBTemp=(int *)malloc(localLenB*localHighB*sizeof(int));
MPI_Recv(receiveATemp,localHighA*localLenA,MPI_INT,i,i+100,MPI_COMM_WORLD,&status);
MPI_Recv(receiveBTemp,localHighB*localLenB,MPI_INT,i,i+200,MPI_COMM_WORLD,&status);
l=0;
for(j=0;j
matrixA[j+(int)(i/p)*localHighA][k+(int)(i%p)*localLenA]=receiveATemp[l++];
}
l=0;
for(j=0;j
matrixB[j+(int)(i/p)*localHighB][k+(int)(i%p)*localLenB]=receiveBTemp[l++];
}
free(receiveATemp);
free(receiveBTemp);
}
printf("A:\n");
PrintMatrix(matrixA,matrixHighA,matrixLenA);
printf("B:\n");
PrintMatrix(matrixB,matrixHighB,matrixLenB);
for (i=0;i
for (i=0;i
free(matrixA);
free(matrixB);
}
for(i=0;i {
// if(myCol!=i)
{
MPI_Send(A,localHighA*localLenA,MPI_INT,myRow*p+i,1,MPI_COMM_WORLD);
MPI_Send(B,localHighB*localLenB,MPI_INT,myRow*p+i,2,MPI_COMM_WORLD);
}
// if(myRow!=i)
{
MPI_Send(A,localHighA*localLenA,MPI_INT,i*p+myCol,1,MPI_COMM_WORLD);
MPI_Send(B,localHighB*localLenB,MPI_INT,i*p+myCol,2,MPI_COMM_WORLD);
}
}
int *receiveA=(int *)malloc(localLenA*localHighA*sizeof(int));
int *receiveB=(int *)malloc(localLenB*localHighB*sizeof(int));
int *resultC= (int *)malloc(localHighA*localLenB*siz