This source file includes following definitions.
- ompi_group_calc_bmap
- ompi_group_translate_ranks_bmap
- ompi_group_translate_ranks_bmap_reverse
- ompi_group_div_ceil
- check_ranks
- ompi_group_incl_bmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include "ompi_config.h"
25 #include "ompi/group/group.h"
26 #include "ompi/constants.h"
27 #include "mpi.h"
28
29 static bool check_ranks (int, const int *);
30
31 int ompi_group_calc_bmap ( int n, int orig_size , const int *ranks) {
32 if (check_ranks(n,ranks)) {
33 return ompi_group_div_ceil(orig_size,BSIZE);
34 }
35 else {
36 return -1;
37 }
38 }
39
40
41 int ompi_group_translate_ranks_bmap ( ompi_group_t *parent_group,
42 int n_ranks, const int *ranks1,
43 ompi_group_t *child_group,
44 int *ranks2)
45 {
46 int i,count,j,k,m;
47 unsigned char tmp, tmp1;
48 for (j=0 ; j<n_ranks ; j++) {
49 if ( MPI_PROC_NULL == ranks1[j]) {
50 ranks2[j] = MPI_PROC_NULL;
51 }
52 else {
53 ranks2[j] = MPI_UNDEFINED;
54 m = ranks1[j];
55 count = 0;
56 tmp = ( 1 << (m % BSIZE) );
57
58 if ( tmp == (child_group->sparse_data.grp_bitmap.grp_bitmap_array[(int)(m/BSIZE)]
59 & (1 << (m % BSIZE)))) {
60
61
62
63
64
65 for (i=0 ; i<=(int)(m/BSIZE) ; i++) {
66 for (k=0 ; k<BSIZE ; k++) {
67 tmp1 = ( 1 << k);
68 if ( tmp1 == ( child_group->sparse_data.grp_bitmap.grp_bitmap_array[i]
69 & (1 << k) ) ) {
70 count++;
71 }
72 if( i==(int)(m/BSIZE) && k==m % BSIZE ) {
73 ranks2[j] = count-1;
74 i = (int)(m/BSIZE) + 1;
75 break;
76 }
77 }
78 }
79 }
80 }
81 }
82 return OMPI_SUCCESS;
83 }
84
85 int ompi_group_translate_ranks_bmap_reverse ( ompi_group_t *child_group,
86 int n_ranks, const int *ranks1,
87 ompi_group_t *parent_group,
88 int *ranks2)
89 {
90 int i,j,count,m,k;
91 unsigned char tmp;
92 for (j=0 ; j<n_ranks ; j++) {
93 if ( MPI_PROC_NULL == ranks1[j]) {
94 ranks2[j] = MPI_PROC_NULL;
95 }
96 else {
97 m = ranks1[j];
98 count = 0;
99
100
101
102
103 for (i=0 ; i<child_group->sparse_data.grp_bitmap.grp_bitmap_array_len ; i++) {
104 for (k=0 ; k<BSIZE ; k++) {
105 tmp = ( 1 << k);
106 if ( tmp == ( child_group->sparse_data.grp_bitmap.grp_bitmap_array[i]
107 & (1 << k) ) ) {
108 count++;
109 }
110 if( m == count-1 ) {
111 ranks2[j] = i*BSIZE + k;
112 i = child_group->sparse_data.grp_bitmap.grp_bitmap_array_len + 1;
113 break;
114 }
115 }
116 }
117 }
118 }
119 return OMPI_SUCCESS;
120 }
121
122 int ompi_group_div_ceil (int num, int den)
123 {
124 if (0 == num%den) {
125 return num/den;
126 }
127 else {
128 return (int)(num/den) + 1;
129 }
130 }
131
132
133
134
135
136
137 static bool check_ranks (int n, const int *ranks) {
138 int i;
139 for (i=1 ; i < n ; i++) {
140 if ( ranks[i-1] > ranks [i] ) {
141 return false;
142 }
143 }
144 return true;
145 }
146
147 int ompi_group_incl_bmap(ompi_group_t* group, int n, const int *ranks,
148 ompi_group_t **new_group)
149 {
150
151 int my_group_rank,i,bit_set;
152 ompi_group_t *group_pointer, *new_group_pointer;
153
154 group_pointer = (ompi_group_t *)group;
155
156 if ( 0 == n ) {
157 *new_group = MPI_GROUP_EMPTY;
158 OBJ_RETAIN(MPI_GROUP_EMPTY);
159 return OMPI_SUCCESS;
160 }
161
162 new_group_pointer = ompi_group_allocate_bmap(group->grp_proc_count, n);
163 if( NULL == new_group_pointer ) {
164 return MPI_ERR_GROUP;
165 }
166
167 for (i=0 ; i<new_group_pointer->sparse_data.grp_bitmap.grp_bitmap_array_len ; i++) {
168 new_group_pointer->
169 sparse_data.grp_bitmap.grp_bitmap_array[i] = 0;
170 }
171
172
173 for (i=0 ; i<n ; i++) {
174 bit_set = ranks[i] % BSIZE;
175 new_group_pointer->
176 sparse_data.grp_bitmap.grp_bitmap_array[(int)(ranks[i]/BSIZE)] |= (1 << bit_set);
177 }
178
179 new_group_pointer -> grp_parent_group_ptr = group_pointer;
180
181 OBJ_RETAIN(new_group_pointer -> grp_parent_group_ptr);
182 ompi_group_increment_proc_count(new_group_pointer -> grp_parent_group_ptr);
183
184 ompi_group_increment_proc_count(new_group_pointer);
185 my_group_rank=group_pointer->grp_my_rank;
186
187 ompi_group_translate_ranks (group_pointer,1,&my_group_rank,
188 new_group_pointer,&new_group_pointer->grp_my_rank);
189
190 *new_group = (MPI_Group)new_group_pointer;
191
192 return OMPI_SUCCESS;
193 }