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
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
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列数
例如运行
结果如下
