Skip to content

Commit 0f37b41

Browse files
committed
Move treatment for parallel + firstprivate to the logic layer.
Transfer recordings to active parallel regions only.
1 parent fec99df commit 0f37b41

4 files changed

Lines changed: 33 additions & 33 deletions

File tree

include/opdi/backend/macro/probes.hpp

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -41,48 +41,19 @@ namespace opdi {
4141

4242
void* parallelData;
4343
void* taskData;
44-
void* masterPosition;
4544
bool needsAction;
4645

47-
TaskProbe() : parallelData(nullptr), taskData(nullptr), needsAction(false) {
48-
this->masterPosition = tool->allocPosition();
49-
opdi::tool->getTapePosition(tool->getThreadLocalTape(), this->masterPosition);
50-
}
46+
TaskProbe() : parallelData(nullptr), taskData(nullptr), needsAction(false) {}
5147

52-
TaskProbe(void* parallelData) : parallelData(parallelData), taskData(nullptr), needsAction(false) {
53-
this->masterPosition = tool->allocPosition();
54-
tool->getTapePosition(tool->getThreadLocalTape(), this->masterPosition);
55-
}
48+
TaskProbe(void* parallelData) : parallelData(parallelData), taskData(nullptr), needsAction(false) {}
5649

5750
TaskProbe(TaskProbe const& other) : parallelData(other.parallelData), needsAction(true) {
5851

59-
this->masterPosition = tool->allocPosition();
60-
if (omp_get_thread_num() == 0) {
61-
tool->copyPosition(this->masterPosition, other.masterPosition);
62-
}
63-
else {
64-
tool->getZeroPosition(tool->getThreadLocalTape(), this->masterPosition);
65-
}
66-
67-
void* oldTape = tool->getThreadLocalTape();
68-
69-
void* currentPosition = tool->allocPosition();
70-
tool->getTapePosition(oldTape, currentPosition);
71-
7252
DataTools::pushParallelData(this->parallelData);
7353
this->taskData = logic->onImplicitTaskBegin(false, omp_get_num_threads(), omp_get_thread_num(),
7454
this->parallelData);
7555
DataTools::pushTaskData(this->taskData);
7656

77-
// check if copy statements have been recorded before the correct tape was set
78-
// if so, move them to the correct tape
79-
if (tool->comparePosition(currentPosition, masterPosition) > 0) {
80-
tool->append(tool->getThreadLocalTape(), oldTape, masterPosition, currentPosition);
81-
tool->erase(oldTape, masterPosition, currentPosition);
82-
}
83-
84-
tool->freePosition(currentPosition);
85-
8657
ProbeScopeStatus::beginImplicitTaskProbeScope();
8758
}
8859

@@ -93,8 +64,6 @@ namespace opdi {
9364
DataTools::popTaskData();
9465
DataTools::popParallelData();
9566
}
96-
97-
tool->freePosition(this->masterPosition);
9867
}
9968
};
10069

include/opdi/logic/omp/implicitTaskOmpLogic.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,32 @@ void* opdi::ImplicitTaskOmpLogic::onImplicitTaskBegin(bool isInitialImplicitTask
9090
implicitTaskData->adjointAccessModes.push_back(parallelData->encounteringTaskAdjointAccessMode);
9191

9292
parallelData->childTaskData[indexInTeam] = implicitTaskData;
93+
94+
// check for copies due to firstprivate/copyin that were recorded on the wrong tapes
95+
// move them to the correct tapes if needed
96+
97+
void* oldTapePosition = tool->allocPosition();
98+
tool->getTapePosition(implicitTaskData->oldTape, oldTapePosition);
99+
100+
void* referencePosition = tool->allocPosition();
101+
if (indexInTeam == 0) {
102+
tool->copyPosition(referencePosition, parallelData->encounteringTaskTapePosition);
103+
}
104+
else {
105+
tool->getZeroPosition(implicitTaskData->oldTape, referencePosition);
106+
}
107+
108+
if (tool->comparePosition(oldTapePosition, referencePosition) > 0) {
109+
// appending to new tape depends on activity
110+
if (parallelData->isActiveParallelRegion) {
111+
tool->append(newTape, implicitTaskData->oldTape, referencePosition, oldTapePosition);
112+
}
113+
// erasing on old tape does not (non-primary threads have active default tapes to not miss such copies)
114+
tool->erase(implicitTaskData->oldTape, referencePosition, oldTapePosition);
115+
}
116+
117+
tool->freePosition(referencePosition);
118+
tool->freePosition(oldTapePosition);
93119
}
94120
else {
95121
implicitTaskData->oldTape = nullptr;

include/opdi/logic/omp/parallelOmpLogic.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ void opdi::ParallelOmpLogic::deleteFunc(void* parallelDataPtr) {
136136

137137
--ParallelOmpLogic::skipParallelHandling;
138138

139+
tool->freePosition(parallelData->encounteringTaskTapePosition);
140+
139141
// delete data of the parallel region
140142
delete parallelData;
141143
}
@@ -180,6 +182,8 @@ void* opdi::ParallelOmpLogic::onParallelBegin(void* encounteringTaskDataPtr, int
180182
parallelData->isActiveParallelRegion = tool->isActive(tool->getThreadLocalTape());
181183
parallelData->encounteringTaskData = encounteringTaskData;
182184
parallelData->encounteringTaskTape = tool->getThreadLocalTape();
185+
parallelData->encounteringTaskTapePosition = tool->allocPosition();
186+
tool->getTapePosition(parallelData->encounteringTaskTape, parallelData->encounteringTaskTapePosition);
183187
parallelData->encounteringTaskAdjointAccessMode = internalGetAdjointAccessMode(encounteringTaskData);
184188
parallelData->childTaskData.resize(maximumSizeOfTeam);
185189

include/opdi/logic/omp/parallelOmpLogic.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ namespace opdi {
4242
bool isActiveParallelRegion;
4343
ImplicitTaskData* encounteringTaskData;
4444
void* encounteringTaskTape;
45+
void* encounteringTaskTapePosition;
4546
LogicInterface::AdjointAccessMode encounteringTaskAdjointAccessMode;
4647
std::vector<ImplicitTaskData*> childTaskData;
4748
};

0 commit comments

Comments
 (0)