Skip to content

Commit 478c59d

Browse files
Cleanup some OpenMP group code. (#267)
Signed-off-by: Samuel K. Gutierrez <[email protected]>
1 parent 7f34263 commit 478c59d

File tree

4 files changed

+122
-141
lines changed

4 files changed

+122
-141
lines changed

src/qvi-group-omp.cc

+9-11
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
qvi_group_omp::qvi_group_omp(void)
2626
{
2727
const int rc = qvi_new(&m_task);
28-
if (rc != QV_SUCCESS) throw qvi_runtime_error();
28+
if (qvi_unlikely(rc != QV_SUCCESS)) throw qvi_runtime_error();
2929
}
3030

3131
qvi_group_omp::~qvi_group_omp(void)
3232
{
33-
qvi_omp_group_delete(&m_ompgroup);
33+
qvi_omp_group::destroy(&m_ompgroup);
3434
qvi_delete(&m_task);
3535
}
3636

@@ -42,7 +42,7 @@ qvi_group_omp::make_intrinsic(
4242
const int group_rank = omp_get_thread_num();
4343
// NOTE: the provided scope doesn't affect how
4444
// we create the thread group, so we ignore it.
45-
return qvi_omp_group_new(group_size, group_rank, &m_ompgroup);
45+
return qvi_omp_group::create(group_size, group_rank, &m_ompgroup);
4646
}
4747

4848
int
@@ -53,11 +53,11 @@ qvi_group_omp::self(
5353
const int group_rank = 0;
5454
qvi_group_omp *ichild = nullptr;
5555
int rc = qvi_new(&ichild);
56-
if (rc != QV_SUCCESS) goto out;
56+
if (qvi_unlikely(rc != QV_SUCCESS)) goto out;
5757
// Create a group containing a single thread.
58-
rc = qvi_omp_group_new(group_size, group_rank, &ichild->m_ompgroup);
58+
rc = qvi_omp_group::create(group_size, group_rank, &ichild->m_ompgroup);
5959
out:
60-
if (rc != QV_SUCCESS) {
60+
if (qvi_unlikely(rc != QV_SUCCESS)) {
6161
qvi_delete(&ichild);
6262
}
6363
*child = ichild;
@@ -72,13 +72,11 @@ qvi_group_omp::split(
7272
) {
7373
qvi_group_omp *ichild = nullptr;
7474
int rc = qvi_new(&ichild);
75-
if (rc != QV_SUCCESS) goto out;
75+
if (qvi_unlikely(rc != QV_SUCCESS)) goto out;
7676

77-
rc = qvi_omp_group_create_from_split(
78-
m_ompgroup, color, key, &ichild->m_ompgroup
79-
);
77+
rc = m_ompgroup->split(color, key, &ichild->m_ompgroup);
8078
out:
81-
if (rc != QV_SUCCESS) {
79+
if (qvi_unlikely(rc != QV_SUCCESS)) {
8280
qvi_delete(&ichild);
8381
}
8482
*child = ichild;

src/qvi-group-omp.h

+6-10
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ struct qvi_group_omp : public qvi_group {
2929
/** Task associated with this group. */
3030
qvi_task *m_task = nullptr;
3131
/** Underlying group instance. */
32-
qvi_omp_group_t *m_ompgroup = nullptr;
32+
qvi_omp_group *m_ompgroup = nullptr;
3333
public:
3434
/** Constructor. */
3535
qvi_group_omp(void);
@@ -45,19 +45,19 @@ struct qvi_group_omp : public qvi_group {
4545
virtual int
4646
rank(void) const
4747
{
48-
return qvi_omp_group_id(m_ompgroup);
48+
return m_ompgroup->rank();
4949
}
5050

5151
virtual int
5252
size(void) const
5353
{
54-
return qvi_omp_group_size(m_ompgroup);
54+
return m_ompgroup->size();
5555
}
5656

5757
virtual int
5858
barrier(void)
5959
{
60-
return qvi_omp_group_barrier(m_ompgroup);
60+
return m_ompgroup->barrier();
6161
}
6262

6363
virtual int
@@ -93,9 +93,7 @@ struct qvi_group_omp : public qvi_group {
9393
bool *shared,
9494
qvi_bbuff ***rxbuffs
9595
) {
96-
return qvi_omp_group_gather_bbuffs(
97-
m_ompgroup, txbuff, root, shared, rxbuffs
98-
);
96+
return m_ompgroup->gather(txbuff, root, shared, rxbuffs);
9997
}
10098

10199
virtual int
@@ -104,9 +102,7 @@ struct qvi_group_omp : public qvi_group {
104102
int root,
105103
qvi_bbuff **rxbuff
106104
) {
107-
return qvi_omp_group_scatter_bbuffs(
108-
m_ompgroup, txbuffs, root, rxbuff
109-
);
105+
return m_ompgroup->scatter(txbuffs, root, rxbuff);
110106
}
111107
};
112108

src/qvi-omp.cc

+41-65
Original file line numberDiff line numberDiff line change
@@ -18,83 +18,67 @@
1818
*/
1919

2020
#include "qvi-omp.h"
21-
#include "qvi-subgroup.h"
2221
#include "qvi-bbuff.h"
2322
#include "qvi-utils.h"
2423
#include <omp.h>
2524

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) { }
4030

4131
int
42-
qvi_omp_group_new(
32+
qvi_omp_group::create(
4333
int group_size,
4434
int group_rank,
45-
qvi_omp_group_t **group
35+
qvi_omp_group **group
4636
) {
4737
return qvi_new(group, group_size, group_rank);
4838
}
4939

5040
void
51-
qvi_omp_group_delete(
52-
qvi_omp_group_t **group
41+
qvi_omp_group::destroy(
42+
qvi_omp_group **group
5343
) {
5444
#pragma omp barrier
5545
qvi_delete(group);
5646
}
5747

5848
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;
6352
}
6453

6554
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;
7058
}
7159

7260
int
73-
qvi_omp_group_barrier(
74-
qvi_omp_group_t *
75-
) {
61+
qvi_omp_group::barrier(void)
62+
{
7663
// TODO(skg) What should we do about barriers here? In particular, we need
7764
// to be careful about sub-groups, etc.
7865
return QV_SUCCESS;
7966
}
8067

81-
static int
82-
qvi_get_subgroup_info(
83-
qvi_omp_group_t *parent,
68+
int
69+
qvi_omp_group::subgroup_info(
8470
int color,
8571
int key,
8672
qvi_subgroup_info_s *sginfo
8773
) {
88-
const int size = parent->size;
89-
const int rank = parent->rank;
9074
qvi_subgroup_color_key_rank_s *ckrs = nullptr;
9175

9276
#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];
9478
// 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;
9882
// Barrier to be sure that all threads have contributed their values.
9983
#pragma omp barrier
10084
// Since these data are shared, only one thread has to sort them. The same
@@ -105,12 +89,12 @@ qvi_get_subgroup_info(
10589
// Sort the color/key/rank array. First according to color, then by key,
10690
// but in the same color realm. If color and key are identical, sort by
10791
// 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);
11195
// Calculate the number of distinct colors provided.
11296
std::set<int> color_set;
113-
for (int i = 0; i < size; ++i) {
97+
for (int i = 0; i < m_size; ++i) {
11498
color_set.insert(ckrs[i].color);
11599
}
116100
ncolors = color_set.size();
@@ -120,12 +104,12 @@ qvi_get_subgroup_info(
120104
// Compute my sub-group size and sub-group rank.
121105
int group_rank = 0;
122106
int group_size = 0;
123-
for (int i = 0; i < size; ++i) {
107+
for (int i = 0; i < m_size; ++i) {
124108
if (color != ckrs[i].color) continue;
125109
// Else we found the start of my color group.
126110
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) {
129113
sginfo->rank = group_rank;
130114
}
131115
group_size++;
@@ -143,18 +127,15 @@ qvi_get_subgroup_info(
143127
}
144128

145129
int
146-
qvi_omp_group_create_from_split(
147-
qvi_omp_group_t *parent,
130+
qvi_omp_group::split(
148131
int color,
149132
int key,
150-
qvi_omp_group_t **child
133+
qvi_omp_group **child
151134
) {
152-
qvi_omp_group_t *ichild = nullptr;
135+
qvi_omp_group *ichild = nullptr;
153136

154137
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);
158139
if (qvi_likely(rc == QV_SUCCESS)) {
159140
rc = qvi_new(&ichild, sginfo.size, sginfo.rank);
160141
}
@@ -166,27 +147,23 @@ qvi_omp_group_create_from_split(
166147
}
167148

168149
int
169-
qvi_omp_group_gather_bbuffs(
170-
qvi_omp_group_t *group,
150+
qvi_omp_group::gather(
171151
qvi_bbuff *txbuff,
172152
int,
173153
bool *shared_alloc,
174154
qvi_bbuff ***rxbuffs
175155
) {
176-
const int group_size = group->size;
177-
const int group_rank = group->rank;
178-
179156
qvi_bbuff **bbuffs = nullptr;
180157
#pragma omp single copyprivate(bbuffs)
181-
bbuffs = new qvi_bbuff *[group_size]();
158+
bbuffs = new qvi_bbuff *[m_size]();
182159

183-
const int rc = qvi_bbuff_dup(*txbuff, &bbuffs[group_rank]);
160+
const int rc = qvi_bbuff_dup(*txbuff, &bbuffs[m_rank]);
184161
// Need to ensure that all threads have contributed to bbuffs.
185162
#pragma omp barrier
186-
if (rc != QV_SUCCESS) {
163+
if (qvi_unlikely(rc != QV_SUCCESS)) {
187164
#pragma omp single
188165
if (bbuffs) {
189-
for (int i = 0; i < group_size; ++i) {
166+
for (int i = 0; i < m_size; ++i) {
190167
qvi_bbuff_delete(&bbuffs[i]);
191168
}
192169
delete[] bbuffs;
@@ -199,8 +176,7 @@ qvi_omp_group_gather_bbuffs(
199176
}
200177

201178
int
202-
qvi_omp_group_scatter_bbuffs(
203-
qvi_omp_group_t *group,
179+
qvi_omp_group::scatter(
204180
qvi_bbuff **txbuffs,
205181
int,
206182
qvi_bbuff **rxbuff
@@ -211,7 +187,7 @@ qvi_omp_group_scatter_bbuffs(
211187
#pragma omp master
212188
*tmp = txbuffs;
213189
#pragma omp barrier
214-
qvi_bbuff *inbuff = (*tmp)[group->rank];
190+
qvi_bbuff *inbuff = (*tmp)[m_rank];
215191
qvi_bbuff *mybbuff = nullptr;
216192
const int rc = qvi_bbuff_dup(*inbuff, &mybbuff);
217193
#pragma omp barrier

0 commit comments

Comments
 (0)