18
18
*/
19
19
20
20
#include " qvi-omp.h"
21
- #include " qvi-subgroup.h"
22
21
#include " qvi-bbuff.h"
23
22
#include " qvi-utils.h"
24
23
#include < omp.h>
25
24
26
- struct qvi_omp_group_s {
27
- /* * Group size. */
28
- int size = 0 ;
29
- /* * ID (rank) in group: this ID is unique to each thread. */
30
- int rank = 0 ;
31
- /* * Constructor. */
32
- qvi_omp_group_s (void ) = delete ;
33
- /* * Constructor. */
34
- qvi_omp_group_s (
35
- int group_size,
36
- int group_rank
37
- ) : size(group_size)
38
- , rank(group_rank) { }
39
- };
25
+ qvi_omp_group::qvi_omp_group (
26
+ int group_size,
27
+ int group_rank
28
+ ) : m_size(group_size)
29
+ , m_rank(group_rank) { }
40
30
41
31
int
42
- qvi_omp_group_new (
32
+ qvi_omp_group::create (
43
33
int group_size,
44
34
int group_rank,
45
- qvi_omp_group_t **group
35
+ qvi_omp_group **group
46
36
) {
47
37
return qvi_new (group, group_size, group_rank);
48
38
}
49
39
50
40
void
51
- qvi_omp_group_delete (
52
- qvi_omp_group_t **group
41
+ qvi_omp_group::destroy (
42
+ qvi_omp_group **group
53
43
) {
54
44
#pragma omp barrier
55
45
qvi_delete (group);
56
46
}
57
47
58
48
int
59
- qvi_omp_group_id (
60
- const qvi_omp_group_t *group
61
- ) {
62
- return group->rank ;
49
+ qvi_omp_group::size (void )
50
+ {
51
+ return m_size;
63
52
}
64
53
65
54
int
66
- qvi_omp_group_size (
67
- const qvi_omp_group_t *group
68
- ) {
69
- return group->size ;
55
+ qvi_omp_group::rank (void )
56
+ {
57
+ return m_rank;
70
58
}
71
59
72
60
int
73
- qvi_omp_group_barrier (
74
- qvi_omp_group_t *
75
- ) {
61
+ qvi_omp_group::barrier (void )
62
+ {
76
63
// TODO(skg) What should we do about barriers here? In particular, we need
77
64
// to be careful about sub-groups, etc.
78
65
return QV_SUCCESS;
79
66
}
80
67
81
- static int
82
- qvi_get_subgroup_info (
83
- qvi_omp_group_t *parent,
68
+ int
69
+ qvi_omp_group::subgroup_info (
84
70
int color,
85
71
int key,
86
72
qvi_subgroup_info_s *sginfo
87
73
) {
88
- const int size = parent->size ;
89
- const int rank = parent->rank ;
90
74
qvi_subgroup_color_key_rank_s *ckrs = nullptr ;
91
75
92
76
#pragma omp single copyprivate(ckrs)
93
- ckrs = new qvi_subgroup_color_key_rank_s[size ];
77
+ ckrs = new qvi_subgroup_color_key_rank_s[m_size ];
94
78
// Gather colors and keys from ALL threads.
95
- ckrs[rank ].color = color;
96
- ckrs[rank ].key = key;
97
- ckrs[rank ].rank = rank ;
79
+ ckrs[m_rank ].color = color;
80
+ ckrs[m_rank ].key = key;
81
+ ckrs[m_rank ].rank = m_rank ;
98
82
// Barrier to be sure that all threads have contributed their values.
99
83
#pragma omp barrier
100
84
// Since these data are shared, only one thread has to sort them. The same
@@ -105,12 +89,12 @@ qvi_get_subgroup_info(
105
89
// Sort the color/key/rank array. First according to color, then by key,
106
90
// but in the same color realm. If color and key are identical, sort by
107
91
// the rank from given group.
108
- std::sort (ckrs, ckrs + size , qvi_subgroup_color_key_rank_s::by_color);
109
- std::sort (ckrs, ckrs + size , qvi_subgroup_color_key_rank_s::by_key);
110
- std::sort (ckrs, ckrs + size , qvi_subgroup_color_key_rank_s::by_rank);
92
+ std::sort (ckrs, ckrs + m_size , qvi_subgroup_color_key_rank_s::by_color);
93
+ std::sort (ckrs, ckrs + m_size , qvi_subgroup_color_key_rank_s::by_key);
94
+ std::sort (ckrs, ckrs + m_size , qvi_subgroup_color_key_rank_s::by_rank);
111
95
// Calculate the number of distinct colors provided.
112
96
std::set<int > color_set;
113
- for (int i = 0 ; i < size ; ++i) {
97
+ for (int i = 0 ; i < m_size ; ++i) {
114
98
color_set.insert (ckrs[i].color );
115
99
}
116
100
ncolors = color_set.size ();
@@ -120,12 +104,12 @@ qvi_get_subgroup_info(
120
104
// Compute my sub-group size and sub-group rank.
121
105
int group_rank = 0 ;
122
106
int group_size = 0 ;
123
- for (int i = 0 ; i < size ; ++i) {
107
+ for (int i = 0 ; i < m_size ; ++i) {
124
108
if (color != ckrs[i].color ) continue ;
125
109
// Else we found the start of my color group.
126
110
const int current_color = ckrs[i].color ;
127
- for (int j = i; j < size && current_color == ckrs[j].color ; ++j) {
128
- if (ckrs[j].rank == rank ) {
111
+ for (int j = i; j < m_size && current_color == ckrs[j].color ; ++j) {
112
+ if (ckrs[j].rank == m_rank ) {
129
113
sginfo->rank = group_rank;
130
114
}
131
115
group_size++;
@@ -143,18 +127,15 @@ qvi_get_subgroup_info(
143
127
}
144
128
145
129
int
146
- qvi_omp_group_create_from_split (
147
- qvi_omp_group_t *parent,
130
+ qvi_omp_group::split (
148
131
int color,
149
132
int key,
150
- qvi_omp_group_t **child
133
+ qvi_omp_group **child
151
134
) {
152
- qvi_omp_group_t *ichild = nullptr ;
135
+ qvi_omp_group *ichild = nullptr ;
153
136
154
137
qvi_subgroup_info_s sginfo;
155
- int rc = qvi_get_subgroup_info (
156
- parent, color, key, &sginfo
157
- );
138
+ int rc = subgroup_info (color, key, &sginfo);
158
139
if (qvi_likely (rc == QV_SUCCESS)) {
159
140
rc = qvi_new (&ichild, sginfo.size , sginfo.rank );
160
141
}
@@ -166,27 +147,23 @@ qvi_omp_group_create_from_split(
166
147
}
167
148
168
149
int
169
- qvi_omp_group_gather_bbuffs (
170
- qvi_omp_group_t *group,
150
+ qvi_omp_group::gather (
171
151
qvi_bbuff *txbuff,
172
152
int ,
173
153
bool *shared_alloc,
174
154
qvi_bbuff ***rxbuffs
175
155
) {
176
- const int group_size = group->size ;
177
- const int group_rank = group->rank ;
178
-
179
156
qvi_bbuff **bbuffs = nullptr ;
180
157
#pragma omp single copyprivate(bbuffs)
181
- bbuffs = new qvi_bbuff *[group_size ]();
158
+ bbuffs = new qvi_bbuff *[m_size ]();
182
159
183
- const int rc = qvi_bbuff_dup (*txbuff, &bbuffs[group_rank ]);
160
+ const int rc = qvi_bbuff_dup (*txbuff, &bbuffs[m_rank ]);
184
161
// Need to ensure that all threads have contributed to bbuffs.
185
162
#pragma omp barrier
186
- if (rc != QV_SUCCESS) {
163
+ if (qvi_unlikely ( rc != QV_SUCCESS) ) {
187
164
#pragma omp single
188
165
if (bbuffs) {
189
- for (int i = 0 ; i < group_size ; ++i) {
166
+ for (int i = 0 ; i < m_size ; ++i) {
190
167
qvi_bbuff_delete (&bbuffs[i]);
191
168
}
192
169
delete[] bbuffs;
@@ -199,8 +176,7 @@ qvi_omp_group_gather_bbuffs(
199
176
}
200
177
201
178
int
202
- qvi_omp_group_scatter_bbuffs (
203
- qvi_omp_group_t *group,
179
+ qvi_omp_group::scatter (
204
180
qvi_bbuff **txbuffs,
205
181
int ,
206
182
qvi_bbuff **rxbuff
@@ -211,7 +187,7 @@ qvi_omp_group_scatter_bbuffs(
211
187
#pragma omp master
212
188
*tmp = txbuffs;
213
189
#pragma omp barrier
214
- qvi_bbuff *inbuff = (*tmp)[group-> rank ];
190
+ qvi_bbuff *inbuff = (*tmp)[m_rank ];
215
191
qvi_bbuff *mybbuff = nullptr ;
216
192
const int rc = qvi_bbuff_dup (*inbuff, &mybbuff);
217
193
#pragma omp barrier
0 commit comments