Skip to content

Commit 0963042

Browse files
committed
Address potential probe ordering issues.
1 parent 2414b4e commit 0963042

3 files changed

Lines changed: 31 additions & 3 deletions

File tree

include/opdi/backend/macro/macroBackend.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ std::list<omp_nest_lock_t*> opdi::ReductionTools::individualReductionLocks;
3939
std::stack<bool> opdi::ReductionTools::hasReductions;
4040
std::stack<bool> opdi::ReductionTools::needsBarrierBeforeReductions;
4141
std::stack<bool> opdi::ReductionTools::needsBarrierAfterReductions;
42+
int opdi::ReductionTools::implicitTaskNestingDepth = 0;
4243

4344
template<typename Type, int identifier>
4445
omp_nest_lock_t opdi::Reducer<Type, identifier>::reductionLock;

include/opdi/backend/macro/probes.hpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,25 @@ namespace opdi {
5353
this->parallelData);
5454
DataTools::pushTaskData(this->taskData);
5555

56-
ReductionTools::beginRegionThatSupportsReductions(false);
56+
assert(ReductionTools::implicitTaskNestingDepth <= omp_get_level());
57+
58+
if (ReductionTools::implicitTaskNestingDepth != omp_get_level()) {
59+
/* TaskProbe constructor before ReductionProbe constructor (if any) */
60+
do {
61+
++ReductionTools::implicitTaskNestingDepth;
62+
} while (ReductionTools::implicitTaskNestingDepth != omp_get_level());
63+
64+
ReductionTools::beginRegionThatSupportsReductions(false);
65+
}
5766
}
5867

5968
~TaskProbe() {
6069
if (needsAction) {
61-
/* order of TaskProbe and ReductionProbe destructors not relevant */
70+
assert(ReductionTools::implicitTaskNestingDepth == omp_get_level());
71+
6272
ReductionTools::endRegionThatSupportsReductions();
73+
--ReductionTools::implicitTaskNestingDepth;
74+
6375
logic->onImplicitTaskEnd(this->taskData);
6476
DataTools::popTaskData();
6577
DataTools::popParallelData();
@@ -103,9 +115,20 @@ namespace opdi {
103115
struct ReductionProbe {
104116
public:
105117

106-
ReductionProbe(int) {}
118+
ReductionProbe(int) {}
107119

108120
ReductionProbe() {
121+
assert(ReductionTools::implicitTaskNestingDepth <= omp_get_level());
122+
123+
if (ReductionTools::implicitTaskNestingDepth != omp_get_level()) {
124+
/* this condition can only be satisfied by probes on a parallel construct */
125+
/* ReductionProbe constructor before TaskProbe constructor */
126+
do {
127+
++ReductionTools::implicitTaskNestingDepth;
128+
} while (ReductionTools::implicitTaskNestingDepth != omp_get_level());
129+
ReductionTools::beginRegionThatSupportsReductions(false);
130+
}
131+
109132
ReductionTools::regionHasReductions();
110133
}
111134

include/opdi/backend/macro/reductionTools.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ namespace opdi {
5757
static std::stack<bool> needsBarrierAfterReductions;
5858
#pragma omp threadprivate(needsBarrierAfterReductions)
5959

60+
/* resolves ordering issues between TaskProbe and ReductionProbe constructors */
61+
static int implicitTaskNestingDepth;
62+
#pragma omp threadprivate(implicitTaskNestingDepth)
63+
6064
static void beginRegionThatSupportsReductions(bool needsBarrierAfterReductions) {
6165
ReductionTools::hasReductions.push(false);
6266
ReductionTools::needsBarrierBeforeReductions.push(false);

0 commit comments

Comments
 (0)