From f9c4c96663b029587220f0b8c324ea5ff7b6410e Mon Sep 17 00:00:00 2001 From: Seon-Wook Park Date: Fri, 19 Jun 2015 04:29:07 +0200 Subject: [PATCH] spatialGradient: Reduce temporary vectors --- modules/imgproc/src/spatialgradient.cpp | 89 +++++++++++-------------- 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/modules/imgproc/src/spatialgradient.cpp b/modules/imgproc/src/spatialgradient.cpp index e0db8cd985..7b35e249d9 100644 --- a/modules/imgproc/src/spatialgradient.cpp +++ b/modules/imgproc/src/spatialgradient.cpp @@ -178,12 +178,8 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy, int ksi // n: offset 0 // p: offset 1 // Example: umn is offset -1 in row and offset 0 in column - v_uint8x16 v_umm, v_umn, v_ump, - v_unm, v_unn, v_unp, - v_upm, v_upn, v_upp; - v_uint16x8 v_umm1, v_umm2, v_umn1, v_umn2, v_ump1, v_ump2, - v_unm1, v_unm2, v_unn1, v_unn2, v_unp1, v_unp2, - v_upm1, v_upm2, v_upn1, v_upn2, v_upp1, v_upp2; + v_uint8x16 v_um, v_un, v_up; + v_uint16x8 v_um1, v_um2, v_un1, v_un2, v_up1, v_up2; v_int16x8 v_smm1, v_smm2, v_smn1, v_smn2, v_smp1, v_smp2, v_snm1, v_snm2, v_snn1, v_snn2, v_snp1, v_snp2, v_spm1, v_spm2, v_spn1, v_spn2, v_spp1, v_spp2, @@ -195,55 +191,48 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy, int ksi { // Load top two rows for 3x3 Sobel filter idx = W + j; - v_umm = v_load(&p_src[idx - W - 1]); - v_umn = v_load(&p_src[idx - W]); - v_ump = v_load(&p_src[idx - W + 1]); - v_unm = v_load(&p_src[idx - 1]); - v_unn = v_load(&p_src[idx]); - v_unp = v_load(&p_src[idx + 1]); - - // Expand to uint - v_expand(v_umm, v_umm1, v_umm2); - v_expand(v_umn, v_umn1, v_umn2); - v_expand(v_ump, v_ump1, v_ump2); - v_expand(v_unm, v_unm1, v_unm2); - v_expand(v_unn, v_unn1, v_unn2); - v_expand(v_unp, v_unp1, v_unp2); - - // Convert to int - v_smm1 = v_reinterpret_as_s16(v_umm1); - v_smm2 = v_reinterpret_as_s16(v_umm2); - v_smn1 = v_reinterpret_as_s16(v_umn1); - v_smn2 = v_reinterpret_as_s16(v_umn2); - v_smp1 = v_reinterpret_as_s16(v_ump1); - v_smp2 = v_reinterpret_as_s16(v_ump2); - v_snm1 = v_reinterpret_as_s16(v_unm1); - v_snm2 = v_reinterpret_as_s16(v_unm2); - v_snn1 = v_reinterpret_as_s16(v_unn1); - v_snn2 = v_reinterpret_as_s16(v_unn2); - v_snp1 = v_reinterpret_as_s16(v_unp1); - v_snp2 = v_reinterpret_as_s16(v_unp2); + v_um = v_load(&p_src[idx - W - 1]); + v_un = v_load(&p_src[idx - W]); + v_up = v_load(&p_src[idx - W + 1]); + v_expand(v_um, v_um1, v_um2); + v_expand(v_un, v_un1, v_un2); + v_expand(v_up, v_up1, v_up2); + v_smm1 = v_reinterpret_as_s16(v_um1); + v_smm2 = v_reinterpret_as_s16(v_um2); + v_smn1 = v_reinterpret_as_s16(v_un1); + v_smn2 = v_reinterpret_as_s16(v_un2); + v_smp1 = v_reinterpret_as_s16(v_up1); + v_smp2 = v_reinterpret_as_s16(v_up2); + + v_um = v_load(&p_src[idx - 1]); + v_un = v_load(&p_src[idx]); + v_up = v_load(&p_src[idx + 1]); + v_expand(v_um, v_um1, v_um2); + v_expand(v_un, v_un1, v_un2); + v_expand(v_up, v_up1, v_up2); + v_snm1 = v_reinterpret_as_s16(v_um1); + v_snm2 = v_reinterpret_as_s16(v_um2); + v_snn1 = v_reinterpret_as_s16(v_un1); + v_snn2 = v_reinterpret_as_s16(v_un2); + v_snp1 = v_reinterpret_as_s16(v_up1); + v_snp2 = v_reinterpret_as_s16(v_up2); for ( i = 1; i < H - 1; i++ ) { // Load last row for 3x3 Sobel filter idx = i*W + j; - v_upm = v_load(&p_src[idx + W - 1]); - v_upn = v_load(&p_src[idx + W]); - v_upp = v_load(&p_src[idx + W + 1]); - - // Expand to uint - v_expand(v_upm, v_upm1, v_upm2); - v_expand(v_upn, v_upn1, v_upn2); - v_expand(v_upp, v_upp1, v_upp2); - - // Convert to int - v_spm1 = v_reinterpret_as_s16(v_upm1); - v_spm2 = v_reinterpret_as_s16(v_upm2); - v_spn1 = v_reinterpret_as_s16(v_upn1); - v_spn2 = v_reinterpret_as_s16(v_upn2); - v_spp1 = v_reinterpret_as_s16(v_upp1); - v_spp2 = v_reinterpret_as_s16(v_upp2); + v_um = v_load(&p_src[idx + W - 1]); + v_un = v_load(&p_src[idx + W]); + v_up = v_load(&p_src[idx + W + 1]); + v_expand(v_um, v_um1, v_um2); + v_expand(v_un, v_un1, v_un2); + v_expand(v_up, v_up1, v_up2); + v_spm1 = v_reinterpret_as_s16(v_um1); + v_spm2 = v_reinterpret_as_s16(v_um2); + v_spn1 = v_reinterpret_as_s16(v_un1); + v_spn2 = v_reinterpret_as_s16(v_un2); + v_spp1 = v_reinterpret_as_s16(v_up1); + v_spp2 = v_reinterpret_as_s16(v_up2); // dx v_sdx1 = (v_smp1 - v_smm1) + v_two*(v_snp1 - v_snm1) + (v_spp1 - v_spm1); -- GitLab