Merge pull request #9342 from alalek:fix_parallel_for
This commit is contained in:
commit
ef2b73043d
@ -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…
Reference in New Issue
Block a user