float normL1_(const float* a, const float* b, int n) { int j = 0; float d = 0.f; #if CV_SIMD v_float32 v_d = vx_setzero_f32(); for (; j <= n - v_float32::nlanes; j += v_float32::nlanes) v_d += v_absdiff(vx_load(a + j), vx_load(b + j)); d = v_reduce_sum(v_d); #endif for( ; j < n; j++ ) d += std::abs(a[j] - b[j]); return d; }
TheTest & test_float_absdiff() { Data<R> dataA(std::numeric_limits<LaneType>::max()), dataB(std::numeric_limits<LaneType>::min()); dataA[0] = -1; dataB[0] = 1; dataA[1] = 2; dataB[1] = -2; R a = dataA, b = dataB; Data<R> resC = v_absdiff(a, b); for (int i = 0; i < R::nlanes; ++i) { EXPECT_EQ(dataA[i] > dataB[i] ? dataA[i] - dataB[i] : dataB[i] - dataA[i], resC[i]); } return *this; }
TheTest & test_absdiff() { typedef typename V_RegTrait128<LaneType>::u_reg Ru; typedef typename Ru::lane_type u_type; Data<R> dataA(std::numeric_limits<LaneType>::max()), dataB(std::numeric_limits<LaneType>::min()); dataA[0] = (LaneType)-1; dataB[0] = 1; dataA[1] = 2; dataB[1] = (LaneType)-2; R a = dataA, b = dataB; Data<Ru> resC = v_absdiff(a, b); const u_type mask = std::numeric_limits<LaneType>::is_signed ? (u_type)(1 << (sizeof(u_type)*8 - 1)) : 0; for (int i = 0; i < Ru::nlanes; ++i) { u_type uA = dataA[i] ^ mask; u_type uB = dataB[i] ^ mask; EXPECT_EQ(uA > uB ? uA - uB : uB - uA, resC[i]); } return *this; }