Skip to content

Commit a1e212e

Browse files
committed
Restructure data of parallel regions and implicit tasks.
Associate tapes, positions, and adjoint access modes with tasks instead of parallel regions. Extend data of parallel regions by pointers to the parent task and child tasks. Build tests with output instrument. Merge branch 'feature/restructureTaskData' into develop
2 parents a6b9655 + 1bf48ee commit a1e212e

15 files changed

Lines changed: 139 additions & 79 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)