This source file includes following definitions.
- ompi_group_dense_overlap
- ompi_group_dense_lookup_raw
- ompi_group_get_proc_ptr_raw
- ompi_group_calc_plist
- ompi_group_incl_plist
- ompi_group_union
- ompi_group_difference
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 #include "ompi_config.h"
28 #include "opal/class/opal_bitmap.h"
29 #include "ompi/group/group.h"
30 #include "ompi/constants.h"
31 #include "ompi/proc/proc.h"
32 #include "mpi.h"
33
34 #include <math.h>
35
36 static int ompi_group_dense_overlap (ompi_group_t *group1, ompi_group_t *group2, opal_bitmap_t *bitmap)
37 {
38 ompi_proc_t *proc1_pointer, *proc2_pointer;
39 int rc, overlap_count;
40
41 overlap_count = 0;
42
43 for (int proc1 = 0 ; proc1 < group1->grp_proc_count ; ++proc1) {
44 proc1_pointer = ompi_group_get_proc_ptr_raw (group1, proc1);
45
46
47 for (int proc2 = 0 ; proc2 < group2->grp_proc_count ; ++proc2) {
48 proc2_pointer = ompi_group_get_proc_ptr_raw (group2, proc2);
49 if( proc1_pointer == proc2_pointer ) {
50 rc = opal_bitmap_set_bit (bitmap, proc2);
51 if (OPAL_SUCCESS != rc) {
52 return rc;
53 }
54 ++overlap_count;
55
56 break;
57 }
58 }
59 }
60
61 return overlap_count;
62 }
63
64 static struct ompi_proc_t *ompi_group_dense_lookup_raw (ompi_group_t *group, const int peer_id)
65 {
66 if (OPAL_UNLIKELY(ompi_proc_is_sentinel (group->grp_proc_pointers[peer_id]))) {
67 ompi_proc_t *proc =
68 (ompi_proc_t *) ompi_proc_lookup (ompi_proc_sentinel_to_name ((uintptr_t) group->grp_proc_pointers[peer_id]));
69 if (NULL != proc) {
70
71 group->grp_proc_pointers[peer_id] = proc;
72
73 OBJ_RETAIN(group->grp_proc_pointers[peer_id]);
74 }
75 }
76
77 return group->grp_proc_pointers[peer_id];
78 }
79
80 ompi_proc_t *ompi_group_get_proc_ptr_raw (ompi_group_t *group, int rank)
81 {
82 #if OMPI_GROUP_SPARSE
83 do {
84 if (OMPI_GROUP_IS_DENSE(group)) {
85 return ompi_group_dense_lookup_raw (group, rank);
86 }
87 int ranks1 = rank;
88 ompi_group_translate_ranks (group, 1, &ranks1, group->grp_parent_group_ptr, &rank);
89 group = group->grp_parent_group_ptr;
90 } while (1);
91 #else
92 return ompi_group_dense_lookup_raw (group, rank);
93 #endif
94 }
95
96 int ompi_group_calc_plist ( int n , const int *ranks ) {
97 return sizeof(char *) * n ;
98 }
99
100 int ompi_group_incl_plist(ompi_group_t* group, int n, const int *ranks,
101 ompi_group_t **new_group)
102 {
103
104 int my_group_rank;
105 ompi_group_t *group_pointer, *new_group_pointer;
106
107 group_pointer = (ompi_group_t *)group;
108
109 if ( 0 == n ) {
110 *new_group = MPI_GROUP_EMPTY;
111 OBJ_RETAIN(MPI_GROUP_EMPTY);
112 return OMPI_SUCCESS;
113 }
114
115
116 new_group_pointer=ompi_group_allocate(n);
117 if( NULL == new_group_pointer ) {
118 return MPI_ERR_GROUP;
119 }
120
121
122 for (int proc = 0; proc < n; proc++) {
123 new_group_pointer->grp_proc_pointers[proc] =
124 ompi_group_get_proc_ptr_raw (group_pointer, ranks[proc]);
125 }
126
127
128 ompi_group_increment_proc_count(new_group_pointer);
129
130
131 my_group_rank=group_pointer->grp_my_rank;
132 if (MPI_UNDEFINED != my_group_rank) {
133 ompi_set_group_rank(new_group_pointer, ompi_proc_local_proc);
134 } else {
135 new_group_pointer->grp_my_rank = MPI_UNDEFINED;
136 }
137
138 *new_group = (MPI_Group)new_group_pointer;
139
140 return OMPI_SUCCESS;
141 }
142
143
144
145
146
147 int ompi_group_union (ompi_group_t* group1, ompi_group_t* group2,
148 ompi_group_t **new_group)
149 {
150
151 int new_group_size, cnt, rc, overlap_count;
152 ompi_group_t *new_group_pointer;
153 ompi_proc_t *proc2_pointer;
154 opal_bitmap_t bitmap;
155
156
157
158
159
160
161 OBJ_CONSTRUCT(&bitmap, opal_bitmap_t);
162 rc = opal_bitmap_init (&bitmap, 32);
163 if (OPAL_SUCCESS != rc) {
164 return rc;
165 }
166
167
168 overlap_count = ompi_group_dense_overlap (group1, group2, &bitmap);
169 if (0 > overlap_count) {
170 OBJ_DESTRUCT(&bitmap);
171 return overlap_count;
172 }
173
174 new_group_size = group1->grp_proc_count + group2->grp_proc_count - overlap_count;
175 if ( 0 == new_group_size ) {
176 *new_group = MPI_GROUP_EMPTY;
177 OBJ_RETAIN(MPI_GROUP_EMPTY);
178 OBJ_DESTRUCT(&bitmap);
179 return MPI_SUCCESS;
180 }
181
182
183 new_group_pointer = ompi_group_allocate(new_group_size);
184 if (NULL == new_group_pointer) {
185 OBJ_DESTRUCT(&bitmap);
186 return MPI_ERR_GROUP;
187 }
188
189
190
191
192 for (int proc1 = 0; proc1 < group1->grp_proc_count; ++proc1) {
193 new_group_pointer->grp_proc_pointers[proc1] =
194 ompi_group_get_proc_ptr_raw (group1, proc1);
195 }
196 cnt = group1->grp_proc_count;
197
198
199 for (int proc2 = 0; proc2 < group2->grp_proc_count; ++proc2) {
200 if (opal_bitmap_is_set_bit (&bitmap, proc2)) {
201 continue;
202 }
203
204 proc2_pointer = ompi_group_get_proc_ptr_raw (group2, proc2);
205 new_group_pointer->grp_proc_pointers[cnt++] = proc2_pointer;
206 }
207
208 OBJ_DESTRUCT(&bitmap);
209
210
211 ompi_group_increment_proc_count(new_group_pointer);
212
213
214 if (MPI_UNDEFINED != group1->grp_my_rank || MPI_UNDEFINED != group2->grp_my_rank) {
215 ompi_set_group_rank(new_group_pointer, ompi_proc_local_proc);
216 } else {
217 new_group_pointer->grp_my_rank = MPI_UNDEFINED;
218 }
219
220 *new_group = (MPI_Group) new_group_pointer;
221
222 return OMPI_SUCCESS;
223 }
224
225
226
227
228
229 int ompi_group_difference(ompi_group_t* group1, ompi_group_t* group2,
230 ompi_group_t **new_group) {
231
232
233 int new_group_size, overlap_count, rc;
234 ompi_group_t *new_group_pointer;
235 ompi_proc_t *proc1_pointer;
236 opal_bitmap_t bitmap;
237
238
239
240
241
242
243 OBJ_CONSTRUCT(&bitmap, opal_bitmap_t);
244 rc = opal_bitmap_init (&bitmap, 32);
245 if (OPAL_SUCCESS != rc) {
246 return rc;
247 }
248
249
250 overlap_count = ompi_group_dense_overlap (group2, group1, &bitmap);
251 if (0 > overlap_count) {
252 OBJ_DESTRUCT(&bitmap);
253 return overlap_count;
254 }
255
256 new_group_size = group1->grp_proc_count - overlap_count;
257 if ( 0 == new_group_size ) {
258 *new_group = MPI_GROUP_EMPTY;
259 OBJ_RETAIN(MPI_GROUP_EMPTY);
260 OBJ_DESTRUCT(&bitmap);
261 return MPI_SUCCESS;
262 }
263
264
265 new_group_pointer = ompi_group_allocate(new_group_size);
266 if( NULL == new_group_pointer ) {
267 OBJ_DESTRUCT(&bitmap);
268 return MPI_ERR_GROUP;
269 }
270
271
272
273 for (int proc1 = 0, cnt = 0 ; proc1 < group1->grp_proc_count ; ++proc1) {
274 if (opal_bitmap_is_set_bit (&bitmap, proc1)) {
275 continue;
276 }
277
278 proc1_pointer = ompi_group_get_proc_ptr_raw (group1, proc1);
279 new_group_pointer->grp_proc_pointers[cnt++] = proc1_pointer;
280 }
281
282 OBJ_DESTRUCT(&bitmap);
283
284
285 ompi_group_increment_proc_count(new_group_pointer);
286
287
288 if (MPI_UNDEFINED == group1->grp_my_rank || MPI_UNDEFINED != group2->grp_my_rank) {
289 new_group_pointer->grp_my_rank = MPI_UNDEFINED;
290 } else {
291 ompi_set_group_rank(new_group_pointer, ompi_proc_local_proc);
292 }
293
294 *new_group = (MPI_Group)new_group_pointer;
295
296 return OMPI_SUCCESS;
297 }