Skip to content

Commit 37ab318

Browse files
author
Pavel Vlasov
committed
Compatibility improvement with old IPP versions (tested on 9.0.1);
Manual IPP dispatcher simplification;
1 parent d25cbaa commit 37ab318

File tree

3 files changed

+37
-49
lines changed

3 files changed

+37
-49
lines changed

modules/core/include/opencv2/core/private.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,13 @@ CV_EXPORTS void scalarToRawData(const cv::Scalar& s, void* buf, int type, int un
241241

242242
#define setIppErrorStatus() cv::ipp::setIppStatus(-1, CV_Func, __FILE__, __LINE__)
243243

244+
#if IPP_VERSION_X100 >= 201700
244245
#define ippCPUID_AVX512_SKX (ippCPUID_AVX512F|ippCPUID_AVX512CD|ippCPUID_AVX512VL|ippCPUID_AVX512BW|ippCPUID_AVX512DQ)
245246
#define ippCPUID_AVX512_KNL (ippCPUID_AVX512F|ippCPUID_AVX512CD|ippCPUID_AVX512PF|ippCPUID_AVX512ER)
247+
#else
248+
#define ippCPUID_AVX512_SKX 0xFFFFFFFF
249+
#define ippCPUID_AVX512_KNL 0xFFFFFFFF
250+
#endif
246251

247252
namespace cv
248253
{
@@ -480,7 +485,7 @@ class IppAutoBuffer
480485
};
481486

482487
// Extracts border interpolation type without flags
483-
#if IPP_VERSION_MAJOR >= 2017
488+
#if IPP_VERSION_X100 >= 201700
484489
#define IPP_BORDER_INTER(BORDER) (IppiBorderType)((BORDER)&0xF|((((BORDER)&ippBorderInMem) == ippBorderInMem)?ippBorderInMem:0));
485490
#else
486491
#define IPP_BORDER_INTER(BORDER) (IppiBorderType)((BORDER)&0xF);

modules/core/src/copy.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,9 @@ void Mat::copyTo( OutputArray _dst ) const
300300
const uchar* sptr = data;
301301
uchar* dptr = dst.data;
302302

303+
#if IPP_VERSION_X100 >= 201700
303304
CV_IPP_RUN_FAST(CV_INSTRUMENT_FUN_IPP(ippiCopy_8u_C1R_L, sptr, (int)step, dptr, (int)dst.step, ippiSizeL((int)(cols*elemSize()), rows)) >= 0)
305+
#endif
304306

305307
Size sz = getContinuousSize(*this, dst);
306308
size_t len = sz.width*elemSize();

modules/core/src/system.cpp

Lines changed: 29 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1929,11 +1929,22 @@ struct IPPInitSingleton
19291929
}
19301930
ippFeatures = cpuFeatures;
19311931

