Sample C code:
/************************* initializations ***************************
* Find out how many tasks are in this partition and what my task id
is. Then
* define the number of worker tasks and the array partition size as
chunksize.
* Note: For this example, the MP_PROCS environment variable should
be set
* to an odd number...to insure even distribution of the array to numtasks-1
* worker tasks.
******************************************************************/
rc = MPI_Init(&argc,&argv);
rc|= MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
rc|= MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
if (rc != MPI_SUCCESS)
printf ("error initializing MPI and
obtaining task ID information\n");
else
printf ("MPI task ID = %d\n", taskid);
printf("%d tasks, I am task %d\n", numtasks, taskid);
numworkers = numtasks-1;
chunksize = (ARRAYSIZE / numworkers);
/**************************** master task ***************************/
if (taskid == MASTER)
{
printf("\n*********** Starting MPI Example
1 ************\n");
printf("MASTER: number of worker tasks
will be= %d\n",numworkers);
fflush(stdout);
/* Initialize the array */
for(i=0; i<ARRAYSIZE; i++)
data[i] = 0.0;
index = 0;
/* Send each worker task its portion
of the array */
for (dest=1; dest<= numworkers; dest++)
{
printf("Sending to
worker task %d\n",dest);
fflush(stdout);
MPI_Send(&index,
1, MPI_INT, dest, indexmsg, MPI_COMM_WORLD);
MPI_Send(&data[index],
chunksize, MPI_FLOAT, dest, arraymsg, MPI_COMM_WORLD);
index = index + chunksize;
}
/* Now wait to receive back the results
from each worker task and print */
/* a few sample values */
for (i=1; i<= numworkers; i++)
{
source = i;
MPI_Recv(&index,
1, MPI_INT, source, indexmsg, MPI_COMM_WORLD, &status);
MPI_Recv(&result[index],
chunksize, MPI_FLOAT, source, arraymsg, MPI_COMM_WORLD, &status);
printf("---------------------------------------------------\n");
printf("MASTER: Sample
results from worker task = %d\n",source);
printf("
result[%d]=%f\n", index, result[index]);
printf("
result[%d]=%f\n", index+100, result[index+100]);
printf("
result[%d]=%f\n\n", index+1000, result[index+1000]);
fflush(stdout);
}
printf("MASTER: All Done! \n");
}
/**************************** worker task ****************************/
if (taskid > MASTER)
{
/* Receive my portion of array from
the master task */
source = MASTER;
MPI_Recv(&index, 1, MPI_INT, source,
indexmsg, MPI_COMM_WORLD, &status);
MPI_Recv(&result[index], chunksize,
MPI_FLOAT, source, arraymsg, MPI_COMM_WORLD, &status);
/* Do a simple value assignment to each
of my array elements */
for(i=index; i < index + chunksize;
i++)
result[i] = i + 1;
/* Send my results back to the master
task */
dest = MASTER;
MPI_Send(&index, 1, MPI_INT, dest,
indexmsg, MPI_COMM_WORLD);
MPI_Send(&result[index], chunksize,
MPI_FLOAT, MASTER, arraymsg, MPI_COMM_WORLD);
}
MPI_Finalize();
}