Esempio n. 1
0
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;
}
Esempio n. 2
0
 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;
 }
Esempio n. 3
0
 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;
 }