Skip to content

Commit b90bca3

Browse files
committed
Merge branch 'develop' into fix/adjointAccessMode
2 parents 972d41c + a1e212e commit b90bca3

15 files changed

Lines changed: 141 additions & 81 deletions

.gitlab-ci.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,15 @@ test-clang-ompt:
3939
- export BACKEND=OMPT
4040
- make all
4141

42+
test-output:
43+
image: ubuntu:22.04
44+
timeout: 2h
45+
script:
46+
- apt update && apt install -y build-essential binutils git
47+
- git clone --depth 1 --branch develop https://github.com/SciCompKL/CoDiPack.git
48+
- export CODI_DIR=$(pwd)/CoDiPack/include
49+
- export OPDI_DIR=$(pwd)/include
50+
- cd tests
51+
- export CXX=g++
52+
- export OUTPUT_INSTRUMENT=yes
53+
- make all

include/opdi/backend/macro/dataTools.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ namespace opdi {
3434
static std::stack<void*> parallelData;
3535
#pragma omp threadprivate(parallelData)
3636

37+
static std::stack<void*> taskData;
38+
#pragma omp threadprivate(taskData)
39+
3740
public:
3841
static void pushParallelData(void* parallelData) {
3942
DataTools::parallelData.push(parallelData);
@@ -50,5 +53,21 @@ namespace opdi {
5053

5154
return DataTools::parallelData.top();
5255
}
56+
57+
static void pushTaskData(void* taskData) {
58+
DataTools::taskData.push(taskData);
59+
}
60+
61+
static void popTaskData() {
62+
DataTools::taskData.pop();
63+
}
64+
65+
static void* getTaskData() {
66+
if (DataTools::taskData.empty()) {
67+
return nullptr;
68+
}
69+
70+
return DataTools::taskData.top();
71+
}
5372
};
5473
}

include/opdi/backend/macro/macroBackend.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
// static macro backend members
3131

3232
std::stack<void*> opdi::DataTools::parallelData;
33+
std::stack<void*> opdi::DataTools::taskData;
3334

3435
std::stack<bool> opdi::ImplicitBarrierTools::implicitBarrierStack;
3536

