forked from open-mpi/ompi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRing_oshmem.java
54 lines (44 loc) · 1.64 KB
/
Ring_oshmem.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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");
}
}