Pages

Tuesday, March 17, 2009

Finally Learned MPI

I have used several codes that use MPI but not written one from scratch. I have only added to codes others have done the MPI work for. To be honest, I had a hard time reading the online documentation. However, a post doc showed me a code (below) that opened opened my eyes to what is going on. I am posting it in case it could be of some help to others:

To compile run:
mpicc testmpi.c

To run type:
mpirun -np 4 ./a.out

The trick is to understand each of the 4 processors runs the whole code but is assigned a rank. As you can see in the for loop and print statement, a conditional on rank causes the processor to know which code is "its" job. First you have to Init and assign a rank and size which comes from the -np 4 passed above. The MPI_Barrier command pauses the program until all the processors have caught up with the others, and the MPI_Reduce command takes all the values each processor has computed and feeds them back to the master processor. As you can see I am taking each sum and "MPI_SUM"ing them together as "MPI_DOUBLE"s and feeding my master processor "0" the sum into the value Sum.

I then make the master processor print the total Sum.

#include < stdio.h >
#include "mpi.h"

int main(int argc, char** argv)
{
int rank, size;
int i;
double sum=0, Sum;

MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

for (i = rank*1000/size; i < (rank + 1)*1000/size; i++) {
sum += 1.0;
}
printf("%d gets sum = %g\n",rank,sum);

MPI_Barrier(MPI_COMM_WORLD);
MPI_Reduce(& sum,&Sum,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);

if (rank == 0)
printf("Total sum %g\n!",Sum);

MPI_Finalize();
}

No comments:

Post a Comment

To add a link to text:
<a href="URL">Text</a>