mirror of
https://github.com/opencv/opencv.git
synced 2025-08-06 14:36:36 +08:00
Fallback to single threaded version of IPP gaussian blur / bilateral filter when the mutlithreaded version cannot be called.
This commit is contained in:
parent
d22fb5f949
commit
f743603b0a
@ -2241,6 +2241,7 @@ static bool openvx_gaussianBlur(InputArray _src, OutputArray _dst, Size ksize,
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_IPP
|
||||
#define IPP_DISABLE_FILTERING_INMEM_PARTIAL 1 // IW 2017u2 has bug which doesn't allow use of partial inMem with tiling
|
||||
#define IPP_GAUSSIANBLUR_PARALLEL 1
|
||||
|
||||
#ifdef HAVE_IPP_IW
|
||||
@ -2319,26 +2320,23 @@ static bool ipp_GaussianBlur(InputArray _src, OutputArray _dst, Size ksize,
|
||||
if(!ippBorder.m_borderType)
|
||||
return false;
|
||||
|
||||
// IW 2017u2 has bug which doesn't allow use of partial inMem with tiling
|
||||
if((((ippBorder.m_borderFlags)&ippBorderInMem) && ((ippBorder.m_borderFlags)&ippBorderInMem) != ippBorderInMem)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ok;
|
||||
ipp_gaussianBlurParallel invoker(iwSrc, iwDst, ksize.width, (float) sigma1, ippBorder, &ok);
|
||||
|
||||
if(!ok)
|
||||
return false;
|
||||
|
||||
const Range range(0, (int) iwDst.m_size.height);
|
||||
const bool disableThreading = IPP_DISABLE_FILTERING_INMEM_PARTIAL &&
|
||||
((ippBorder.m_borderFlags)&ippBorderInMem) && ((ippBorder.m_borderFlags)&ippBorderInMem) != ippBorderInMem;
|
||||
const int threads = ippiSuggestThreadsNum(iwDst, 2);
|
||||
if(IPP_GAUSSIANBLUR_PARALLEL && threads > 1)
|
||||
parallel_for_(range, invoker, threads*4);
|
||||
else
|
||||
invoker(range);
|
||||
if(!disableThreading && IPP_GAUSSIANBLUR_PARALLEL && threads > 1) {
|
||||
bool ok;
|
||||
ipp_gaussianBlurParallel invoker(iwSrc, iwDst, ksize.width, (float) sigma1, ippBorder, &ok);
|
||||
|
||||
if(!ok)
|
||||
return false;
|
||||
if(!ok)
|
||||
return false;
|
||||
const Range range(0, (int) iwDst.m_size.height);
|
||||
parallel_for_(range, invoker, threads*4);
|
||||
|
||||
if(!ok)
|
||||
return false;
|
||||
} else {
|
||||
CV_INSTRUMENT_FUN_IPP(::ipp::iwiFilterGaussian, &iwSrc, &iwDst, ksize.width, (float) sigma1, ippBorder);
|
||||
}
|
||||
}
|
||||
catch (::ipp::IwException ex)
|
||||
{
|
||||
@ -4321,24 +4319,23 @@ static bool ipp_bilateralFilter(Mat &src, Mat &dst, int d, double sigmaColor, do
|
||||
if(!ippBorder.m_borderType)
|
||||
return false;
|
||||
|
||||
// IW 2017u2 has bug which doesn't allow use of partial inMem with tiling
|
||||
if((((ippBorder.m_borderFlags)&ippBorderInMem) && ((ippBorder.m_borderFlags)&ippBorderInMem) != ippBorderInMem))
|
||||
return false;
|
||||
const bool disableThreading = IPP_DISABLE_FILTERING_INMEM_PARTIAL &&
|
||||
((ippBorder.m_borderFlags)&ippBorderInMem) && ((ippBorder.m_borderFlags)&ippBorderInMem) != ippBorderInMem;
|
||||
const int threads = ippiSuggestThreadsNum(iwDst, 2);
|
||||
if(!disableThreading && IPP_BILATERAL_PARALLEL && threads > 1) {
|
||||
bool ok = true;
|
||||
Range range(0, (int)iwDst.m_size.height);
|
||||
ipp_bilateralFilterParallel invoker(iwSrc, iwDst, radius, valSquareSigma, posSquareSigma, ippBorder, &ok);
|
||||
if(!ok)
|
||||
return false;
|
||||
|
||||
bool ok = true;
|
||||
int threads = ippiSuggestThreadsNum(iwDst, 2);
|
||||
Range range(0, (int)iwDst.m_size.height);
|
||||
ipp_bilateralFilterParallel invoker(iwSrc, iwDst, radius, valSquareSigma, posSquareSigma, ippBorder, &ok);
|
||||
if(!ok)
|
||||
return false;
|
||||
|
||||
if(IPP_BILATERAL_PARALLEL && threads > 1)
|
||||
parallel_for_(range, invoker, threads*4);
|
||||
else
|
||||
invoker(range);
|
||||
|
||||
if(!ok)
|
||||
return false;
|
||||
if(!ok)
|
||||
return false;
|
||||
} else {
|
||||
CV_INSTRUMENT_FUN_IPP(::ipp::iwiFilterBilateral, &iwSrc, &iwDst, radius, valSquareSigma, posSquareSigma, ippiFilterBilateralGauss, ippDistNormL1, ippBorder);
|
||||
}
|
||||
}
|
||||
catch (::ipp::IwException)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user