Blame | Last modification | View Log | RSS feed
/******************************************************************************** prob1-pipe.c - a pipeline method to calculate a McLauran series******************************************************************************/#include <mpi.h>#include <stdio.h>#include <stdlib.h>#define TAG_DATA 0xddddint main (int argc, char *argv[]){int myid, numprocs;int *a, mya, x, n;float temp;MPI_Status status;MPI_Init (&argc, &argv);MPI_Comm_rank (MPI_COMM_WORLD, &myid);MPI_Comm_size (MPI_COMM_WORLD, &numprocs);if (myid == 0) /* root */{// allocate a// read a[i]'s// read n// read x}/* Do a sanity check.* We MUST have exactly enough processors available* to construct the pipeline. */if (numprocs != n)exit (1); // not enough processors/* Send everyone a single a value, and the x value */MPI_Scatter (a, 1, MPI_INT, &mya, 1, MPI_INT, 0, MPI_COMM_WORLD);MPI_Bcast (&x, 1, MPI_INT, 0, MPI_COMM_WORLD);if (myid == 0){/* We are the root node, so do a single calculation, and then* forward the result on down the pipeline */temp = mya * pow (x, myid);MPI_Send (&temp, 1, MPI_FLOAT, myid+1, TAG_DATA, MPI_COMM_WORLD);}else if (myid < (numprocs - 1)){/* We are in the middle of the pipeline, so recieve a value from* our neighbor to the left, do a calculation, and pass the result* to our neighbor to the right */MPI_Recv (&temp, 1, MPI_FLOAT, myid-1, TAG_DATA, MPI_COMM_WORLD, &status);temp += mya * pow (x, myid);MPI_Send (&temp, 1, MPI_FLOAT, myid+1, TAG_DATA, MPI_COMM_WORLD);}else{/* We are at the end of the pipeline, so recieve a value from* our neightbor to the left, do a calculation, and print* the final resulting value */MPI_Recv (&temp, 1, MPI_FLOAT, myid-1, TAG_DATA, MPI_COMM_WORLD, &status);temp += mya * pow (x, myid);printf ("f = %e\n", temp);}MPI_Finalize ();return 0;}