#include #include #include /* Prototype */ float integral(float ai, float h, int n); int main(int argc, char* argv[]) { /*############################################################################### # # # This is an MPI example on parallel integration to demonstrate the use of: # # # # * MPI_Init, MPI_Comm_rank, MPI_Comm_size, MPI_Finalize # # * MPI_Recv, MPI_Send # # # # Dr. Kadin Tseng # # Scientific Computing and Visualization # # Boston University # # 1998 # # # ###############################################################################*/ int n, p, myid, tag, proc, ierr; float h, integral_sum, a, b, ai, pi, my_int; int master = 0; /* processor performing total sum */ MPI_Comm comm; MPI_Status status; comm = MPI_COMM_WORLD; ierr = MPI_Init(&argc,&argv); /* starts MPI */ MPI_Comm_rank(comm, &myid); /* get current process id */ MPI_Comm_size(comm, &p); /* get number of processes */ pi = acos(-1.0); /* = 3.14159... */ a = 0.; /* lower limit of integration */ b = pi*1./2.; /* upper limit of integration */ n = 500; /* number of increment within each process */ tag = 123; /* set the tag to identify this particular job */ h = (b-a)/n/p; /* length of increment */ ai = a + myid*n*h; /* lower limit of integration for partition myid */ my_int = integral(ai, h, n); /* 0<=myid<=p-1 */ printf("Process %d has the partial integral of %f\n", myid,my_int); MPI_Send( &my_int, 1, MPI_FLOAT, master, /* message destination */ tag, /* message tag */ comm); if(myid == master) { /* Receives serialized */ integral_sum = 0.0; for (proc=0;proc