openmpi/examples/Ring.java

76 lines
2.0 KiB
Java

/*
* Copyright (c) 2011 Cisco Systems, Inc. All rights reserved.
*
* Simple ring test program
*/
import mpi.* ;
class Ring {
static public void main(String[] args) throws MPIException {
MPI.Init(args) ;
int source; // Rank of sender
int dest; // Rank of receiver
int tag=50; // Tag for messages
int next;
int prev;
int message[] = new int [1];
int myrank = MPI.COMM_WORLD.getRank() ;
int size = MPI.COMM_WORLD.getSize() ;
/* Calculate the rank of the next process in the ring. Use the
modulus operator so that the last process "wraps around" to
rank zero. */
next = (myrank + 1) % size;
prev = (myrank + size - 1) % size;
/* If we are the "manager" process (i.e., MPI_COMM_WORLD rank 0),
put the number of times to go around the ring in the
message. */
if (0 == myrank) {
message[0] = 10;
System.out.println("Process 0 sending " + message[0] + " to rank " + next + " (" + size + " processes in ring)");
MPI.COMM_WORLD.send(message, 1, MPI.INT, next, tag);
}
/* Pass the message around the ring. The exit mechanism works as
follows: the message (a positive integer) is passed around the
ring. Each time it passes rank 0, it is decremented. When
each processes receives a message containing a 0 value, it
passes the message on to the next process and then quits. By
passing the 0 message first, every process gets the 0 message
and can quit normally. */
while (true) {
MPI.COMM_WORLD.recv(message, 1, MPI.INT, prev, tag);
if (0 == myrank) {
--message[0];
System.out.println("Process 0 decremented value: " + message[0]);
}
MPI.COMM_WORLD.send(message, 1, MPI.INT, next, tag);
if (0 == message[0]) {
System.out.println("Process " + myrank + " exiting");
break;
}
}
/* The last process does one extra send to process 0, which needs
to be received before the program can exit */
if (0 == myrank) {
MPI.COMM_WORLD.recv(message, 1, MPI.INT, prev, tag);
}
MPI.Finalize();
}
}