-
Notifications
You must be signed in to change notification settings - Fork 0
/
mpi_graph_create.c
51 lines (43 loc) · 1.65 KB
/
mpi_graph_create.c
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
#include <mpi.h>
int MPIX_GRAPH_CREATE(MPI_Comm comm_old,
int nnodes, const int index[], const int edges[],
int reorder, MPI_Comm *comm_graph) {
int retVal = MPI_SUCCESS;
int myRank;
MPI_Comm_rank(comm_old, &myRank);
int base = myRank ? index[myRank-1] : 0;
// first, look for others in my edges
int outdegree = myRank ? index[myRank]-index[myRank-1] : index[myRank];
int destinations[outdegree];
int destweights[outdegree];
for (int i=0;i<outdegree;++i) {
destinations[i] = edges[base+i];
destweights[i] = 0;
}
// Direction of edges is an arbitrary choice.
// For neighbourhood collectives to be legal,
// the adjacency matrix must be symmetric and
// this must produce the same answer as above
// but it takes longer and it is more complex
// next, look for me in others' edges
int indegree = 0, otherRank = 0;
int sources[index[nnodes-1]];
int sourceweights[index[nnodes-1]];
for (int i=0;i<index[nnodes-1];++i) {
if (edges[i]!=myRank) continue;
++indegree;
while (index[otherRank]-1<i) ++otherRank;
sources[indegree] = otherRank;
sourceweights[indegree] = 0;
}
// optional: create a custom info key & value
// for later identification by this extension
MPI_Info info;
MPI_Info_create(&info);
MPI_Info_set(info, "MPIX_TOPOL_TYPE", "GRAPH");
retVal = MPI_Dist_graph_create_adjacent(comm_old,
indegree, sources, sourceweights,
outdegree, destinations, destweights,
info, reorder, comm_graph);
return retVal;
}