The examples were tested on Linux with the OpenMPI MPI implementation installed in a default location. The OpenMPI MPI implementation needs no special configuration to run the examples.
First, an example where the process with rank 0 broadcasts a Hello World message. All the remaining processes receive and display the message.
Example 7.1. Broadcast Example
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <mpi.h> int main (int iArgC, char *apArgV []) { int iRank; int iLength; char *pMessage; char acMessage [] = "Hello World !"; MPI_Init (&iArgC, &apArgV); MPI_Comm_rank (MPI_COMM_WORLD, &iRank); if (iRank == 0) { iLength = sizeof (acMessage); MPI_Bcast (&iLength, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast (acMessage, iLength, MPI_CHAR, 0, MPI_COMM_WORLD); printf ("Process 0: Message sent\n"); } else { MPI_Bcast (&iLength, 1, MPI_INT, 0, MPI_COMM_WORLD); pMessage = (char *) malloc (iLength); MPI_Bcast (pMessage, iLength, MPI_CHAR, 0, MPI_COMM_WORLD); printf ("Process %d: %s\n", iRank, pMessage); } MPI_Finalize (); return (0); }
To compile the example, store the source in a file named Broadcast.c and use the following command:
mpicc Broadcast.c -o Broadcast
To run the example, use the following command:
mpirun -np 5 Broadcast
The -np 5 command line option tells the middleware to run the example in 5 parallel processes. The output of the example should look like this:
Process 0: Message sent Process 3: Hello World ! Process 1: Hello World ! Process 2: Hello World ! Process 4: Hello World !
Next, an example where the processes perform a scan reduction with their rank as the input and multiplication as the operation and display the output. With rank 0 excluded from multiplication, the processes will in effect display a factorial of their rank.
Example 7.2. Scan Example
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <mpi.h> int main (int iArgC, char *apArgV []) { int iOutput; int iInput; int iRank; MPI_Init (&iArgC, &apArgV); MPI_Comm_rank (MPI_COMM_WORLD, &iRank); if (iRank == 0) iInput = 1; else iInput = iRank; MPI_Scan (&iInput, &iOutput, 1, MPI_INT, MPI_PROD, MPI_COMM_WORLD); printf ("Process %d: Factorial %d\n", iRank, iOutput); MPI_Finalize (); return (0); }
To compile and run the example, use similar commands as before. The output of the example should look like this:
Process 0: Factorial 1 Process 3: Factorial 6 Process 1: Factorial 1 Process 4: Factorial 24 Process 2: Factorial 2