This source file includes following definitions.
- ompi_netpatterns_setup_multinomial_tree
1
2
3
4
5
6
7
8
9
10
11
12 #include "ompi_config.h"
13 #ifdef HAVE_UNISTD_H
14 #include <unistd.h>
15 #endif
16 #include <sys/types.h>
17 #ifdef HAVE_SYS_MMAN_H
18 #include <sys/mman.h>
19 #endif
20 #include <fcntl.h>
21 #include <stdlib.h>
22
23 #include "ompi/constants.h"
24 #include "netpatterns.h"
25
26
27
28
29
30 OMPI_DECLSPEC int ompi_netpatterns_setup_multinomial_tree(int tree_order, int num_nodes,
31 netpatterns_tree_node_t *tree_nodes)
32 {
33
34 int i,result;
35 int cnt, n_nodes_in_this_level,node_index;
36 int n_cum_nodes,current_level,node,n_nodes_prev_level,rank,parent_rank;
37 int n_nodes_in_last_level,n_full_stripes,n_in_partial_stipe,n_children;
38 int n_lvls_in_tree;
39
40
41 if( 1 >= tree_order ) {
42 goto Error;
43 }
44
45
46
47
48 n_lvls_in_tree=0;
49 result=num_nodes;
50
51 cnt=1;
52
53 while( 0 < result ) {
54 result-=cnt;
55 cnt*=tree_order;
56 n_lvls_in_tree++;
57 };
58
59
60 n_nodes_in_this_level=1;
61 node_index=-1;
62 n_cum_nodes=0;
63 for( current_level = 0 ; current_level < n_lvls_in_tree ; current_level++) {
64
65
66 for ( node=0 ; node < n_nodes_in_this_level ; node++ ) {
67
68 node_index++;
69
70
71 if( node_index == num_nodes) {
72 break;
73 }
74
75 tree_nodes[node_index].my_rank=node_index;
76 tree_nodes[node_index].children_ranks=NULL;
77
78
79
80
81 if( 0 == current_level ) {
82 tree_nodes[node_index].n_parents=0;
83
84 tree_nodes[node_index].parent_rank=-1;
85 } else {
86 tree_nodes[node_index].n_parents=1;
87
88 n_nodes_prev_level=n_nodes_in_this_level/tree_order;
89 if( current_level == n_lvls_in_tree -1 ) {
90
91 parent_rank=node-
92 (node/n_nodes_prev_level)*n_nodes_prev_level;
93 parent_rank=n_cum_nodes-n_nodes_prev_level+
94 parent_rank;
95 tree_nodes[node_index].parent_rank=parent_rank;
96 } else {
97 tree_nodes[node_index].parent_rank=
98 (n_cum_nodes-n_nodes_prev_level)+node/tree_order;
99 }
100 }
101
102
103
104
105
106
107 if( (n_lvls_in_tree-1) == current_level ) {
108
109 tree_nodes[node_index].n_children=0;
110 tree_nodes[node_index].children_ranks=NULL;
111 } else {
112
113 if( (n_lvls_in_tree-2) == current_level ) {
114
115 n_nodes_in_last_level=num_nodes-
116 (n_cum_nodes+n_nodes_in_this_level);
117 n_full_stripes=n_nodes_in_last_level/n_nodes_in_this_level;
118 n_in_partial_stipe=n_nodes_in_last_level-
119 n_full_stripes*n_nodes_in_this_level;
120 n_children=n_full_stripes;
121 if( n_full_stripes < tree_order ) {
122 if( node <= n_in_partial_stipe-1 ) {
123 n_children++;
124 }
125 }
126 tree_nodes[node_index].n_children=n_children;
127 if( 0 < n_children ) {
128 tree_nodes[node_index].children_ranks=(int *)
129 malloc(sizeof(int)*n_children);
130 if( NULL == tree_nodes[node_index].children_ranks) {
131 goto Error;
132 }
133 } else {
134 tree_nodes[node_index].children_ranks=NULL;
135 }
136
137 for( rank=0 ; rank < n_children ; rank++ ) {
138 tree_nodes[node_index].children_ranks[rank]=
139 node+rank*n_nodes_in_this_level;
140 tree_nodes[node_index].children_ranks[rank]+=
141 (n_cum_nodes+n_nodes_in_this_level);
142 }
143 } else {
144 n_children=tree_order;
145 tree_nodes[node_index].n_children=tree_order;
146 tree_nodes[node_index].children_ranks=(int *)
147 malloc(sizeof(int)*n_children);
148 if( NULL == tree_nodes[node_index].children_ranks) {
149 goto Error;
150 }
151 for( rank=0 ; rank < n_children ; rank++ ) {
152 tree_nodes[node_index].children_ranks[rank]=
153 rank+tree_order*node;
154 tree_nodes[node_index].children_ranks[rank]+=
155 (n_cum_nodes+n_nodes_in_this_level);
156 }
157 }
158 }
159
160 }
161
162
163 n_cum_nodes+=n_nodes_in_this_level;
164 n_nodes_in_this_level*=tree_order;
165 }
166
167
168 for(i=0 ; i < num_nodes ; i++ ) {
169 if( 0 == tree_nodes[i].n_parents ) {
170 tree_nodes[i].my_node_type=ROOT_NODE;
171 } else if ( 0 == tree_nodes[i].n_children ) {
172 tree_nodes[i].my_node_type=LEAF_NODE;
173 } else {
174 tree_nodes[i].my_node_type=INTERIOR_NODE;
175 }
176 }
177
178
179 return OMPI_SUCCESS;
180
181 Error:
182
183 for( i=0 ; i < num_nodes ; i++ ) {
184 if( NULL != tree_nodes[i].children_ranks ) {
185 free(tree_nodes[i].children_ranks);
186 }
187 }
188
189
190 return OMPI_ERROR;
191 }