mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 15:23:05 +04:00
Implementation detector and selector for IPP and OpenCL;
IPP can be switched on and off on runtime; Optional implementation collector was added (switched off by default in CMake). Gathers data of implementation used in functions and report this info through performance TS; TS modifications for implementations control;
This commit is contained in:
+398
-212
@@ -562,10 +562,16 @@ static void add8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAdd_8u_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAdd_8u_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<uchar, OpAdd<uchar>, IF_SIMD(VAdd<uchar>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -582,10 +588,16 @@ static void add16u( const ushort* src1, size_t step1,
|
||||
ushort* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAdd_16u_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAdd_16u_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<ushort, OpAdd<ushort>, IF_SIMD(VAdd<ushort>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -595,10 +607,16 @@ static void add16s( const short* src1, size_t step1,
|
||||
short* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAdd_16s_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAdd_16s_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<short, OpAdd<short>, IF_SIMD(VAdd<short>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -615,10 +633,16 @@ static void add32f( const float* src1, size_t step1,
|
||||
float* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAdd_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAdd_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp32<float, OpAdd<float>, IF_SIMD(VAdd<float>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -635,10 +659,16 @@ static void sub8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiSub_8u_C1RSfs(src2, (int)step2, src1, (int)step1, dst, (int)step, ippiSize(sz), 0))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiSub_8u_C1RSfs(src2, (int)step2, src1, (int)step1, dst, (int)step, ippiSize(sz), 0))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<uchar, OpSub<uchar>, IF_SIMD(VSub<uchar>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -655,10 +685,16 @@ static void sub16u( const ushort* src1, size_t step1,
|
||||
ushort* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiSub_16u_C1RSfs(src2, (int)step2, src1, (int)step1, dst, (int)step, ippiSize(sz), 0))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiSub_16u_C1RSfs(src2, (int)step2, src1, (int)step1, dst, (int)step, ippiSize(sz), 0))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<ushort, OpSub<ushort>, IF_SIMD(VSub<ushort>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -668,10 +704,16 @@ static void sub16s( const short* src1, size_t step1,
|
||||
short* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiSub_16s_C1RSfs(src2, (int)step2, src1, (int)step1, dst, (int)step, ippiSize(sz), 0))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiSub_16s_C1RSfs(src2, (int)step2, src1, (int)step1, dst, (int)step, ippiSize(sz), 0))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<short, OpSub<short>, IF_SIMD(VSub<short>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -688,10 +730,16 @@ static void sub32f( const float* src1, size_t step1,
|
||||
float* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiSub_32f_C1R(src2, (int)step2, src1, (int)step1, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiSub_32f_C1R(src2, (int)step2, src1, (int)step1, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp32<float, OpSub<float>, IF_SIMD(VSub<float>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -711,22 +759,28 @@ static void max8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
uchar* s1 = (uchar*)src1;
|
||||
uchar* s2 = (uchar*)src2;
|
||||
uchar* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (0 > ippsMaxEvery_8u(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 += step1;
|
||||
s2 += step2;
|
||||
d += step;
|
||||
uchar* s1 = (uchar*)src1;
|
||||
uchar* s2 = (uchar*)src2;
|
||||
uchar* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
{
|
||||
if (0 > ippsMaxEvery_8u(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 += step1;
|
||||
s2 += step2;
|
||||
d += step;
|
||||
}
|
||||
if (i == sz.height)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
if (i == sz.height)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
vBinOp<uchar, OpMax<uchar>, IF_SIMD(VMax<uchar>)>(src1, step1, src2, step2, dst, step, sz);
|
||||
}
|
||||
@@ -743,22 +797,28 @@ static void max16u( const ushort* src1, size_t step1,
|
||||
ushort* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
ushort* s1 = (ushort*)src1;
|
||||
ushort* s2 = (ushort*)src2;
|
||||
ushort* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (0 > ippsMaxEvery_16u(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (ushort*)((uchar*)s1 + step1);
|
||||
s2 = (ushort*)((uchar*)s2 + step2);
|
||||
d = (ushort*)((uchar*)d + step);
|
||||
ushort* s1 = (ushort*)src1;
|
||||
ushort* s2 = (ushort*)src2;
|
||||
ushort* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
{
|
||||
if (0 > ippsMaxEvery_16u(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (ushort*)((uchar*)s1 + step1);
|
||||
s2 = (ushort*)((uchar*)s2 + step2);
|
||||
d = (ushort*)((uchar*)d + step);
|
||||
}
|
||||
if (i == sz.height)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
if (i == sz.height)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
vBinOp<ushort, OpMax<ushort>, IF_SIMD(VMax<ushort>)>(src1, step1, src2, step2, dst, step, sz);
|
||||
}
|
||||
@@ -782,22 +842,28 @@ static void max32f( const float* src1, size_t step1,
|
||||
float* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
float* s1 = (float*)src1;
|
||||
float* s2 = (float*)src2;
|
||||
float* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (0 > ippsMaxEvery_32f(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (float*)((uchar*)s1 + step1);
|
||||
s2 = (float*)((uchar*)s2 + step2);
|
||||
d = (float*)((uchar*)d + step);
|
||||
float* s1 = (float*)src1;
|
||||
float* s2 = (float*)src2;
|
||||
float* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
{
|
||||
if (0 > ippsMaxEvery_32f(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (float*)((uchar*)s1 + step1);
|
||||
s2 = (float*)((uchar*)s2 + step2);
|
||||
d = (float*)((uchar*)d + step);
|
||||
}
|
||||
if (i == sz.height)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
if (i == sz.height)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
vBinOp32<float, OpMax<float>, IF_SIMD(VMax<float>)>(src1, step1, src2, step2, dst, step, sz);
|
||||
}
|
||||
@@ -807,22 +873,28 @@ static void max64f( const double* src1, size_t step1,
|
||||
double* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if ARITHM_USE_IPP == 1
|
||||
double* s1 = (double*)src1;
|
||||
double* s2 = (double*)src2;
|
||||
double* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (0 > ippsMaxEvery_64f(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (double*)((uchar*)s1 + step1);
|
||||
s2 = (double*)((uchar*)s2 + step2);
|
||||
d = (double*)((uchar*)d + step);
|
||||
double* s1 = (double*)src1;
|
||||
double* s2 = (double*)src2;
|
||||
double* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
{
|
||||
if (0 > ippsMaxEvery_64f(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (double*)((uchar*)s1 + step1);
|
||||
s2 = (double*)((uchar*)s2 + step2);
|
||||
d = (double*)((uchar*)d + step);
|
||||
}
|
||||
if (i == sz.height)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
if (i == sz.height)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
vBinOp64<double, OpMax<double>, IF_SIMD(VMax<double>)>(src1, step1, src2, step2, dst, step, sz);
|
||||
}
|
||||
@@ -832,22 +904,28 @@ static void min8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
uchar* s1 = (uchar*)src1;
|
||||
uchar* s2 = (uchar*)src2;
|
||||
uchar* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (0 > ippsMinEvery_8u(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 += step1;
|
||||
s2 += step2;
|
||||
d += step;
|
||||
uchar* s1 = (uchar*)src1;
|
||||
uchar* s2 = (uchar*)src2;
|
||||
uchar* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
{
|
||||
if (0 > ippsMinEvery_8u(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 += step1;
|
||||
s2 += step2;
|
||||
d += step;
|
||||
}
|
||||
if (i == sz.height)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
if (i == sz.height)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
vBinOp<uchar, OpMin<uchar>, IF_SIMD(VMin<uchar>)>(src1, step1, src2, step2, dst, step, sz);
|
||||
}
|
||||
@@ -864,22 +942,28 @@ static void min16u( const ushort* src1, size_t step1,
|
||||
ushort* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
ushort* s1 = (ushort*)src1;
|
||||
ushort* s2 = (ushort*)src2;
|
||||
ushort* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (0 > ippsMinEvery_16u(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (ushort*)((uchar*)s1 + step1);
|
||||
s2 = (ushort*)((uchar*)s2 + step2);
|
||||
d = (ushort*)((uchar*)d + step);
|
||||
ushort* s1 = (ushort*)src1;
|
||||
ushort* s2 = (ushort*)src2;
|
||||
ushort* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
{
|
||||
if (0 > ippsMinEvery_16u(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (ushort*)((uchar*)s1 + step1);
|
||||
s2 = (ushort*)((uchar*)s2 + step2);
|
||||
d = (ushort*)((uchar*)d + step);
|
||||
}
|
||||
if (i == sz.height)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
if (i == sz.height)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
vBinOp<ushort, OpMin<ushort>, IF_SIMD(VMin<ushort>)>(src1, step1, src2, step2, dst, step, sz);
|
||||
}
|
||||
@@ -903,22 +987,28 @@ static void min32f( const float* src1, size_t step1,
|
||||
float* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
float* s1 = (float*)src1;
|
||||
float* s2 = (float*)src2;
|
||||
float* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (0 > ippsMinEvery_32f(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (float*)((uchar*)s1 + step1);
|
||||
s2 = (float*)((uchar*)s2 + step2);
|
||||
d = (float*)((uchar*)d + step);
|
||||
float* s1 = (float*)src1;
|
||||
float* s2 = (float*)src2;
|
||||
float* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
{
|
||||
if (0 > ippsMinEvery_32f(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (float*)((uchar*)s1 + step1);
|
||||
s2 = (float*)((uchar*)s2 + step2);
|
||||
d = (float*)((uchar*)d + step);
|
||||
}
|
||||
if (i == sz.height)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
if (i == sz.height)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
vBinOp32<float, OpMin<float>, IF_SIMD(VMin<float>)>(src1, step1, src2, step2, dst, step, sz);
|
||||
}
|
||||
@@ -928,22 +1018,28 @@ static void min64f( const double* src1, size_t step1,
|
||||
double* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if ARITHM_USE_IPP == 1
|
||||
double* s1 = (double*)src1;
|
||||
double* s2 = (double*)src2;
|
||||
double* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (0 > ippsMinEvery_64f(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (double*)((uchar*)s1 + step1);
|
||||
s2 = (double*)((uchar*)s2 + step2);
|
||||
d = (double*)((uchar*)d + step);
|
||||
double* s1 = (double*)src1;
|
||||
double* s2 = (double*)src2;
|
||||
double* d = dst;
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
int i = 0;
|
||||
for(; i < sz.height; i++)
|
||||
{
|
||||
if (0 > ippsMinEvery_64f(s1, s2, d, sz.width))
|
||||
break;
|
||||
s1 = (double*)((uchar*)s1 + step1);
|
||||
s2 = (double*)((uchar*)s2 + step2);
|
||||
d = (double*)((uchar*)d + step);
|
||||
}
|
||||
if (i == sz.height)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
if (i == sz.height)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
#endif
|
||||
vBinOp64<double, OpMin<double>, IF_SIMD(VMin<double>)>(src1, step1, src2, step2, dst, step, sz);
|
||||
}
|
||||
@@ -953,10 +1049,16 @@ static void absdiff8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAbsDiff_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAbsDiff_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<uchar, OpAbsDiff<uchar>, IF_SIMD(VAbsDiff<uchar>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -973,10 +1075,16 @@ static void absdiff16u( const ushort* src1, size_t step1,
|
||||
ushort* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAbsDiff_16u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAbsDiff_16u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<ushort, OpAbsDiff<ushort>, IF_SIMD(VAbsDiff<ushort>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -1000,10 +1108,16 @@ static void absdiff32f( const float* src1, size_t step1,
|
||||
float* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAbsDiff_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAbsDiff_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp32<float, OpAbsDiff<float>, IF_SIMD(VAbsDiff<float>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -1021,10 +1135,16 @@ static void and8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAnd_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiAnd_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<uchar, OpAnd<uchar>, IF_SIMD(VAnd<uchar>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -1034,10 +1154,16 @@ static void or8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiOr_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiOr_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<uchar, OpOr<uchar>, IF_SIMD(VOr<uchar>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -1047,10 +1173,16 @@ static void xor8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiXor_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiXor_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<uchar, OpXor<uchar>, IF_SIMD(VXor<uchar>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -1060,10 +1192,16 @@ static void not8u( const uchar* src1, size_t step1,
|
||||
uchar* dst, size_t step, Size sz, void* )
|
||||
{
|
||||
#if (ARITHM_USE_IPP == 1)
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step); (void)src2;
|
||||
if (0 <= ippiNot_8u_C1R(src1, (int)step1, dst, (int)step, ippiSize(sz)))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(sz, sizeof(dst[0]), step1, step2, step); (void)src2;
|
||||
if (0 <= ippiNot_8u_C1R(src1, (int)step1, dst, (int)step, ippiSize(sz)))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
#endif
|
||||
(vBinOp<uchar, OpNot<uchar>, IF_SIMD(VNot<uchar>)>(src1, step1, src2, step2, dst, step, sz));
|
||||
}
|
||||
@@ -2376,11 +2514,17 @@ static void mul8u( const uchar* src1, size_t step1, const uchar* src2, size_t st
|
||||
{
|
||||
float fscale = (float)*(const double*)scale;
|
||||
#if defined HAVE_IPP
|
||||
if (std::fabs(fscale - 1) <= FLT_EPSILON)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (ippiMul_8u_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0) >= 0)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
if (std::fabs(fscale - 1) <= FLT_EPSILON)
|
||||
{
|
||||
if (ippiMul_8u_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0) >= 0)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
mul_(src1, step1, src2, step2, dst, step, sz, fscale);
|
||||
@@ -2397,11 +2541,17 @@ static void mul16u( const ushort* src1, size_t step1, const ushort* src2, size_t
|
||||
{
|
||||
float fscale = (float)*(const double*)scale;
|
||||
#if defined HAVE_IPP
|
||||
if (std::fabs(fscale - 1) <= FLT_EPSILON)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (ippiMul_16u_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0) >= 0)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
if (std::fabs(fscale - 1) <= FLT_EPSILON)
|
||||
{
|
||||
if (ippiMul_16u_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0) >= 0)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
mul_(src1, step1, src2, step2, dst, step, sz, fscale);
|
||||
@@ -2412,11 +2562,17 @@ static void mul16s( const short* src1, size_t step1, const short* src2, size_t s
|
||||
{
|
||||
float fscale = (float)*(const double*)scale;
|
||||
#if defined HAVE_IPP
|
||||
if (std::fabs(fscale - 1) <= FLT_EPSILON)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (ippiMul_16s_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0) >= 0)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
if (std::fabs(fscale - 1) <= FLT_EPSILON)
|
||||
{
|
||||
if (ippiMul_16s_C1RSfs(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz), 0) >= 0)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
mul_(src1, step1, src2, step2, dst, step, sz, fscale);
|
||||
@@ -2433,11 +2589,17 @@ static void mul32f( const float* src1, size_t step1, const float* src2, size_t s
|
||||
{
|
||||
float fscale = (float)*(const double*)scale;
|
||||
#if defined HAVE_IPP
|
||||
if (std::fabs(fscale - 1) <= FLT_EPSILON)
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
if (ippiMul_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)) >= 0)
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
if (std::fabs(fscale - 1) <= FLT_EPSILON)
|
||||
{
|
||||
if (ippiMul_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(sz)) >= 0)
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
mul_(src1, step1, src2, step2, dst, step, sz, fscale);
|
||||
@@ -3185,13 +3347,19 @@ static void cmp8u(const uchar* src1, size_t step1, const uchar* src2, size_t ste
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
#if ARITHM_USE_IPP
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiCompare_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiCompare_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
//vz optimized cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
@@ -3284,13 +3452,19 @@ static void cmp16u(const ushort* src1, size_t step1, const ushort* src2, size_t
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
#if ARITHM_USE_IPP
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiCompare_16u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiCompare_16u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
@@ -3300,13 +3474,19 @@ static void cmp16s(const short* src1, size_t step1, const short* src2, size_t st
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
#if ARITHM_USE_IPP
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op > 0 )
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiCompare_16s_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op > 0 )
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiCompare_16s_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
//vz optimized cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
@@ -3438,13 +3618,19 @@ static void cmp32f(const float* src1, size_t step1, const float* src2, size_t st
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
#if ARITHM_USE_IPP
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
CV_IPP_CHECK()
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiCompare_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op))
|
||||
return;
|
||||
setIppErrorStatus();
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if (0 <= ippiCompare_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_IPP);
|
||||
return;
|
||||
}
|
||||
setIppErrorStatus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
|
||||
Reference in New Issue
Block a user