-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathArrSum.java
79 lines (67 loc) · 2.06 KB
/
ArrSum.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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import mpi.MPI;
import java.util.Scanner;
import mpi.*;
public class ArrSum {
public static void main(String[] args) throws Exception{
MPI.Init(args);
int rank = MPI.COMM_WORLD.Rank();
int size = MPI.COMM_WORLD.Size();
int unitsize = 5;
int root = 0;
int send_buffer[] = null;
// 1 process is expected to handle 4 elements
send_buffer = new int [unitsize * size];
int recieve_buffer[] = new int [unitsize];
int new_recieve_buffer[] = new int [size];
// Set data for distribution
if(rank == root) {
int total_elements = unitsize * size;
System.out.println("Enter " + total_elements + " elements");
for(int i = 0; i < total_elements; i++) {
System.out.println("Element " + i + "\t = " + i);
send_buffer[i] = i;
}
}
// Scatter data to processes
MPI.COMM_WORLD.Scatter(
send_buffer,
0,
unitsize,
MPI.INT,
recieve_buffer,
0,
unitsize,
MPI.INT,
root
);
// Calculate sum at non root processes
// Store result in first index of array
for(int i = 1; i < unitsize; i++) {
recieve_buffer[0] += recieve_buffer[i];
}
System.out.println(
"Intermediate sum at process " + rank + " is " + recieve_buffer[0]
);
// Gather data from processes
MPI.COMM_WORLD.Gather(
recieve_buffer,
0,
1,
MPI.INT,
new_recieve_buffer,
0,
1,
MPI.INT,
root
);
// Aggregate output from all non root processes
if(rank == root) {
int total_sum = 0;
for(int i = 0; i < size; i++) {
total_sum += new_recieve_buffer[i];
}
System.out.println("Final sum : " + total_sum);
}
MPI.Finalize();
}
}