Skip to content

Commit 2cc84e7

Browse files
committed
Merge branch 'feature/passiveParallelRegions' into develop
OpDiLib handles passive parallel regions and assigns the corresponding tapes.
2 parents b524c24 + 69549b0 commit 2cc84e7

3 files changed

Lines changed: 42 additions & 9 deletions

File tree

include/opdi/logic/omp/implicitTaskOmpLogic.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525

2626
#include "../../config.hpp"
27+
#include "../../helpers/exceptions.hpp"
2728
#include "../../tool/toolInterface.hpp"
2829

2930
#include "instrument/ompLogicInstrumentInterface.hpp"
@@ -55,7 +56,10 @@ void* opdi::ImplicitTaskOmpLogic::onImplicitTaskBegin(int actualParallelism, int
5556
data->parallelData = parallelData;
5657

5758
void* newTape = this->tapePool.getTape(parallelData->masterTape, index);
58-
tool->setActive(newTape, true);
59+
60+
if (parallelData->activeParallelRegion) {
61+
tool->setActive(newTape, true);
62+
}
5963

6064
data->parallelData->tapes[index] = newTape;
6165

@@ -94,6 +98,14 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
9498
tool->getTapePosition(data->parallelData->tapes[data->index],
9599
data->parallelData->positions[data->index].back());
96100

101+
if (!data->parallelData->activeParallelRegion) {
102+
if (tool->comparePosition(data->parallelData->positions[data->index].front(),
103+
data->parallelData->positions[data->index].back()) != 0) {
104+
OPDI_WARNING("Something became active during a passive parallel region. This is not supported and will not be ",
105+
"differentiated correctly.");
106+
}
107+
}
108+
97109
#if OPDI_OMP_LOGIC_INSTRUMENT
98110
for (auto& instrument : ompLogicInstruments) {
99111
instrument->onImplicitTaskEnd(data);
@@ -102,7 +114,7 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
102114

103115
tool->setActive(data->parallelData->tapes[data->index], false);
104116

105-
if (data->oldTape == data->parallelData->masterTape) {
117+
if (data->oldTape == data->parallelData->masterTape && data->parallelData->activeParallelRegion) {
106118
tool->setActive(data->oldTape, true);
107119
}
108120

include/opdi/logic/omp/parallelOmpLogic.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
#include "parallelOmpLogic.hpp"
3434

35+
int opdi::ParallelOmpLogic::skipParallelHandling = 0;
36+
3537
void opdi::ParallelOmpLogic::reverseFunc(void* dataPtr) {
3638

3739
Data* data = (Data*) dataPtr;
@@ -42,6 +44,8 @@ void opdi::ParallelOmpLogic::reverseFunc(void* dataPtr) {
4244
}
4345
#endif
4446

47+
++ParallelOmpLogic::skipParallelHandling;
48+
4549
#pragma omp parallel num_threads(data->actualThreads)
4650
{
4751
int threadNum = omp_get_thread_num();
@@ -70,6 +74,8 @@ void opdi::ParallelOmpLogic::reverseFunc(void* dataPtr) {
7074
data->adjointAccessModes[threadNum][j - 1] == AdjointAccessMode::Atomic);
7175
}
7276

77+
--ParallelOmpLogic::skipParallelHandling;
78+
7379
tool->setThreadLocalTape(oldTape);
7480

7581
#if OPDI_OMP_LOGIC_INSTRUMENT
@@ -90,6 +96,8 @@ void opdi::ParallelOmpLogic::deleteFunc(void* dataPtr) {
9096

9197
Data* data = (Data*) dataPtr;
9298

99+
++ParallelOmpLogic::skipParallelHandling;
100+
93101
// this triggers possibly pending implicit task end events
94102
#pragma omp parallel num_threads(data->actualThreads)
95103
{
@@ -108,17 +116,20 @@ void opdi::ParallelOmpLogic::deleteFunc(void* dataPtr) {
108116
}
109117
}
110118

119+
--ParallelOmpLogic::skipParallelHandling;
120+
111121
delete [] data->tapes;
112122
delete data;
113123
}
114124

115125
void* opdi::ParallelOmpLogic::onParallelBegin(int maxThreads) {
116126

117-
if (tool->getThreadLocalTape() != nullptr && tool->isActive(tool->getThreadLocalTape())) {
127+
if (tool->getThreadLocalTape() != nullptr && ParallelOmpLogic::skipParallelHandling == 0) {
118128

119129
Data* data = new Data;
120130

121131
data->maxThreads = maxThreads;
132+
data->activeParallelRegion = tool->isActive(tool->getThreadLocalTape());
122133
data->masterTape = tool->getThreadLocalTape();
123134
data->tapes = new void*[maxThreads]();
124135
data->positions.resize(maxThreads);
@@ -155,14 +166,20 @@ void opdi::ParallelOmpLogic::onParallelEnd(void* dataPtr) {
155166
}
156167
#endif
157168

158-
Handle* handle = new Handle;
159-
handle->data = (void*) data;
160-
handle->reverseFunc = ParallelOmpLogic::reverseFunc;
161-
handle->deleteFunc = ParallelOmpLogic::deleteFunc;
169+
if (data->activeParallelRegion) {
170+
171+
Handle* handle = new Handle;
172+
handle->data = (void*) data;
173+
handle->reverseFunc = ParallelOmpLogic::reverseFunc;
174+
handle->deleteFunc = ParallelOmpLogic::deleteFunc;
162175

163-
tool->pushExternalFunction(data->masterTape, handle);
176+
tool->pushExternalFunction(data->masterTape, handle);
164177

165-
// do not delete data, it is deleted with the handle
178+
// do not delete data, it is deleted with the handle
179+
180+
} else {
181+
deleteFunc(data);
182+
}
166183
}
167184
#if OPDI_OMP_LOGIC_INSTRUMENT
168185
else {

include/opdi/logic/omp/parallelOmpLogic.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ namespace opdi {
4747
public:
4848
int maxThreads;
4949
int actualThreads;
50+
bool activeParallelRegion;
5051
void* masterTape;
5152
void** tapes;
5253
std::vector<std::deque<void*>> positions;
@@ -56,6 +57,9 @@ namespace opdi {
5657

5758
private:
5859

60+
static int skipParallelHandling;
61+
#pragma omp threadprivate(skipParallelHandling)
62+
5963
static void reverseFunc(void* dataPtr);
6064
static void deleteFunc(void* dataPtr);
6165

0 commit comments

Comments
 (0)