Merge pull request #12877 from maver1:3.4
* Updated ICV packages and IPP integration * core(test): minMaxIdx IPP regression test * core(ipp): workaround minMaxIdx problem * core(ipp): workaround meanStdDev() CV_32FC3 buffer overrun * Returned semicolon after CV_INSTRUMENT_REGION_IPP()
This commit is contained in:
committed by
Alexander Alekhin
parent
c8fc8d210b
commit
e397434cb6
@@ -767,9 +767,13 @@ CV_EXPORTS_W void setUseIPP(bool flag);
|
||||
CV_EXPORTS_W String getIppVersion();
|
||||
|
||||
// IPP Not-Exact mode. This function may force use of IPP then both IPP and OpenCV provide proper results
|
||||
// but have internal accuracy differences which have to much direct or indirect impact on accuracy tests.
|
||||
// but have internal accuracy differences which have too much direct or indirect impact on accuracy tests.
|
||||
CV_EXPORTS_W bool useIPP_NotExact();
|
||||
CV_EXPORTS_W void setUseIPP_NotExact(bool flag);
|
||||
#if OPENCV_ABI_COMPATIBILITY < 400
|
||||
CV_EXPORTS_W bool useIPP_NE();
|
||||
CV_EXPORTS_W void setUseIPP_NE(bool flag);
|
||||
#endif
|
||||
|
||||
} // ipp
|
||||
|
||||
|
||||
@@ -194,8 +194,8 @@ T* allocSingleton(size_t count = 1) { return static_cast<T*>(allocSingletonBuffe
|
||||
#define IPP_DISABLE_LAB_RGB 1 // breaks OCL accuracy tests
|
||||
#define IPP_DISABLE_RGB_XYZ 1 // big accuracy difference
|
||||
#define IPP_DISABLE_XYZ_RGB 1 // big accuracy difference
|
||||
#define IPP_DISABLE_HAAR 1 // improper integration/results
|
||||
#define IPP_DISABLE_HOUGH 1 // improper integration/results
|
||||
#define IPP_DISABLE_FILTER2D_BIG_MASK 1 // different results on masks > 7x7
|
||||
|
||||
#define IPP_DISABLE_GAUSSIANBLUR_PARALLEL 1 // not supported (2017u2 / 2017u3)
|
||||
|
||||
@@ -229,7 +229,9 @@ T* allocSingleton(size_t count = 1) { return static_cast<T*>(allocSingletonBuffe
|
||||
# pragma GCC diagnostic ignored "-Wsuggest-override"
|
||||
# endif
|
||||
#include "iw++/iw.hpp"
|
||||
# ifdef HAVE_IPP_IW_LL
|
||||
#include "iw/iw_ll.h"
|
||||
# endif
|
||||
# if defined(__OPENCV_BUILD) && defined(__GNUC__) && __GNUC__ >= 5
|
||||
# pragma GCC diagnostic pop
|
||||
# endif
|
||||
|
||||
@@ -341,7 +341,7 @@ namespace cv
|
||||
{
|
||||
static bool ipp_extractChannel(const Mat &src, Mat &dst, int channel)
|
||||
{
|
||||
#ifdef HAVE_IPP_IW
|
||||
#ifdef HAVE_IPP_IW_LL
|
||||
CV_INSTRUMENT_REGION_IPP();
|
||||
|
||||
int srcChannels = src.channels();
|
||||
@@ -379,7 +379,7 @@ static bool ipp_extractChannel(const Mat &src, Mat &dst, int channel)
|
||||
|
||||
static bool ipp_insertChannel(const Mat &src, Mat &dst, int channel)
|
||||
{
|
||||
#ifdef HAVE_IPP_IW
|
||||
#ifdef HAVE_IPP_IW_LL
|
||||
CV_INSTRUMENT_REGION_IPP();
|
||||
|
||||
int srcChannels = src.channels();
|
||||
|
||||
@@ -328,7 +328,7 @@ void Mat::copyTo( OutputArray _dst ) const
|
||||
#ifdef HAVE_IPP
|
||||
static bool ipp_copyTo(const Mat &src, Mat &dst, const Mat &mask)
|
||||
{
|
||||
#ifdef HAVE_IPP_IW
|
||||
#ifdef HAVE_IPP_IW_LL
|
||||
CV_INSTRUMENT_REGION_IPP();
|
||||
|
||||
if(mask.channels() > 1 || mask.depth() != CV_8U)
|
||||
@@ -463,7 +463,7 @@ Mat& Mat::operator = (const Scalar& s)
|
||||
#ifdef HAVE_IPP
|
||||
static bool ipp_Mat_setTo_Mat(Mat &dst, Mat &_val, Mat &mask)
|
||||
{
|
||||
#ifdef HAVE_IPP_IW
|
||||
#ifdef HAVE_IPP_IW_LL
|
||||
CV_INSTRUMENT_REGION_IPP();
|
||||
|
||||
if(mask.empty())
|
||||
@@ -1152,7 +1152,7 @@ namespace cv {
|
||||
static bool ipp_copyMakeBorder( Mat &_src, Mat &_dst, int top, int bottom,
|
||||
int left, int right, int _borderType, const Scalar& value )
|
||||
{
|
||||
#if defined HAVE_IPP_IW && !IPP_DISABLE_PERF_COPYMAKE
|
||||
#if defined HAVE_IPP_IW_LL && !IPP_DISABLE_PERF_COPYMAKE
|
||||
CV_INSTRUMENT_REGION_IPP();
|
||||
|
||||
::ipp::IwiBorderSize borderSize(left, top, right, bottom);
|
||||
|
||||
@@ -674,6 +674,11 @@ static bool ipp_meanStdDev(Mat& src, OutputArray _mean, OutputArray _sdv, Mat& m
|
||||
if (cn > 1)
|
||||
return false;
|
||||
#endif
|
||||
#if IPP_VERSION_X100 < 201901
|
||||
// IPP_DISABLE: 32f C3C functions can read outside of allocated memory
|
||||
if (cn > 1 && src.depth() == CV_32F)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
size_t total_size = src.total();
|
||||
int rows = src.size[0], cols = rows ? (int)(total_size/rows) : 0;
|
||||
|
||||
@@ -228,7 +228,7 @@ static MergeFunc getMergeFunc(int depth)
|
||||
namespace cv {
|
||||
static bool ipp_merge(const Mat* mv, Mat& dst, int channels)
|
||||
{
|
||||
#ifdef HAVE_IPP_IW
|
||||
#ifdef HAVE_IPP_IW_LL
|
||||
CV_INSTRUMENT_REGION_IPP();
|
||||
|
||||
if(channels != 3 && channels != 4)
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include "opencv2/core/openvx/ovx_defs.hpp"
|
||||
#include "stat.hpp"
|
||||
|
||||
#define IPP_DISABLE_MINMAXIDX_MANY_ROWS 1 // see Core_MinMaxIdx.rows_overflow test
|
||||
|
||||
/****************************************************************************************\
|
||||
* minMaxLoc *
|
||||
\****************************************************************************************/
|
||||
@@ -624,6 +626,10 @@ static bool ipp_minMaxIdx(Mat &src, double* _minVal, double* _maxVal, int* _minI
|
||||
if(src.dims <= 2)
|
||||
{
|
||||
IppiSize size = ippiSize(src.size());
|
||||
#if defined(_WIN32) && !defined(_WIN64) && IPP_VERSION_X100 == 201900 && IPP_DISABLE_MINMAXIDX_MANY_ROWS
|
||||
if (size.height > 65536)
|
||||
return false; // test: Core_MinMaxIdx.rows_overflow
|
||||
#endif
|
||||
size.width *= src.channels();
|
||||
|
||||
status = ippMinMaxFun(src.ptr(), (int)src.step, size, dataType, pMinVal, pMaxVal, pMinIdx, pMaxIdx, (Ipp8u*)mask.ptr(), (int)mask.step);
|
||||
|
||||
@@ -236,7 +236,7 @@ static SplitFunc getSplitFunc(int depth)
|
||||
namespace cv {
|
||||
static bool ipp_split(const Mat& src, Mat* mv, int channels)
|
||||
{
|
||||
#ifdef HAVE_IPP_IW
|
||||
#ifdef HAVE_IPP_IW_LL
|
||||
CV_INSTRUMENT_REGION_IPP();
|
||||
|
||||
if(channels != 3 && channels != 4)
|
||||
|
||||
@@ -2078,7 +2078,12 @@ public:
|
||||
cv::String env = pIppEnv;
|
||||
if(env.size())
|
||||
{
|
||||
#if IPP_VERSION_X100 >= 201703
|
||||
#if IPP_VERSION_X100 >= 201900
|
||||
const Ipp64u minorFeatures = ippCPUID_MOVBE|ippCPUID_AES|ippCPUID_CLMUL|ippCPUID_ABR|ippCPUID_RDRAND|ippCPUID_F16C|
|
||||
ippCPUID_ADCOX|ippCPUID_RDSEED|ippCPUID_PREFETCHW|ippCPUID_SHA|ippCPUID_MPX|ippCPUID_AVX512CD|ippCPUID_AVX512ER|
|
||||
ippCPUID_AVX512PF|ippCPUID_AVX512BW|ippCPUID_AVX512DQ|ippCPUID_AVX512VL|ippCPUID_AVX512VBMI|ippCPUID_AVX512_4FMADDPS|
|
||||
ippCPUID_AVX512_4VNNIW|ippCPUID_AVX512IFMA;
|
||||
#elif IPP_VERSION_X100 >= 201703
|
||||
const Ipp64u minorFeatures = ippCPUID_MOVBE|ippCPUID_AES|ippCPUID_CLMUL|ippCPUID_ABR|ippCPUID_RDRAND|ippCPUID_F16C|
|
||||
ippCPUID_ADCOX|ippCPUID_RDSEED|ippCPUID_PREFETCHW|ippCPUID_SHA|ippCPUID_MPX|ippCPUID_AVX512CD|ippCPUID_AVX512ER|
|
||||
ippCPUID_AVX512PF|ippCPUID_AVX512BW|ippCPUID_AVX512DQ|ippCPUID_AVX512VL|ippCPUID_AVX512VBMI;
|
||||
@@ -2279,7 +2284,7 @@ void setUseIPP(bool flag)
|
||||
#endif
|
||||
}
|
||||
|
||||
bool useIPP_NE()
|
||||
bool useIPP_NotExact()
|
||||
{
|
||||
#ifdef HAVE_IPP
|
||||
CoreTLSData* data = getCoreTlsData().get();
|
||||
@@ -2293,17 +2298,29 @@ bool useIPP_NE()
|
||||
#endif
|
||||
}
|
||||
|
||||
void setUseIPP_NE(bool flag)
|
||||
void setUseIPP_NotExact(bool flag)
|
||||
{
|
||||
CoreTLSData* data = getCoreTlsData().get();
|
||||
#ifdef HAVE_IPP
|
||||
data->useIPP_NE = (getIPPSingleton().useIPP_NE)?flag:false;
|
||||
data->useIPP_NE = flag;
|
||||
#else
|
||||
CV_UNUSED(flag);
|
||||
data->useIPP_NE = false;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if OPENCV_ABI_COMPATIBILITY < 400
|
||||
bool useIPP_NE()
|
||||
{
|
||||
return useIPP_NotExact();
|
||||
}
|
||||
|
||||
void setUseIPP_NE(bool flag)
|
||||
{
|
||||
setUseIPP_NotExact(flag);
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace ipp
|
||||
|
||||
} // namespace cv
|
||||
|
||||
@@ -2298,4 +2298,30 @@ TEST(UMat_Core_DivideRules, type_32f) { testDivide<float, true>(); }
|
||||
TEST(Core_DivideRules, type_64f) { testDivide<double, false>(); }
|
||||
TEST(UMat_Core_DivideRules, type_64f) { testDivide<double, true>(); }
|
||||
|
||||
|
||||
TEST(Core_MinMaxIdx, rows_overflow)
|
||||
{
|
||||
const int N = 65536 + 1;
|
||||
const int M = 1;
|
||||
{
|
||||
setRNGSeed(123);
|
||||
Mat m(N, M, CV_32FC1);
|
||||
randu(m, -100, 100);
|
||||
double minVal = 0, maxVal = 0;
|
||||
int minIdx[CV_MAX_DIM] = { 0 }, maxIdx[CV_MAX_DIM] = { 0 };
|
||||
cv::minMaxIdx(m, &minVal, &maxVal, minIdx, maxIdx);
|
||||
|
||||
double minVal0 = 0, maxVal0 = 0;
|
||||
int minIdx0[CV_MAX_DIM] = { 0 }, maxIdx0[CV_MAX_DIM] = { 0 };
|
||||
cv::ipp::setUseIPP(false);
|
||||
cv::minMaxIdx(m, &minVal0, &maxVal0, minIdx0, maxIdx0);
|
||||
cv::ipp::setUseIPP(true);
|
||||
|
||||
EXPECT_FALSE(fabs(minVal0 - minVal) > 1e-6 || fabs(maxVal0 - maxVal) > 1e-6) << "NxM=" << N << "x" << M <<
|
||||
" min=" << minVal0 << " vs " << minVal <<
|
||||
" max=" << maxVal0 << " vs " << maxVal;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}} // namespace
|
||||
|
||||
Reference in New Issue
Block a user