Skip to content

Commit 57639ff

Browse files
committed
Fix adjoint access mode propagation, resetting tasks and mode recovery.
Track adjoint access mode entirely via tasks. Re-enable disabled Single* tests. Extend output instrument. Add tests' error output files to gitignore. Merge branch 'fix/adjointAccessMode' into develop
2 parents 3bf83ff + 3c8e7af commit 57639ff

31 files changed

Lines changed: 796 additions & 119 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
**/*.out
2+
**/*.err

include/opdi/logic/logicInterface.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@ namespace opdi {
8383
virtual void freeState(void* state) = 0;
8484
virtual void recoverState(void* state) = 0;
8585

86-
virtual void setAdjointAccessMode(AdjointAccessMode adjointAccess) = 0;
87-
virtual AdjointAccessMode getAdjointAccessMode() = 0;
86+
virtual void setAdjointAccessMode(AdjointAccessMode mode) = 0;
87+
virtual AdjointAccessMode getAdjointAccessMode() const = 0;
88+
89+
virtual void resetTask(void* position, AdjointAccessMode mode) = 0;
8890

8991
virtual void addReverseBarrier() = 0;
9092
virtual void addReverseFlush() = 0;

include/opdi/logic/omp/adjointAccessControl.hpp

Lines changed: 0 additions & 62 deletions
This file was deleted.

include/opdi/logic/omp/implicitTaskOmpLogic.cpp

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
*
2424
*/
2525

26+
#include <cassert>
27+
28+
#include "../../backend/backendInterface.hpp"
2629
#include "../../config.hpp"
2730
#include "../../helpers/exceptions.hpp"
2831
#include "../../tool/toolInterface.hpp"
@@ -77,7 +80,6 @@ void* opdi::ImplicitTaskOmpLogic::onImplicitTaskBegin(bool initialImplicitTask,
7780

7881
tool->setThreadLocalTape(newTape);
7982

80-
AdjointAccessControl::pushMode(parallelData->parentAdjointAccessMode);
8183
data->adjointAccessModes.push_back(parallelData->parentAdjointAccessMode);
8284

8385
parallelData->childTasks[index] = data;
@@ -113,10 +115,6 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
113115
}
114116
#endif
115117

116-
AdjointAccessMode lastAccessMode = AdjointAccessControl::currentMode();
117-
AdjointAccessControl::popMode();
118-
AdjointAccessControl::currentMode() = lastAccessMode;
119-
120118
if (!data->initialImplicitTask) {
121119
tool->setThreadLocalTape(data->oldTape);
122120

@@ -125,8 +123,8 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
125123

126124
if (!data->parallelData->activeParallelRegion) {
127125
if (tool->comparePosition(data->positions.front(), data->positions.back()) != 0) {
128-
OPDI_WARNING("Something became active during a passive parallel region. This is not supported and will not be ",
129-
"differentiated correctly.");
126+
OPDI_WARNING("Something became active during a passive parallel region. This is not supported and will not ",
127+
"be differentiated correctly.");
130128
}
131129
}
132130

@@ -145,3 +143,23 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
145143
}
146144
}
147145
}
146+
147+
void opdi::ImplicitTaskOmpLogic::resetTask(void* position, opdi::LogicInterface::AdjointAccessMode mode) {
148+
149+
void* taskDataPtr = backend->getTaskData();
150+
151+
if (taskDataPtr != nullptr) {
152+
opdi::ImplicitTaskOmpLogic::Data* taskData = reinterpret_cast<opdi::ImplicitTaskOmpLogic::Data*>(taskDataPtr);
153+
154+
if (!taskData->initialImplicitTask) {
155+
assert(tool->comparePosition(taskData->positions.front(), position) <= 0);
156+
157+
while (tool->comparePosition(taskData->positions.back(), position) > 0) {
158+
taskData->positions.pop_back();
159+
taskData->adjointAccessModes.pop_back();
160+
}
161+
}
162+
163+
taskData->adjointAccessModes.back() = mode;
164+
}
165+
}

include/opdi/logic/omp/implicitTaskOmpLogic.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,11 @@
3131

3232
#include "../logicInterface.hpp"
3333

34-
#include "adjointAccessControl.hpp"
3534
#include "parallelOmpLogic.hpp"
3635

3736
namespace opdi {
3837

39-
struct ImplicitTaskOmpLogic : public virtual LogicInterface,
40-
public virtual AdjointAccessControl {
38+
struct ImplicitTaskOmpLogic : public virtual LogicInterface {
4139
protected:
4240
TapePool tapePool;
4341

@@ -67,5 +65,7 @@ namespace opdi {
6765
virtual void* onImplicitTaskBegin(bool initialImplicitTask, int actualParallelism, int index,
6866
void* parallelDataPtr);
6967
virtual void onImplicitTaskEnd(void* dataPtr);
68+
69+
virtual void resetTask(void* position, AdjointAccessMode mode);
7070
};
7171
}

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ namespace opdi {
7171
TapedOutput::print("F IMTB l", data->level,
7272
"t", data->index,
7373
"tape", data->tape,
74-
"pos", tool->positionToString(data->positions.back()));
74+
"pos", tool->positionToString(data->positions.back()),
75+
"mode", data->adjointAccessModes[0]);
7576
}
7677
}
7778

