Process 0 of 10 is on server150 Process 1 of 10 is on server150 Process 4 of 10 is on server140 Process 5 of 10 is on server140 Process 6 of 10 is on server143 Process 7 of 10 is on server143 Process 8 of 10 is on server130 Process 9 of 10 is on server130 Process 2 of 10 is on server151 Process 3 of 10 is on server151 pi is approximately 3.1415926544231256, Error is 0.0000000008333325 wall clock time = 0.018768
两个demo程序(windows下的程序)
#include "mpi.h"
#include
int main(int argc, char* argv[])
{
int rank;
int size;
MPI_Init(0,0);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
std::cout<
MPI_Finalize();
return 0;
}
编译: mpicxx -o test_mpi test_mpi.cpp
执行:mpirun -n 2 ./test_mpi
2.计算矩阵和
#include "mpi.h" #include #include int main(int argc, char* argv[]) { using namespace std; int rank; int size; MPI_Status Status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); const int MAXX=8; const int MAXY=3; const int MAXPROCESSOR=64; float Data[MAXX][MAXX]; int ArraySize[2]; int i,j,k; if (rank == 0) { ifstream in("input.txt"); in>>ArraySize[0]>>ArraySize[1]; for (i=1; i<=ArraySize[0]; i++ ) { for (j=1; j<=ArraySize[1]; j++) { in>>Data[i][j]; } } } MPI_Bcast(ArraySize,2,MPI_INT,0,MPI_COMM_WORLD); int AverageLineNumber,HeavyProcessorNumber,MyLineNumber; int CurrentLine,StartLine,SendSize; float SendArray[MAXX*MAXY]; AverageLineNumber=ArraySize[0] / size; HeavyProcessorNumber=ArraySize[0] % size; if (rank < HeavyProcessorNumber) { MyLineNumber=AverageLineNumber+1; } else { MyLineNumber=AverageLineNumber; } if (rank == 0) { CurrentLine=ArraySize[0]; for (i=size-1; i >= 0; i--) { SendSize=0; if (i < HeavyProcessorNumber) StartLine=CurrentLine-AverageLineNumber; else StartLine=CurrentLine-AverageLineNumber+1; for (j=StartLine; j <= CurrentLine; j++) for (k=1; k <= ArraySize[1]; k++) SendArray[SendSize++]=Data[j][k]; if (i != 0) MPI_Send(SendArray,SendSize, MPI_FLOAT,i,10,MPI_COMM_WORLD); CurrentLine=StartLine-1; } } else { MPI_Recv(SendArray,MyLineNumber*ArraySize[1], MPI_FLOAT,0,10,MPI_COMM_WORLD,&Status); } float *Sum=new(float); *Sum=0; for (i=0; i < MyLineNumber*ArraySize[1]; i++) *Sum+=SendArray[i]; float AllSum[MAXPROCESSOR]; std::cout << "rank:" << rank << " cal sum is " << *Sum << std::endl; MPI_Gather(Sum,1,MPI_FLOAT,AllSum,1,MPI_FLOAT,0,MPI_COMM_WORLD); if (rank == 0) { *Sum=0; for (i=0; i < size; i++) *Sum+=AllSum[i]; cout<