1932-
bool unsupported = false;
19331932
const char* pIppEnv = getenv("OPENCV_IPP");
19341933
cv::String env = pIppEnv;
19351934
if(env.size())
19361935
{
1936+
#if IPP_VERSION_X100 >= 201703
1937+
const Ipp64u minorFeatures = ippCPUID_MOVBE|ippCPUID_AES|ippCPUID_CLMUL|ippCPUID_ABR|ippCPUID_RDRAND|ippCPUID_F16C|
1938+
ippCPUID_ADCOX|ippCPUID_RDSEED|ippCPUID_PREFETCHW|ippCPUID_SHA|ippCPUID_MPX|ippCPUID_AVX512CD|ippCPUID_AVX512ER|
1939+
ippCPUID_AVX512PF|ippCPUID_AVX512BW|ippCPUID_AVX512DQ|ippCPUID_AVX512VL|ippCPUID_AVX512VBMI;
1940+
#elif IPP_VERSION_X100 >= 201700
1941+
const Ipp64u minorFeatures = ippCPUID_MOVBE|ippCPUID_AES|ippCPUID_CLMUL|ippCPUID_ABR|ippCPUID_RDRAND|ippCPUID_F16C|
1942+
ippCPUID_ADCOX|ippCPUID_RDSEED|ippCPUID_PREFETCHW|ippCPUID_SHA|ippCPUID_AVX512CD|ippCPUID_AVX512ER|
1943+
ippCPUID_AVX512PF|ippCPUID_AVX512BW|ippCPUID_AVX512DQ|ippCPUID_AVX512VL|ippCPUID_AVX512VBMI;
1944+
#else
1945+
const Ipp64u minorFeatures = 0;
1946+
#endif
1947+
19371948
env = env.toLowerCase();
19381949
if(env.substr(0, 2) == "ne")
19391950
{
@@ -1947,58 +1958,20 @@ struct IPPInitSingleton
19471958
useIPP = false;
19481959
}
19491960
else if(env == "sse42")
1950-
{
1951-
if(!(cpuFeatures&ippCPUID_SSE42))
1952-
unsupported = true;
1953-
ippFeatures = ippCPUID_MMX|ippCPUID_SSE|ippCPUID_SSE2|ippCPUID_SSE3|ippCPUID_SSSE3|ippCPUID_SSE41|ippCPUID_SSE42;
1954-
ippFeatures |= (cpuFeatures&ippCPUID_AES);
1955-
ippFeatures |= (cpuFeatures&ippCPUID_CLMUL);
1956-
ippFeatures |= (cpuFeatures&ippCPUID_SHA);
1957-
}
1961+
ippFeatures = minorFeatures|ippCPUID_SSE2|ippCPUID_SSE3|ippCPUID_SSSE3|ippCPUID_SSE41|ippCPUID_SSE42;
19581962
else if(env == "avx2")
1959-
{
1960-
if(!(cpuFeatures&ippCPUID_AVX2))
1961-
unsupported = true;
1962-
ippFeatures = ippCPUID_MMX|ippCPUID_SSE|ippCPUID_SSE2|ippCPUID_SSE3|ippCPUID_SSSE3|ippCPUID_SSE41|ippCPUID_SSE42|ippCPUID_AVX|ippCPUID_AVX2;
1963-
ippFeatures |= (cpuFeatures&ippCPUID_AES);
1964-
ippFeatures |= (cpuFeatures&ippCPUID_CLMUL);
1965-
ippFeatures |= (cpuFeatures&ippCPUID_F16C);
1966-
ippFeatures |= (cpuFeatures&ippCPUID_ADCOX);
1967-
ippFeatures |= (cpuFeatures&ippCPUID_RDSEED);
1968-
ippFeatures |= (cpuFeatures&ippCPUID_PREFETCHW);
1969-
ippFeatures |= (cpuFeatures&ippCPUID_MPX);
1970-
}
1963+
ippFeatures = minorFeatures|ippCPUID_SSE2|ippCPUID_SSE3|ippCPUID_SSSE3|ippCPUID_SSE41|ippCPUID_SSE42|ippCPUID_AVX|ippCPUID_AVX2;
1964+
#if IPP_VERSION_X100 >= 201700
19711965
#if defined (_M_AMD64) || defined (__x86_64__)
19721966
else if(env == "avx512")
1973-
{
1974-
if(!(cpuFeatures&ippCPUID_AVX512F))
1975-
unsupported = true;
1976-
1977-
ippFeatures = ippCPUID_MMX|ippCPUID_SSE|ippCPUID_SSE2|ippCPUID_SSE3|ippCPUID_SSSE3|ippCPUID_SSE41|ippCPUID_SSE42|ippCPUID_AVX|ippCPUID_AVX2|ippCPUID_AVX512F;
1978-
ippFeatures |= (cpuFeatures&ippCPUID_AES);
1979-
ippFeatures |= (cpuFeatures&ippCPUID_CLMUL);
1980-
ippFeatures |= (cpuFeatures&ippCPUID_F16C);
1981-
ippFeatures |= (cpuFeatures&ippCPUID_ADCOX);
1982-
ippFeatures |= (cpuFeatures&ippCPUID_RDSEED);
1983-
ippFeatures |= (cpuFeatures&ippCPUID_PREFETCHW);
1984-
ippFeatures |= (cpuFeatures&ippCPUID_MPX);
1985-
ippFeatures |= (cpuFeatures&ippCPUID_AVX512CD);
1986-
ippFeatures |= (cpuFeatures&ippCPUID_AVX512VL);
1987-
ippFeatures |= (cpuFeatures&ippCPUID_AVX512BW);
1988-
ippFeatures |= (cpuFeatures&ippCPUID_AVX512DQ);
1989-
ippFeatures |= (cpuFeatures&ippCPUID_AVX512ER);
1990-
ippFeatures |= (cpuFeatures&ippCPUID_AVX512PF);
1991-
ippFeatures |= (cpuFeatures&ippCPUID_AVX512VBMI);
1992-
}
1967+
ippFeatures = minorFeatures|ippCPUID_SSE2|ippCPUID_SSE3|ippCPUID_SSSE3|ippCPUID_SSE41|ippCPUID_SSE42|ippCPUID_AVX|ippCPUID_AVX2|ippCPUID_AVX512F;
1968+
#endif
19931969
#endif
19941970
else
19951971
std::cerr << "ERROR: Improper value of OPENCV_IPP: " << env.c_str() << ". Correct values are: disabled, sse42, avx2, avx512 (Intel64 only)" << std::endl;
1996-
}
19971972

