Skip to content

Commit 124922b

Browse files
committed
Add Connectivity.java example for testing MPI process communication
This example uses the Java bindings for MPI to perform pairwise send/recv calls between processes to verify inter-process connectivity. Uses MPI.COMM_WORLD and sendRecv to avoid deadlocks. Signed-off-by: Vasista Dhyasani <vasi.dhyasani@gmail.com>
1 parent 08ac1be commit 124922b

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

examples/Connectivity.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Test the connectivity between all processes
3+
*/
4+
5+
import mpi.*;
6+
import java.nio.IntBuffer;
7+
8+
class Connectivity {
9+
public static void main(String args[]) throws MPIException {
10+
MPI.Init(args);
11+
12+
/*
13+
* MPI.COMM_WORLD is the communicator provided when MPI is
14+
* initialized. It contains all the processes that are created
15+
* upon program execution.
16+
*/
17+
int myRank = MPI.COMM_WORLD.getRank();
18+
int numProcesses = MPI.COMM_WORLD.getSize();
19+
boolean verbose = false;
20+
String processorName = MPI.getProcessorName();
21+
22+
for (String arg : args) {
23+
if (arg.equals("-v") || arg.equals("--verbose")) {
24+
verbose = true;
25+
break;
26+
}
27+
}
28+
29+
for (int i = 0; i < numProcesses; i++) {
30+
/* Find current process */
31+
if (myRank == i) {
32+
/* send to and receive from all higher ranked processes */
33+
for (int j = i + 1; j < numProcesses; j++) {
34+
if (verbose)
35+
System.out.printf("Checking connection between rank %d on %s and rank %d\n", i, processorName,
36+
j);
37+
38+
/*
39+
* rank is the Buffer passed into sendRecv to send to rank j.
40+
* rank is populated with myRank, which is the data to send off
41+
* peer is the Buffer received from rank j to current rank
42+
*/
43+
IntBuffer rank = MPI.newIntBuffer(1);
44+
IntBuffer peer = MPI.newIntBuffer(1);
45+
rank.put(0, myRank);
46+
47+
/*
48+
* To avoid deadlocks, use combined sendRecv operation.
49+
* This performs a send and recv as a combined atomic operation
50+
* and allow MPI to efficiently handle the requests internally.
51+
*/
52+
MPI.COMM_WORLD.sendRecv(rank, 1, MPI.INT, j, myRank, peer, 1, MPI.INT, j, j);
53+
}
54+
} else if (myRank > i) {
55+
IntBuffer rank = MPI.newIntBuffer(1);
56+
IntBuffer peer = MPI.newIntBuffer(1);
57+
rank.put(0, myRank);
58+
59+
/* receive from and reply to rank i */
60+
MPI.COMM_WORLD.sendRecv(rank, 1, MPI.INT, i, myRank, peer, 1, MPI.INT, i, i);
61+
}
62+
}
63+
64+
/* Wait for all processes to reach barrier before proceeding */
65+
MPI.COMM_WORLD.barrier();
66+
67+
/*
68+
* Once all ranks have reached the barrier,
69+
* have only one process print out the confirmation message.
70+
* In this case, we are having the "master" process print the message.
71+
*/
72+
if (myRank == 0) {
73+
System.out.printf("Connectivity test on %d processes PASSED.\n", numProcesses);
74+
}
75+
76+
MPI.Finalize();
77+
}
78+
}

examples/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ EXAMPLES = \
6060
ring_oshmemfh \
6161
Ring.class \
6262
connectivity_c \
63+
Connectivity.class \
6364
oshmem_shmalloc \
6465
oshmem_circular_shift \
6566
oshmem_max_reduction \

0 commit comments

Comments
 (0)