Skip to content

Commit 0ebabe1

Browse files
committed
core: fix flag processing for nested regions in cv::parallel_for_()
1 parent 87c27a0 commit 0ebabe1

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

modules/core/src/parallel.cpp

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,10 @@ static SchedPtr pplScheduler;
363363

364364
/* ================================ parallel_for_ ================================ */
365365

366+
#ifdef CV_PARALLEL_FRAMEWORK
367+
static void parallel_for_impl(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes); // forward declaration
368+
#endif
369+
366370
void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes)
367371
{
368372
#ifdef OPENCV_TRACE
@@ -377,18 +381,42 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
377381
return;
378382

379383
#ifdef CV_PARALLEL_FRAMEWORK
384+
static volatile int flagNestedParallelFor = 0;
385+
bool isNotNestedRegion = flagNestedParallelFor == 0;
386+
if (isNotNestedRegion)
387+
isNotNestedRegion = CV_XADD(&flagNestedParallelFor, 1) == 0;
388+
if (isNotNestedRegion)
389+
{
390+
try
391+
{
392+
parallel_for_impl(range, body, nstripes);
393+
flagNestedParallelFor = 0;
394+
}
395+
catch (...)
396+
{
397+
flagNestedParallelFor = 0;
398+
throw;
399+
}
400+
}
401+
else // nested parallel_for_() calls are not parallelized
402+
#endif // CV_PARALLEL_FRAMEWORK
403+
{
404+
(void)nstripes;
405+
body(range);
406+
}
407+
}
380408

381-
static int flagNestedParallelFor = 0;
382-
bool isNotNesterParallelFor = CV_XADD(&flagNestedParallelFor, 1) == 0;
383-
if(numThreads != 0 && isNotNesterParallelFor)
409+
#ifdef CV_PARALLEL_FRAMEWORK
410+
static void parallel_for_impl(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes)
411+
{
412+
if ((numThreads < 0 || numThreads > 1) && range.end - range.start > 1)
384413
{
385414
ParallelLoopBodyWrapperContext ctx(body, range, nstripes);
386415
ProxyLoopBody pbody(ctx);
387416
cv::Range stripeRange = pbody.stripeRange();
388417
if( stripeRange.end - stripeRange.start == 1 )
389418
{
390419
body(range);
391-
flagNestedParallelFor = 0;
392420
return;
393421
}
394422

@@ -444,16 +472,14 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
444472
#error You have hacked and compiling with unsupported parallel framework
445473

446474
#endif
447-
flagNestedParallelFor = 0;
448475
}
449476
else
450-
451-
#endif // CV_PARALLEL_FRAMEWORK
452477
{
453-
(void)nstripes;
454478
body(range);
455479
}
456480
}
481+
#endif // CV_PARALLEL_FRAMEWORK
482+
457483

458484
int cv::getNumThreads(void)
459485
{

0 commit comments

Comments
 (0)