1998-
if(unsupported)
1999-
{
2000-
std::cerr << "WARNING: selected IPP features are not supported by CPU. IPP was initialized with default features" << std::endl;
2001-
ippFeatures = cpuFeatures;
1973+
// Trim unsupported features
1974+
ippFeatures &= cpuFeatures;
20021975
}
20031976

20041977
// Disable AVX1 since we don't track regressions for it. SSE42 will be used instead
@@ -2007,7 +1980,9 @@ struct IPPInitSingleton
20071980

20081981
// IPP integrations in OpenCV support only SSE4.2, AVX2 and AVX-512 optimizations.
20091982
if(!(
1983+
#if IPP_VERSION_X100 >= 201700
20101984
cpuFeatures&ippCPUID_AVX512F ||
1985+
#endif
20111986
cpuFeatures&ippCPUID_AVX2 ||
20121987
cpuFeatures&ippCPUID_SSE42
20131988
))
@@ -2016,10 +1991,14 @@ struct IPPInitSingleton
20161991
return;
20171992
}
20181993

2019-
IPP_INITIALIZER(ippFeatures)
1994+
if(ippFeatures == cpuFeatures)
1995+
IPP_INITIALIZER(0)
1996+
else
1997+
IPP_INITIALIZER(ippFeatures)
20201998
ippFeatures = ippGetEnabledCpuFeatures();
20211999

20222000
// Detect top level optimizations to make comparison easier for optimizations dependent conditions
2001+
#if IPP_VERSION_X100 >= 201700
20232002
if(ippFeatures&ippCPUID_AVX512F)
20242003
{
20252004
if((ippFeatures&ippCPUID_AVX512_SKX) == ippCPUID_AVX512_SKX)
@@ -2029,7 +2008,9 @@ struct IPPInitSingleton
20292008
else
20302009
ippTopFeatures = ippCPUID_AVX512F; // Unknown AVX512 configuration
20312010
}
2032-
else if(ippFeatures&ippCPUID_AVX2)
2011+
else
2012+
#endif
2013+
if(ippFeatures&ippCPUID_AVX2)
20332014
ippTopFeatures = ippCPUID_AVX2;
20342015
else if(ippFeatures&ippCPUID_SSE42)
20352016
ippTopFeatures = ippCPUID_SSE42;

0 commit comments

Comments
 (0)