@@ -83,7 +84,8 @@ namespace opdi {
8384
TapedOutput::print("F IMTE l", data->level,
8485
"t", data->index,
8586
"tape", data->tape,
86-
"pos", tool->positionToString(data->positions.back()));
87+
"pos", tool->positionToString(data->positions.back()),
88+
"mode", data->adjointAccessModes.back());
8789
}
8890
}
8991

@@ -124,27 +126,32 @@ namespace opdi {
124126

125127
virtual void reverseParallelBegin(ParallelOmpLogic::Data* data) {
126128
TapedOutput::print("R PARB l", omp_get_level(),
129+
"t", omp_get_thread_num(),
127130
"parent", data->parentTape);
128131
}
129132

130133
virtual void reverseParallelEnd(ParallelOmpLogic::Data* data) {
131134
TapedOutput::print("R PARE l", omp_get_level(),
135+
"t", omp_get_thread_num(),
132136
"parent", data->parentTape);
133137
}
134138

135139
virtual void onParallelBegin(ParallelOmpLogic::Data* data) {
136140
if (data == nullptr) {
137141
TapedOutput::print("F PARB l", omp_get_level(),
142+
"t", omp_get_thread_num(),
138143
"(skipped)");
139144
}
140145
else if (!data->activeParallelRegion) {
141146
TapedOutput::print("F PARB l", omp_get_level(),
147+
"t", omp_get_thread_num(),
142148
"parent", data->parentTape,
143149
"mode", data->parentAdjointAccessMode,
144150
"(passive)");
145151
}
146152
else {
147153
TapedOutput::print("F PARB l", omp_get_level(),
154+
"t", omp_get_thread_num(),
148155
"parent", data->parentTape,
149156
"mode", data->parentAdjointAccessMode);
150157
}
@@ -153,16 +160,19 @@ namespace opdi {
153160
virtual void onParallelEnd(ParallelOmpLogic::Data* data) {
154161
if (data == nullptr) {
155162
TapedOutput::print("F PARE l", omp_get_level(),
163+
"t", omp_get_thread_num(),
156164
"(skipped)");
157165
}
158166
else if (!data->activeParallelRegion) {
159167
TapedOutput::print("F PARE l", omp_get_level(),
168+
"t", omp_get_thread_num(),
160169
"parent", data->parentTape,
161170
"mode", data->parentAdjointAccessMode,
162171
"(passive)");
163172
}
164173
else {
165174
TapedOutput::print("F PARE l", omp_get_level(),
175+
"t", omp_get_thread_num(),
166176
"parent", data->parentTape,
167177
"mode", data->parentAdjointAccessMode);
168178
}

include/opdi/logic/omp/ompLogic.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,11 @@
2424
*/
2525

2626
#include "instrument/ompLogicInstrumentInterface.hpp"
27-
#include "adjointAccessControl.hpp"
2827

2928
#if OPDI_DEFAULT_ADJOINT_ACCESS_MODE == OPDI_ADJOINT_ACCESS_ATOMIC
30-
std::list<opdi::LogicInterface::AdjointAccessMode> opdi::AdjointAccessControl::currentAdjointAccess
31-
{opdi::LogicInterface::AdjointAccessMode::Atomic};
32-
3329
opdi::LogicInterface::AdjointAccessMode const opdi::ImplicitTaskOmpLogic::defaultAdjointAccessMode
3430
= opdi::LogicInterface::AdjointAccessMode::Atomic;
3531
#elif OPDI_DEFAULT_ADJOINT_ACCESS_MODE == OPDI_ADJOINT_ACCESS_CLASSICAL
36-
std::list<opdi::LogicInterface::AdjointAccessMode> opdi::AdjointAccessControl::currentAdjointAccess
37-
{opdi::LogicInterface::AdjointAccessMode::Classical};
38-
3932
opdi::LogicInterface::AdjointAccessMode const opdi::ImplicitTaskOmpLogic::defaultAdjointAccessMode
4033
= opdi::LogicInterface::AdjointAccessMode::Classical;
4134
#else

include/opdi/logic/omp/ompLogic.hpp

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

3333
#include "../logicInterface.hpp"
3434

35-
#include "adjointAccessControl.hpp"
3635
#include "flushOmpLogic.hpp"
3736
#include "implicitTaskOmpLogic.hpp"
3837
#include "masterOmpLogic.hpp"
@@ -50,7 +49,6 @@ namespace opdi {
5049
public ParallelOmpLogic,
5150
public SyncRegionOmpLogic,
5251
public WorkOmpLogic,
53-
public virtual AdjointAccessControl,
5452
public virtual LogicInterface
5553
{
5654
public:

0 commit comments

Comments
 (0)