1
1
openmpi/examples/Ring_oshmem.java

55 строки
1.6 KiB
Java
Исходник Обычный вид История

import shmem.*;
public class Ring_oshmem
{
public static void main(String[] args) throws ShMemException
{
ShMem.startPEs(0);
int nproc = ShMem.getNumPEs();
int proc = ShMem.getMyPE();
Addr rbuf = new Addr(4); // One integer value.
rbuf.putInt(-1);
int message = 10;
// Calculate the PE number of the next process in the ring. Use the
// modulus operator so that the last process "wraps around" to PE 0.
int next = (proc + 1) % nproc;
if(proc == 0)
{
System.out.println("Process 0 puts message "+ message +" to "+
next +" ("+ nproc +" processes in ring)");
rbuf.putInt(message, next);
}
// 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 PE 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(message > 0)
{
rbuf.waitUntilInt(ShMem.CMP_EQ, message);
if(proc == 0)
{
message--;
System.out.println("Process 0 decremented value: "+ message);
}
rbuf.putInt(message, next);
if(proc != 0)
message--;
}
// All done
rbuf.free();
System.out.println("Process "+ proc +" exiting");
}
}