@@ -55,28 +55,30 @@ void* opdi::ImplicitTaskOmpLogic::onImplicitTaskBegin(int actualParallelism, int
5555 data->oldTape = tool->getThreadLocalTape ();
5656 data->parallelData = parallelData;
5757
58- void * newTape = this ->tapePool .getTape (parallelData->masterTape , index);
58+ void * newTape = this ->tapePool .getTape (parallelData->parentTape , index);
5959
6060 if (parallelData->activeParallelRegion ) {
6161 tool->setActive (newTape, true );
6262 }
6363
64- data->parallelData -> tapes [index] = newTape;
64+ data->tape = newTape;
6565
66- data->parallelData -> positions [index] .push_back (tool->allocPosition ());
67- tool->getTapePosition (newTape, data->parallelData -> positions [index] .back ());
66+ data->positions .push_back (tool->allocPosition ());
67+ tool->getTapePosition (newTape, data->positions .back ());
6868
6969 tool->setThreadLocalTape (newTape);
7070
71- AdjointAccessControl::pushMode (data-> parallelData ->outerAdjointAccessMode );
72- data->parallelData -> adjointAccessModes [index] .push_back (data-> parallelData ->outerAdjointAccessMode );
71+ AdjointAccessControl::pushMode (parallelData->parentAdjointAccessMode );
72+ data->adjointAccessModes .push_back (parallelData->parentAdjointAccessMode );
7373
7474 #if OPDI_OMP_LOGIC_INSTRUMENT
7575 for (auto & instrument : ompLogicInstruments) {
7676 instrument->onImplicitTaskBegin (data);
7777 }
7878 #endif
7979
80+ parallelData->childTasks [index] = data;
81+
8082 return data;
8183 }
8284
@@ -94,13 +96,11 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
9496
9597 tool->setThreadLocalTape (data->oldTape );
9698
97- data->parallelData ->positions [data->index ].push_back (tool->allocPosition ());
98- tool->getTapePosition (data->parallelData ->tapes [data->index ],
99- data->parallelData ->positions [data->index ].back ());
99+ data->positions .push_back (tool->allocPosition ());
100+ tool->getTapePosition (data->tape , data->positions .back ());
100101
101102 if (!data->parallelData ->activeParallelRegion ) {
102- if (tool->comparePosition (data->parallelData ->positions [data->index ].front (),
103- data->parallelData ->positions [data->index ].back ()) != 0 ) {
103+ if (tool->comparePosition (data->positions .front (), data->positions .back ()) != 0 ) {
104104 OPDI_WARNING (" Something became active during a passive parallel region. This is not supported and will not be " ,
105105 " differentiated correctly." );
106106 }
@@ -112,12 +112,13 @@ void opdi::ImplicitTaskOmpLogic::onImplicitTaskEnd(void* dataPtr) {
112112 }
113113 #endif
114114
115- tool->setActive (data->parallelData -> tapes [data-> index ] , false );
115+ tool->setActive (data->tape , false );
116116
117- if (data->oldTape == data->parallelData ->masterTape && data->parallelData ->activeParallelRegion ) {
117+ // ensure that the most recent activity change *per thread* reflects the current activity
118+ if (data->oldTape == data->parallelData ->parentTape && data->parallelData ->activeParallelRegion ) {
118119 tool->setActive (data->oldTape , true );
119120 }
120121
121- delete data;
122+ // do not delete data, it is deleted as part of parallel regions
122123 }
123124}
0 commit comments