MPI 实现 SUMMA 矩阵乘法(二)

2014-11-24 09:11:26 · 作者: · 浏览: 2
]);

}






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 matrixA[i]=(int *)malloc(matrixLenA*sizeof(int));

int **matrixB=(int **)malloc(matrixHighB*sizeof(int *));
for (i=0;i matrixB[i]=(int *)malloc(matrixLenB*sizeof(int));
for(i=0;i {
int *receiveATemp=(int *)malloc(localLenA*localHighA*sizeof(int));
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 for(k=0;k {
matrixA[j+(int)(i/p)*localHighA][k+(int)(i%p)*localLenA]=receiveATemp[l++];
}


l=0;
for(j=0;j for(k=0;k {
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 free(matrixA[i]);
for (i=0;i free(matrixB[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