/* ring.c Copyright 1998, 1999 Sandia National Laboratories */
#include <stdio.h>
#include "mpi.h"
#define TIMES_AROUND 1000
int main (int argc, char* argv[])
{
int my_node, num_nodes, other;
int left_nbr, right_nbr;
int ierr;
int i;
int token; /* pass this token around the ring of available
processes; each time it's received, it's
incremented */
MPI_Status status;
ierr = MPI_Init(&argc, &argv);
if (ierr != MPI_SUCCESS) {
printf("MPI initialization error\n");
}
MPI_Comm_size(MPI_COMM_WORLD, &num_nodes);
MPI_Comm_rank(MPI_COMM_WORLD, &my_node);
printf("process %d: number of processes= %d\n", my_node, num_nodes);
left_nbr = (my_node + num_nodes - 1) % num_nodes;
right_nbr = (my_node + 1 ) % num_nodes;
if (my_node == 0) { /* get things started */
token = 0;
for (i=0; i<TIMES_AROUND; i++) {
MPI_Send(&token, 1, MPI_INT, right_nbr, 0, MPI_COMM_WORLD);
MPI_Recv(&token, 1, MPI_INT, left_nbr, 0, MPI_COMM_WORLD, &status);
token++;
}
if (token == num_nodes*TIMES_AROUND) {
printf("token= %d, matches TIMES_AROUND*num_nodes (things look ok).\n", token);
}
else {
printf("error: value of token (%d) does not match TIMES_AROUND*num_nodes (%d)!\n", token, num_nodes);
}
}
else { /* swing your partner, yee-hah */
for (i=0; i<TIMES_AROUND; i++) {
MPI_Recv(&token, 1, MPI_INT, left_nbr, 0, MPI_COMM_WORLD, &status);
token++;
MPI_Send(&token, 1, MPI_INT, right_nbr, 0, MPI_COMM_WORLD);
}
}
return 0;
}