Skip to content

Commit 3861596

Browse files
committed
Refactor ParallelOmpLogic and ImplicitTaskOmpLogic.
More expressive names for variables and parameters. Fewer void* pointers within the logic implementation. Merge branch 'refactor/parallelRegionsImplicitTasks' into develop
2 parents 55b8e60 + d82ad1c commit 3861596

8 files changed

Lines changed: 206 additions & 208 deletions

include/opdi/logic/logicInterface.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ namespace opdi {
6060
virtual ~LogicInterface() {}
6161

6262
virtual void* onParallelBegin(void* encounteringTaskData, int maxThreads) = 0;
63-
virtual void onParallelEnd(void* data) = 0;
63+
virtual void onParallelEnd(void* parallelData) = 0;
6464

65-
virtual void* onImplicitTaskBegin(bool initialImplicitTask, int actualParallelism, int index,
65+
virtual void* onImplicitTaskBegin(bool isInitialImplicitTask, int actualSizeOfTeam, int indexInTeam,
6666
void* parallelData) = 0;
67-
virtual void onImplicitTaskEnd(void* data) = 0;
67+
virtual void onImplicitTaskEnd(void* implicitTaskData) = 0;
6868

6969
virtual void onMutexDestroyed(MutexKind kind, WaitId waitId) = 0;
7070
virtual void onMutexAcquired(MutexKind kind, WaitId waitId) = 0;

include/opdi/logic/omp/implicitTaskOmpLogic.cpp

Lines changed: 54 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -43,130 +43,131 @@ void opdi::ImplicitTaskOmpLogic::internalFinalize() {
4343
this->tapePool.finalize();
4444
}
4545

46-
void* opdi::ImplicitTaskOmpLogic::onImplicitTaskBegin(bool initialImplicitTask, int actualParallelism, int index,
46+
void* opdi::ImplicitTaskOmpLogic::onImplicitTaskBegin(bool isInitialImplicitTask, int actualSizeOfTeam, int indexInTeam,
4747
void* parallelDataPtr) {
4848

49-
ParallelData* parallelData = (ParallelData*) parallelDataPtr;
49+
ParallelData* parallelData = static_cast<ParallelData*>(parallelDataPtr);
5050

5151
// check if the handling of the parallel region was skipped
52-
if (parallelData != nullptr || initialImplicitTask) {
52+
if (parallelData != nullptr || isInitialImplicitTask) {
5353

54-
Data* data = new Data;
55-
data->initialImplicitTask = initialImplicitTask;
56-
data->level = omp_get_level();
57-
data->index = index;
54+
ImplicitTaskData* implicitTaskData = new ImplicitTaskData;
55+
implicitTaskData->isInitialImplicitTask = isInitialImplicitTask;
56+
implicitTaskData->level = omp_get_level();
57+
implicitTaskData->indexInTeam = indexInTeam;
5858

5959
// OpDiLib does not interfere with the initial implicit task AD-wise, e.g., does not track its tape / does not
6060
// assume that the tape does not change. OpDiLib uses the initial implicit task's data primarily to track its
6161
// adjoint access mode.
62-
if (!initialImplicitTask) {
63-
if (index == 0) {
64-
if (parallelData->maxThreads < actualParallelism) {
62+
if (!isInitialImplicitTask) {
63+
if (indexInTeam == 0) {
64+
if (parallelData->maximumSizeOfTeam < actualSizeOfTeam) {
6565
OPDI_ERROR("Actual number of threads exceeds maximum number of threads.");
6666
}
67-
parallelData->actualThreads = actualParallelism;
67+
parallelData->actualSizeOfTeam = actualSizeOfTeam;
6868
}
6969

70-
data->oldTape = tool->getThreadLocalTape();
71-
data->parallelData = parallelData;
70+
implicitTaskData->oldTape = tool->getThreadLocalTape();
71+
implicitTaskData->parallelData = parallelData;
7272

73-
void* newTape = this->tapePool.getTape(parallelData->parentTape, index);
73+
void* newTape = this->tapePool.getTape(parallelData->encounteringTaskTape, indexInTeam);
7474

75-
if (parallelData->activeParallelRegion) {
76-
//most recent tape activity change *per thread* reflects the current activity
77-
if (index == 0) {
78-
tool->setActive(data->oldTape, false); // suspend recording on encountering task's tape
75+
if (parallelData->isActiveParallelRegion) {
76+
// most recent tape activity change *per thread* reflects the current activity
77+
if (indexInTeam == 0) {
78+
tool->setActive(implicitTaskData->oldTape, false); // suspend recording on encountering task's tape
7979
}
8080
tool->setActive(newTape, true);
8181
}
8282

83-
data->tape = newTape;
83+
implicitTaskData->newTape = newTape;
8484

85-
data->positions.push_back(tool->allocPosition());
86-
tool->getTapePosition(newTape, data->positions.back());
85+
implicitTaskData->positions.push_back(tool->allocPosition());
86+
tool->getTapePosition(newTape, implicitTaskData->positions.back());
8787

8888
tool->setThreadLocalTape(newTape);
8989

90-
data->adjointAccessModes.push_back(parallelData->parentAdjointAccessMode);
90+
implicitTaskData->adjointAccessModes.push_back(parallelData->encounteringTaskAdjointAccessMode);
9191

92-
parallelData->childTasks[index] = data;
92+
parallelData->childTaskData[indexInTeam] = implicitTaskData;
9393
}
9494
else {
95-
data->oldTape = nullptr;
96-
data->tape = nullptr;
97-
data->parallelData = nullptr;
95+
implicitTaskData->oldTape = nullptr;
96+
implicitTaskData->newTape = nullptr;
97+
implicitTaskData->parallelData = nullptr;
9898

99-
data->adjointAccessModes.push_back(ImplicitTaskOmpLogic::defaultAdjointAccessMode);
99+
implicitTaskData->adjointAccessModes.push_back(ImplicitTaskOmpLogic::defaultAdjointAccessMode);
100100
}
101101

102102
#if OPDI_OMP_LOGIC_INSTRUMENT
103103
for (auto& instrument : ompLogicInstruments) {
104-
instrument->onImplicitTaskBegin(data);
104+
instrument->onImplicitTaskBegin(implicitTaskData);
105105
}
106106
#endif
107107

108-
return data;
108+
return static_cast<void*>(implicitTaskData);
109109
}
110110

111111
return nullptr;
112112
}
113113

114-
void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
114+
void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* implicitTaskDataPtr) {
115115

116-
if (dataPtr != nullptr) {
117-
Data* data = (Data*) dataPtr;
116+
if (implicitTaskDataPtr != nullptr) {
117+
118+
ImplicitTaskData* implicitTaskData = static_cast<ImplicitTaskData*>(implicitTaskDataPtr);
118119

119120
#if OPDI_OMP_LOGIC_INSTRUMENT
120121
for (auto& instrument : ompLogicInstruments) {
121-
instrument->onImplicitTaskEnd(data);
122+
instrument->onImplicitTaskEnd(implicitTaskData);
122123
}
123124
#endif
124125

125-
if (!data->initialImplicitTask) {
126-
tool->setThreadLocalTape(data->oldTape);
126+
if (!implicitTaskData->isInitialImplicitTask) {
127+
tool->setThreadLocalTape(implicitTaskData->oldTape);
127128

128-
data->positions.push_back(tool->allocPosition());
129-
tool->getTapePosition(data->tape, data->positions.back());
129+
implicitTaskData->positions.push_back(tool->allocPosition());
130+
tool->getTapePosition(implicitTaskData->newTape, implicitTaskData->positions.back());
130131

131-
if (!data->parallelData->activeParallelRegion) {
132-
if (tool->comparePosition(data->positions.front(), data->positions.back()) != 0) {
132+
if (!implicitTaskData->parallelData->isActiveParallelRegion) {
133+
if (tool->comparePosition(implicitTaskData->positions.front(), implicitTaskData->positions.back()) != 0) {
133134
OPDI_ERROR("Something became active during a passive parallel region. This is not supported and will not be",
134135
"differentiated correctly.");
135136
}
136137
}
137138
else {
138-
//most recent tape activity change *per thread* reflects the current activity
139-
tool->setActive(data->tape, false);
140-
if (data->index == 0) {
141-
tool->setActive(data->oldTape, true); // resume recording on encountering task's tape
139+
// most recent tape activity change *per thread* reflects the current activity
140+
tool->setActive(implicitTaskData->newTape, false);
141+
if (implicitTaskData->indexInTeam == 0) {
142+
tool->setActive(implicitTaskData->oldTape, true); // resume recording on encountering task's tape
142143
}
143144
}
144145

145146
// do not delete data, it is deleted as part of parallel regions
146147
}
147148
else {
148149
// delete task data, there is no parallel region to do so
149-
delete data;
150+
delete implicitTaskData;
150151
}
151152
}
152153
}
153154

154155
void opdi::ImplicitTaskOmpLogic::resetTask(void* position, opdi::LogicInterface::AdjointAccessMode mode) {
155156

156-
void* taskDataPtr = backend->getTaskData();
157+
void* implicitTaskDataPtr = backend->getTaskData();
157158

158-
if (taskDataPtr != nullptr) {
159-
opdi::ImplicitTaskOmpLogic::Data* taskData = reinterpret_cast<opdi::ImplicitTaskOmpLogic::Data*>(taskDataPtr);
159+
if (implicitTaskDataPtr != nullptr) {
160+
ImplicitTaskData* implicitTaskData = static_cast<ImplicitTaskData*>(implicitTaskDataPtr);
160161

161-
if (!taskData->initialImplicitTask) {
162-
assert(tool->comparePosition(taskData->positions.front(), position) <= 0);
162+
if (!implicitTaskData->isInitialImplicitTask) {
163+
assert(tool->comparePosition(implicitTaskData->positions.front(), position) <= 0);
163164

164-
while (tool->comparePosition(taskData->positions.back(), position) > 0) {
165-
taskData->positions.pop_back();
166-
taskData->adjointAccessModes.pop_back();
165+
while (tool->comparePosition(implicitTaskData->positions.back(), position) > 0) {
166+
implicitTaskData->positions.pop_back();
167+
implicitTaskData->adjointAccessModes.pop_back();
167168
}
168169
}
169170

170-
taskData->adjointAccessModes.back() = mode;
171+
implicitTaskData->adjointAccessModes.back() = mode;
171172
}
172173
}

include/opdi/logic/omp/implicitTaskOmpLogic.hpp

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@
3535

3636
namespace opdi {
3737

38+
struct ImplicitTaskData {
39+
public:
40+
bool isInitialImplicitTask;
41+
int level;
42+
int indexInTeam;
43+
void* oldTape;
44+
void* newTape;
45+
ParallelData* parallelData;
46+
std::deque<void*> positions;
47+
std::deque<LogicInterface::AdjointAccessMode> adjointAccessModes;
48+
};
49+
3850
struct ImplicitTaskOmpLogic : public virtual LogicInterface {
3951
protected:
4052
TapePool tapePool;
@@ -48,23 +60,9 @@ namespace opdi {
4860

4961
static AdjointAccessMode const defaultAdjointAccessMode;
5062

51-
using ParallelData = typename ParallelOmpLogic::Data;
52-
53-
struct Data {
54-
public:
55-
bool initialImplicitTask;
56-
int level;
57-
int index;
58-
void* oldTape;
59-
void* tape;
60-
ParallelData* parallelData;
61-
std::deque<void*> positions;
62-
std::deque<AdjointAccessMode> adjointAccessModes;
63-
};
64-
65-
virtual void* onImplicitTaskBegin(bool initialImplicitTask, int actualParallelism, int index,
66-
void* parallelDataPtr);
67-
virtual void onImplicitTaskEnd(void* dataPtr);
63+
virtual void* onImplicitTaskBegin(bool isInitialImplicitTask, int actualSizeOfTeam, int indexInTeam,
64+
void* parallelData);
65+
virtual void onImplicitTaskEnd(void* implicitTaskData);
6866

6967
virtual void resetTask(void* position, AdjointAccessMode mode);
7068
};

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

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

4646
virtual void reverseFlush() {}
4747

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*/) {}
51-
virtual void onImplicitTaskBegin(ImplicitTaskOmpLogic::Data* /*data*/) {}
52-
virtual void onImplicitTaskEnd(ImplicitTaskOmpLogic::Data* /*data*/) {}
48+
virtual void reverseImplicitTaskBegin(ImplicitTaskData* /*data*/) {}
49+
virtual void reverseImplicitTaskEnd(ImplicitTaskData* /*data*/) {}
50+
virtual void reverseImplicitTaskPart(ImplicitTaskData* /*data*/, std::size_t /*part*/) {}
51+
virtual void onImplicitTaskBegin(ImplicitTaskData* /*data*/) {}
52+
virtual void onImplicitTaskEnd(ImplicitTaskData* /*data*/) {}
5353

5454
virtual void reverseMutexWait(MutexOmpLogic::Data* /*data*/) {}
5555
virtual void reverseMutexDecrement(MutexOmpLogic::Data* /*data*/) {}
5656
virtual void onMutexDestroyed(LogicInterface::MutexKind /*kind*/, std::size_t /*waitId*/) {}
5757
virtual void onMutexAcquired(MutexOmpLogic::Data* /*data*/) {}
5858
virtual void onMutexReleased(MutexOmpLogic::Data* /*data*/) {}
5959

60-
virtual void reverseParallelBegin(ParallelOmpLogic::Data* /*data*/) {}
61-
virtual void reverseParallelEnd(ParallelOmpLogic::Data* /*data*/) {}
62-
virtual void onParallelBegin(ParallelOmpLogic::Data* /*data*/) {}
63-
virtual void onParallelEnd(ParallelOmpLogic::Data* /*data*/) {}
60+
virtual void reverseParallelBegin(ParallelData* /*data*/) {}
61+
virtual void reverseParallelEnd(ParallelData* /*data*/) {}
62+
virtual void onParallelBegin(ParallelData* /*data*/) {}
63+
virtual void onParallelEnd(ParallelData* /*data*/) {}
6464

6565
virtual void reverseSyncRegion(SyncRegionOmpLogic::Data* /*data*/) {}
6666
virtual void onSyncRegion(LogicInterface::SyncRegionKind /*kind*/, LogicInterface::ScopeEndpoint /*endpoint*/) {}

0 commit comments

Comments
 (0)