Commit ca1a0a11 authored by Tomoaki Teshima's avatar Tomoaki Teshima Committed by Vadim Pisarevsky

core: remove raw SSE2/NEON implementation from convert.cpp (#9831)

* remove raw SSE2/NEON implementation from convert.cpp
  * remove raw implementation from Cvt_SIMD
  * remove raw implementation from cvtScale_SIMD
  * remove raw implementation from cvtScaleAbs_SIMD
  * remove duplicated implementation cvt_<float, short>
  * remove duplicated implementation cvtScale_<short, short, float>
  * add "from double" version of Cvt_SIMD
  * modify the condition of test ConvertScaleAbs

* Update convert.cpp

fixed crash in cvtScaleAbs(8s=>8u)

* fixed compile error on Win32

* fixed several test failures because of accuracy loss in cvtScale(int=>int)

* fixed NEON implementation of v_cvt_f64(int=>double) intrinsic

* another attempt to fix test failures

* keep trying to fix the test failures and just introduced compile warnings

* fixed one remaining test (subtractScalar)
parent 6cedc827
...@@ -80,16 +80,18 @@ PERF_TEST_P(Size_MatType, absdiff, TYPICAL_MATS_CORE_ARITHM) ...@@ -80,16 +80,18 @@ PERF_TEST_P(Size_MatType, absdiff, TYPICAL_MATS_CORE_ARITHM)
declare.in(a, b, WARMUP_RNG).out(c); declare.in(a, b, WARMUP_RNG).out(c);
double eps = 1e-8;
if (CV_MAT_DEPTH(type) == CV_32S) if (CV_MAT_DEPTH(type) == CV_32S)
{ {
//see ticket 1529: absdiff can be without saturation on 32S //see ticket 1529: absdiff can be without saturation on 32S
a /= 2; a /= 2;
b /= 2; b /= 2;
eps = 1;
} }
TEST_CYCLE() absdiff(a, b, c); TEST_CYCLE() absdiff(a, b, c);
SANITY_CHECK(c, 1e-8); SANITY_CHECK(c, eps);
} }
PERF_TEST_P(Size_MatType, absdiffScalar, TYPICAL_MATS_CORE_ARITHM) PERF_TEST_P(Size_MatType, absdiffScalar, TYPICAL_MATS_CORE_ARITHM)
...@@ -102,16 +104,18 @@ PERF_TEST_P(Size_MatType, absdiffScalar, TYPICAL_MATS_CORE_ARITHM) ...@@ -102,16 +104,18 @@ PERF_TEST_P(Size_MatType, absdiffScalar, TYPICAL_MATS_CORE_ARITHM)
declare.in(a, b, WARMUP_RNG).out(c); declare.in(a, b, WARMUP_RNG).out(c);
double eps = 1e-8;
if (CV_MAT_DEPTH(type) == CV_32S) if (CV_MAT_DEPTH(type) == CV_32S)
{ {
//see ticket 1529: absdiff can be without saturation on 32S //see ticket 1529: absdiff can be without saturation on 32S
a /= 2; a /= 2;
b /= 2; b /= 2;
eps = 1;
} }
TEST_CYCLE() absdiff(a, b, c); TEST_CYCLE() absdiff(a, b, c);
SANITY_CHECK(c, 1e-8); SANITY_CHECK(c, eps);
} }
PERF_TEST_P(Size_MatType, add, TYPICAL_MATS_CORE_ARITHM) PERF_TEST_P(Size_MatType, add, TYPICAL_MATS_CORE_ARITHM)
...@@ -125,16 +129,18 @@ PERF_TEST_P(Size_MatType, add, TYPICAL_MATS_CORE_ARITHM) ...@@ -125,16 +129,18 @@ PERF_TEST_P(Size_MatType, add, TYPICAL_MATS_CORE_ARITHM)
declare.in(a, b, WARMUP_RNG).out(c); declare.in(a, b, WARMUP_RNG).out(c);
declare.time(50); declare.time(50);
double eps = 1e-8;
if (CV_MAT_DEPTH(type) == CV_32S) if (CV_MAT_DEPTH(type) == CV_32S)
{ {
//see ticket 1529: add can be without saturation on 32S //see ticket 1529: add can be without saturation on 32S
a /= 2; a /= 2;
b /= 2; b /= 2;
eps = 1;
} }
TEST_CYCLE() add(a, b, c); TEST_CYCLE() add(a, b, c);
SANITY_CHECK(c, 1e-8); SANITY_CHECK(c, eps);
} }
PERF_TEST_P(Size_MatType, addScalar, TYPICAL_MATS_CORE_ARITHM) PERF_TEST_P(Size_MatType, addScalar, TYPICAL_MATS_CORE_ARITHM)
...@@ -147,16 +153,18 @@ PERF_TEST_P(Size_MatType, addScalar, TYPICAL_MATS_CORE_ARITHM) ...@@ -147,16 +153,18 @@ PERF_TEST_P(Size_MatType, addScalar, TYPICAL_MATS_CORE_ARITHM)
declare.in(a, b, WARMUP_RNG).out(c); declare.in(a, b, WARMUP_RNG).out(c);
double eps = 1e-8;
if (CV_MAT_DEPTH(type) == CV_32S) if (CV_MAT_DEPTH(type) == CV_32S)
{ {
//see ticket 1529: add can be without saturation on 32S //see ticket 1529: add can be without saturation on 32S
a /= 2; a /= 2;
b /= 2; b /= 2;
eps = 1;
} }
TEST_CYCLE() add(a, b, c); TEST_CYCLE() add(a, b, c);
SANITY_CHECK(c, 1e-8); SANITY_CHECK(c, eps);
} }
PERF_TEST_P(Size_MatType, subtract, TYPICAL_MATS_CORE_ARITHM) PERF_TEST_P(Size_MatType, subtract, TYPICAL_MATS_CORE_ARITHM)
...@@ -169,16 +177,18 @@ PERF_TEST_P(Size_MatType, subtract, TYPICAL_MATS_CORE_ARITHM) ...@@ -169,16 +177,18 @@ PERF_TEST_P(Size_MatType, subtract, TYPICAL_MATS_CORE_ARITHM)
declare.in(a, b, WARMUP_RNG).out(c); declare.in(a, b, WARMUP_RNG).out(c);
double eps = 1e-8;
if (CV_MAT_DEPTH(type) == CV_32S) if (CV_MAT_DEPTH(type) == CV_32S)
{ {
//see ticket 1529: subtract can be without saturation on 32S //see ticket 1529: subtract can be without saturation on 32S
a /= 2; a /= 2;
b /= 2; b /= 2;
eps = 1;
} }
TEST_CYCLE() subtract(a, b, c); TEST_CYCLE() subtract(a, b, c);
SANITY_CHECK(c, 1e-8); SANITY_CHECK(c, eps);
} }
PERF_TEST_P(Size_MatType, subtractScalar, TYPICAL_MATS_CORE_ARITHM) PERF_TEST_P(Size_MatType, subtractScalar, TYPICAL_MATS_CORE_ARITHM)
...@@ -191,16 +201,18 @@ PERF_TEST_P(Size_MatType, subtractScalar, TYPICAL_MATS_CORE_ARITHM) ...@@ -191,16 +201,18 @@ PERF_TEST_P(Size_MatType, subtractScalar, TYPICAL_MATS_CORE_ARITHM)
declare.in(a, b, WARMUP_RNG).out(c); declare.in(a, b, WARMUP_RNG).out(c);
double eps = 1e-8;
if (CV_MAT_DEPTH(type) == CV_32S) if (CV_MAT_DEPTH(type) == CV_32S)
{ {
//see ticket 1529: subtract can be without saturation on 32S //see ticket 1529: subtract can be without saturation on 32S
a /= 2; a /= 2;
b /= 2; b /= 2;
eps = 1;
} }
TEST_CYCLE() subtract(a, b, c); TEST_CYCLE() subtract(a, b, c);
SANITY_CHECK(c, 1e-8); SANITY_CHECK(c, eps);
} }
PERF_TEST_P(Size_MatType, multiply, TYPICAL_MATS_CORE_ARITHM) PERF_TEST_P(Size_MatType, multiply, TYPICAL_MATS_CORE_ARITHM)
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -806,6 +806,11 @@ struct ConvertScaleAbsOp : public BaseElemWiseOp ...@@ -806,6 +806,11 @@ struct ConvertScaleAbsOp : public BaseElemWiseOp
{ {
cvtest::add(src[0], alpha, Mat(), 0, Scalar::all(gamma[0]), dst, CV_8UC(src[0].channels()), true); cvtest::add(src[0], alpha, Mat(), 0, Scalar::all(gamma[0]), dst, CV_8UC(src[0].channels()), true);
} }
int getRandomType(RNG& rng)
{
return cvtest::randomType(rng, _OutputArray::DEPTH_MASK_ALL, 1,
ninputs > 1 ? ARITHM_MAX_CHANNELS : 4);
}
double getMaxErr(int) double getMaxErr(int)
{ {
return 1; return 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment