From baff521b634ef0d8eef16a0ab8e438092537909e Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 15 Nov 2017 18:53:32 +0000 Subject: [PATCH] imgproc(Canny): eliminate unnecessary operations drop manual loop unrolling: - don't block compiler optimizations - no effect on i5 --- modules/imgproc/src/canny.cpp | 73 +++++++++-------------------------- 1 file changed, 18 insertions(+), 55 deletions(-) diff --git a/modules/imgproc/src/canny.cpp b/modules/imgproc/src/canny.cpp index b475c00e3c..6558f16923 100644 --- a/modules/imgproc/src/canny.cpp +++ b/modules/imgproc/src/canny.cpp @@ -812,8 +812,6 @@ public: ~finalPass() {} - finalPass& operator=(const finalPass&) {return *this;} - void operator()(const Range &boundaries) const { // the final pass, form the final image @@ -821,77 +819,39 @@ public: { int j = 0; uchar *pdst = dst.ptr(i); - uchar *pmap; + const uchar *pmap = map.ptr(i + 1); #if CV_SIMD128 if(haveSIMD) - pmap = (uchar*)map.ptr(i + 1) + CV_MALLOC_SIMD128; + pmap += CV_MALLOC_SIMD128; else #endif - pmap = (uchar*)map.ptr(i + 1) + 1; + pmap += 1; #if CV_SIMD128 if(haveSIMD) { - const v_int8x16 v_zero = v_setzero_s8(); + const v_uint8x16 v_zero = v_setzero_u8(); + const v_uint8x16 v_ff = ~v_zero; + const v_uint8x16 v_two(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); - for(; j <= dst.cols - 32; j += 32) { - v_uint8x16 v_pmap1 = v_load_aligned((const unsigned char*)(pmap + j)); - v_uint8x16 v_pmap2 = v_load_aligned((const unsigned char*)(pmap + j + 16)); - - v_uint16x8 v_pmaplo1, v_pmaphi1, v_pmaplo2, v_pmaphi2; - v_expand(v_pmap1, v_pmaplo1, v_pmaphi1); - v_expand(v_pmap2, v_pmaplo2, v_pmaphi2); - - v_pmaplo1 = v_pmaplo1 >> 1; - v_pmaphi1 = v_pmaphi1 >> 1; - v_pmaplo2 = v_pmaplo2 >> 1; - v_pmaphi2 = v_pmaphi2 >> 1; - - v_pmap1 = v_pack(v_pmaplo1, v_pmaphi1); - v_pmap2 = v_pack(v_pmaplo2, v_pmaphi2); - - v_pmap1 = v_reinterpret_as_u8(v_zero - v_reinterpret_as_s8(v_pmap1)); - v_pmap2 = v_reinterpret_as_u8(v_zero - v_reinterpret_as_s8(v_pmap2)); - - v_store((pdst + j), v_pmap1); - v_store((pdst + j + 16), v_pmap2); - } - - if(j <= dst.cols - 16) { + for (; j <= dst.cols - 16; j += 16) + { v_uint8x16 v_pmap = v_load_aligned((const unsigned char*)(pmap + j)); - - v_uint16x8 v_pmaplo; - v_uint16x8 v_pmaphi; - v_expand(v_pmap, v_pmaplo, v_pmaphi); - - v_pmaplo = v_pmaplo >> 1; - v_pmaphi = v_pmaphi >> 1; - - v_pmap = v_pack(v_pmaplo, v_pmaphi); - v_pmap = v_reinterpret_as_u8(v_zero - v_reinterpret_as_s8(v_pmap)); - + v_pmap = v_select(v_pmap == v_two, v_ff, v_zero); v_store((pdst + j), v_pmap); - j += 16; } - if(j <= dst.cols - 8) { - v_uint8x16 v_pmap = v_load_halves((const unsigned char*)(pmap + j), (const unsigned char*)(pmap + j)); - - v_uint16x8 v_pmaplo; - v_uint16x8 v_pmaphi; - v_expand(v_pmap, v_pmaplo, v_pmaphi); - - v_pmaplo = v_pmaplo >> 1; - v_pmaphi = v_pmaphi >> 1; - - v_pmap = v_pack(v_pmaplo, v_pmaphi); - v_pmap = v_reinterpret_as_u8(v_zero - v_reinterpret_as_s8(v_pmap)); - + if (j <= dst.cols - 8) + { + v_uint8x16 v_pmap = v_load_low((const unsigned char*)(pmap + j)); + v_pmap = v_select(v_pmap == v_two, v_ff, v_zero); v_store_low((pdst + j), v_pmap); j += 8; } } #endif for (; j < dst.cols; j++) + { pdst[j] = (uchar)-(pmap[j] >> 1); + } } } @@ -901,6 +861,9 @@ private: #if CV_SIMD128 bool haveSIMD; #endif + + finalPass(const finalPass&); // = delete + finalPass& operator=(const finalPass&); // = delete }; #ifdef HAVE_OPENVX