MPI 实现 SUMMA 矩阵乘法(三)

2014-11-24 09:11:26 · 作者: · 浏览: 3
eof(int));
for(i=0;i
/*********************计算矩阵的值*****************************/
for(i=0;i {
MPI_Recv(receiveA,localHighA*localLenA,MPI_INT,myRow*p+i,1,MPI_COMM_WORLD,&status);
MPI_Recv(receiveB,localHighB*localLenB,MPI_INT,i*p+myCol,2,MPI_COMM_WORLD,&status);


MatrixMultiply(receiveA,receiveB,resultC,localHighA,localLenA,localLenB);


/* if(rank==0)
{
printf("%d A:\n",i);
PrintMatrixForVector(receiveA,localHighA,localLenA);
printf("%d B:\n",i);
PrintMatrixForVector(receiveB,localHighB,localLenB);
printf("%d C:\n",i);
PrintMatrixForVector(resultC,localHighA,localLenB);

}*/
MatrixAdd(C,resultC,localHighA,localLenB);


}

MPI_Send(C,localHighA*localLenB,MPI_INT,0,rank+400,MPI_COMM_WORLD);//将局部结果C发送至0号收集

if(rank==0)//收集数据并且在后面显示
{


int **matrixC=(int **)malloc(matrixHighA*sizeof(int *));
for (i=0;i matrixC[i]=(int *)malloc(matrixLenB*sizeof(int));

for(i=0;i {

int *receiveCTemp=(int *)malloc(localLenB*localHighA*sizeof(int));

MPI_Recv(receiveCTemp,localHighA*localLenB,MPI_INT,i,i+400,MPI_COMM_WORLD,&status);

l=0;
for(j=0;j for(k=0;k {
matrixC[j+(int)(i/p)*localHighA][k+(int)(i%p)*localLenB]=receiveCTemp[l++];
}


free(receiveCTemp);



}

printf("C:\n");
PrintMatrix(matrixC,matrixHighA,matrixLenB);





}



MPI_Finalize();


return 0;







}

编译 mpicc -o summa summa.c -lm
运行(需要指定处理节点的个数一般为可开方整数)

mpirun -np 处理器个数 ./summa 处理器个数 A行数 A列数 B列数

例如运行

结果如下