3232
3333#include " parallelOmpLogic.hpp"
3434
35+ int opdi::ParallelOmpLogic::skipParallelHandling = 0 ;
36+
3537void 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,17 +116,20 @@ void opdi::ParallelOmpLogic::deleteFunc(void* dataPtr) {
108116 }
109117 }
110118
119+ --ParallelOmpLogic::skipParallelHandling;
120+
111121 delete [] data->tapes ;
112122 delete data;
113123}
114124
115125void * opdi::ParallelOmpLogic::onParallelBegin (int maxThreads) {
116126
117- if (tool->getThreadLocalTape () != nullptr && tool-> isActive (tool-> getThreadLocalTape ()) ) {
127+ if (tool->getThreadLocalTape () != nullptr && ParallelOmpLogic::skipParallelHandling == 0 ) {
118128
119129 Data* data = new Data;
120130
121131 data->maxThreads = maxThreads;
132+ data->activeParallelRegion = tool->isActive (tool->getThreadLocalTape ());
122133 data->masterTape = tool->getThreadLocalTape ();
123134 data->tapes = new void *[maxThreads]();
124135 data->positions .resize (maxThreads);
@@ -155,14 +166,20 @@ void opdi::ParallelOmpLogic::onParallelEnd(void* dataPtr) {
155166 }
156167 #endif
157168
158- Handle* handle = new Handle;
159- handle->data = (void *) data;
160- handle->reverseFunc = ParallelOmpLogic::reverseFunc;
161- handle->deleteFunc = ParallelOmpLogic::deleteFunc;
169+ if (data->activeParallelRegion ) {
170+
171+ Handle* handle = new Handle;
172+ handle->data = (void *) data;
173+ handle->reverseFunc = ParallelOmpLogic::reverseFunc;
174+ handle->deleteFunc = ParallelOmpLogic::deleteFunc;
162175
163- tool->pushExternalFunction (data->masterTape , handle);
176+ tool->pushExternalFunction (data->masterTape , handle);
164177
165- // do not delete data, it is deleted with the handle
178+ // do not delete data, it is deleted with the handle
179+
180+ } else {
181+ deleteFunc (data);
182+ }
166183 }
167184 #if OPDI_OMP_LOGIC_INSTRUMENT
168185 else {
0 commit comments