include/opdi/backend/macro/macros.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
#define OPDI_PARALLEL(...) \
4040
{ \
41-
void* opdiInternalParallelData = opdi::logic->onParallelBegin(omp_get_max_threads()); \
41+
void* opdiInternalParallelData = opdi::logic->onParallelBegin(opdi::DataTools::getTaskData(), omp_get_max_threads()); \
4242
opdi::TaskProbe opdiInternalTaskProbe(opdiInternalParallelData); \
4343
OPDI_PRAGMA(omp parallel __VA_ARGS__ firstprivate(opdiInternalTaskProbe))
4444

include/opdi/backend/macro/probes.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ namespace opdi {
7171

7272
DataTools::pushParallelData(this->parallelData);
7373
this->taskData = logic->onImplicitTaskBegin(omp_get_num_threads(), omp_get_thread_num(), this->parallelData);
74+
DataTools::pushTaskData(this->taskData);
7475

7576
// check if copy statements have been recorded before the correct tape was set
7677
// if so, move them to the correct tape
@@ -88,6 +89,7 @@ namespace opdi {
8889
if (needsAction) {
8990
ProbeScopeStatus::endImplicitTaskProbeScope();
9091
logic->onImplicitTaskEnd(this->taskData);
92+
DataTools::popTaskData();
9193
DataTools::popParallelData();
9294
}
9395

include/opdi/backend/ompt/parallelCallbacks.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,12 @@ namespace opdi {
5252
int flags,
5353
void const* codeptr) {
5454

55-
OPDI_UNUSED(encounteringTaskData);
5655
OPDI_UNUSED(encounteringTaskFrame);
5756
OPDI_UNUSED(parallelData);
5857
OPDI_UNUSED(flags);
5958
OPDI_UNUSED(codeptr);
6059

61-
parallelData->ptr = logic->onParallelBegin(requestedParallelism);
60+
parallelData->ptr = logic->onParallelBegin(encounteringTaskData->ptr, requestedParallelism);
6261
}
6362

6463
static void onParallelEnd(

include/opdi/logic/logicInterface.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ namespace opdi {
5555

5656
virtual ~LogicInterface() {}
5757

58-
virtual void* onParallelBegin(int maxThreads) = 0;
58+
virtual void* onParallelBegin(void* encounteringTaskData, int maxThreads) = 0;
5959
virtual void onParallelEnd(void* data) = 0;
6060

6161
virtual void* onImplicitTaskBegin(int actualParallelism, int index, void* parallelData) = 0;

include/opdi/logic/omp/implicitTaskOmpLogic.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,28 +55,30 @@ void* opdi::ImplicitTaskOmpLogic::onImplicitTaskBegin(int actualParallelism, int
5555
data->oldTape = tool->getThreadLocalTape();
5656
data->parallelData = parallelData;
5757

58-
void* newTape = this->tapePool.getTape(parallelData->masterTape, index);
58+
void* newTape = this->tapePool.getTape(parallelData->parentTape, index);
5959

6060
if (parallelData->activeParallelRegion) {
6161
tool->setActive(newTape, true);
6262
}
6363

64-
data->parallelData->tapes[index] = newTape;
64+
data->tape = newTape;
6565

66-
data->parallelData->positions[index].push_back(tool->allocPosition());
67-
tool->getTapePosition(newTape, data->parallelData->positions[index].back());
66+
data->positions.push_back(tool->allocPosition());
67+
tool->getTapePosition(newTape, data->positions.back());
6868

6969
tool->setThreadLocalTape(newTape);
7070

71-
AdjointAccessControl::pushMode(data->parallelData->outerAdjointAccessMode);
72-
data->parallelData->adjointAccessModes[index].push_back(data->parallelData->outerAdjointAccessMode);
71+
AdjointAccessControl::pushMode(parallelData->parentAdjointAccessMode);
72+
data->adjointAccessModes.push_back(parallelData->parentAdjointAccessMode);
7373

7474
#if OPDI_OMP_LOGIC_INSTRUMENT
7575
for (auto& instrument : ompLogicInstruments) {
7676
instrument->onImplicitTaskBegin(data);
7777
}
7878
#endif
7979

80+
parallelData->childTasks[index] = data;
81+
8082
return data;
8183
}
8284

@@ -94,13 +96,11 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
9496

9597
tool->setThreadLocalTape(data->oldTape);
9698

97-
data->parallelData->positions[data->index].push_back(tool->allocPosition());
98-
tool->getTapePosition(data->parallelData->tapes[data->index],
99-
data->parallelData->positions[data->index].back());
99+
data->positions.push_back(tool->allocPosition());
100+
tool->getTapePosition(data->tape, data->positions.back());
100101

101102
if (!data->parallelData->activeParallelRegion) {
102-
if (tool->comparePosition(data->parallelData->positions[data->index].front(),
103-
data->parallelData->positions[data->index].back()) != 0) {
103+
if (tool->comparePosition(data->positions.front(), data->positions.back()) != 0) {
104104
OPDI_WARNING("Something became active during a passive parallel region. This is not supported and will not be ",
105105
"differentiated correctly.");
106106
}
@@ -112,12 +112,13 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
112112
}
113113
#endif
114114

115-
tool->setActive(data->parallelData->tapes[data->index], false);
115+
tool->setActive(data->tape, false);
116116

117-
if (data->oldTape == data->parallelData->masterTape && data->parallelData->activeParallelRegion) {
117+
// ensure that the most recent activity change *per thread* reflects the current activity
118+
if (data->oldTape == data->parallelData->parentTape && data->parallelData->activeParallelRegion) {
118119
tool->setActive(data->oldTape, true);
119120
}
120121

121-
delete data;
122+
// do not delete data, it is deleted as part of parallel regions
122123
}
123124
}

include/opdi/logic/omp/implicitTaskOmpLogic.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
#pragma once
2727

28+
#include <deque>
29+
2830
#include "../../misc/tapePool.hpp"
2931

3032
#include "../logicInterface.hpp"
@@ -44,14 +46,19 @@ namespace opdi {
4446

4547
public:
4648

49+
using LogicInterface::AdjointAccessMode;
50+
4751
using ParallelData = typename ParallelOmpLogic::Data;
4852

4953
struct Data {
5054
public:
5155
int level;
5256
int index;
5357
void* oldTape;
58+
void* tape;
5459
ParallelData* parallelData;
60+
std::deque<void*> positions;
61+
std::deque<AdjointAccessMode> adjointAccessModes;
5562
};
5663

5764
virtual void* onImplicitTaskBegin(int actualParallelism, int index, void* parallelDataPtr);

include/opdi/logic/omp/instrument/ompLogicInstrumentInterface.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ namespace opdi {
4545

4646
virtual void reverseFlush() {}
4747

48-
virtual void reverseImplicitTaskBegin(ParallelOmpLogic::Data* /*data*/, int /*threadNum*/) {}
49-
virtual void reverseImplicitTaskEnd(ParallelOmpLogic::Data* /*data*/, int /*threadNum*/) {}
50-
virtual void reverseImplicitTaskPart(ParallelOmpLogic::Data* /*data*/, int /*threadNum*/, std::size_t /*part*/) {}
48+
virtual void reverseImplicitTaskBegin(ImplicitTaskOmpLogic::Data* /*data*/) {}
49+
virtual void reverseImplicitTaskEnd(ImplicitTaskOmpLogic::Data* /*data*/) {}
50+
virtual void reverseImplicitTaskPart(ImplicitTaskOmpLogic::Data* /*data*/, std::size_t /*part*/) {}
5151
virtual void onImplicitTaskBegin(ImplicitTaskOmpLogic::Data* /*data*/) {}
5252
virtual void onImplicitTaskEnd(ImplicitTaskOmpLogic::Data* /*data*/) {}
5353

0 commit comments

Comments
 (0)