Merge pull request #9342 from alalek:fix_parallel_for

pull/9347/head
Alexander Alekhin 8 years ago
commit ef2b73043d
  1. 42
      modules/core/src/parallel.cpp

@ -363,6 +363,10 @@ static SchedPtr pplScheduler;
/* ================================ parallel_for_ ================================ */ /* ================================ parallel_for_ ================================ */
#ifdef CV_PARALLEL_FRAMEWORK
static void parallel_for_impl(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes); // forward declaration
#endif
void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes) void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes)
{ {
#ifdef OPENCV_TRACE #ifdef OPENCV_TRACE
@ -377,10 +381,35 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
return; return;
#ifdef CV_PARALLEL_FRAMEWORK #ifdef CV_PARALLEL_FRAMEWORK
static volatile int flagNestedParallelFor = 0;
bool isNotNestedRegion = flagNestedParallelFor == 0;
if (isNotNestedRegion)
isNotNestedRegion = CV_XADD(&flagNestedParallelFor, 1) == 0;
if (isNotNestedRegion)
{
try
{
parallel_for_impl(range, body, nstripes);
flagNestedParallelFor = 0;
}
catch (...)
{
flagNestedParallelFor = 0;
throw;
}
}
else // nested parallel_for_() calls are not parallelized
#endif // CV_PARALLEL_FRAMEWORK
{
(void)nstripes;
body(range);
}
}
static int flagNestedParallelFor = 0; #ifdef CV_PARALLEL_FRAMEWORK
bool isNotNesterParallelFor = CV_XADD(&flagNestedParallelFor, 1) == 0; static void parallel_for_impl(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes)
if(numThreads != 0 && isNotNesterParallelFor) {
if ((numThreads < 0 || numThreads > 1) && range.end - range.start > 1)
{ {
ParallelLoopBodyWrapperContext ctx(body, range, nstripes); ParallelLoopBodyWrapperContext ctx(body, range, nstripes);
ProxyLoopBody pbody(ctx); ProxyLoopBody pbody(ctx);
@ -388,7 +417,6 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
if( stripeRange.end - stripeRange.start == 1 ) if( stripeRange.end - stripeRange.start == 1 )
{ {
body(range); body(range);
flagNestedParallelFor = 0;
return; return;
} }
@ -444,16 +472,14 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
#error You have hacked and compiling with unsupported parallel framework #error You have hacked and compiling with unsupported parallel framework
#endif #endif
flagNestedParallelFor = 0;
} }
else else
#endif // CV_PARALLEL_FRAMEWORK
{ {
(void)nstripes;
body(range); body(range);
} }
} }
#endif // CV_PARALLEL_FRAMEWORK
int cv::getNumThreads(void) int cv::getNumThreads(void)
{ {

Loading…
Cancel
Save