Skip to content

Commit f3a5087

Browse files
committed
Proper data deletion for passive parallel regions.
Mechanism to skip the handling of internal parallel regions.
1 parent 66191e3 commit f3a5087

2 files changed

Lines changed: 16 additions & 2 deletions

File tree

include/opdi/logic/omp/parallelOmpLogic.cpp

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

3333
#include "parallelOmpLogic.hpp"
3434

35+
int opdi::ParallelOmpLogic::skipParallelHandling = 0;
36+
3537
void opdi::ParallelOmpLogic::reverseFunc(void* dataPtr) {
3638

3739
Data* data = (Data*) dataPtr;
@@ -42,6 +44,8 @@ void opdi::ParallelOmpLogic::reverseFunc(void* dataPtr) {
4244
}
4345
#endif
4446

47+
++ParallelOmpLogic::skipParallelHandling;
48+
4549
#pragma omp parallel num_threads(data->actualThreads)
4650
{
4751
int threadNum = omp_get_thread_num();
@@ -70,6 +74,8 @@ void opdi::ParallelOmpLogic::reverseFunc(void* dataPtr) {
7074
data->adjointAccessModes[threadNum][j - 1] == AdjointAccessMode::Atomic);
7175
}
7276

77+
--ParallelOmpLogic::skipParallelHandling;
78+
7379
tool->setThreadLocalTape(oldTape);
7480

7581
#if OPDI_OMP_LOGIC_INSTRUMENT
@@ -90,6 +96,8 @@ void opdi::ParallelOmpLogic::deleteFunc(void* dataPtr) {
9096

9197
Data* data = (Data*) dataPtr;
9298

99+
++ParallelOmpLogic::skipParallelHandling;
100+
93101
// this triggers possibly pending implicit task end events
94102
#pragma omp parallel num_threads(data->actualThreads)
95103
{
@@ -108,13 +116,15 @@ void opdi::ParallelOmpLogic::deleteFunc(void* dataPtr) {
108116
}
109117
}
110118

119+
--ParallelOmpLogic::skipParallelHandling;
120+
111121
delete [] data->tapes;
112122
delete data;
113123
}
114124

115125
void* opdi::ParallelOmpLogic::onParallelBegin(int maxThreads) {
116126

117-
if (tool->getThreadLocalTape() != nullptr) {
127+
if (tool->getThreadLocalTape() != nullptr && ParallelOmpLogic::skipParallelHandling == 0) {
118128

119129
Data* data = new Data;
120130

@@ -166,8 +176,9 @@ void opdi::ParallelOmpLogic::onParallelEnd(void* dataPtr) {
166176
tool->pushExternalFunction(data->masterTape, handle);
167177

168178
// do not delete data, it is deleted with the handle
179+
169180
} else {
170-
delete data;
181+
deleteFunc(data);
171182
}
172183
}
173184
#if OPDI_OMP_LOGIC_INSTRUMENT

include/opdi/logic/omp/parallelOmpLogic.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ namespace opdi {
5757

5858
private:
5959

60+
static int skipParallelHandling;
61+
#pragma omp threadprivate(skipParallelHandling)
62+
6063
static void reverseFunc(void* dataPtr);
6164
static void deleteFunc(void* dataPtr);
6265

0 commit comments

Comments
 (0)