From f681fcc465262ab1aa79ff9723f85406417ce356 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 30 Sep 2026 09:10:12 +0000 Subject: [PATCH] -remove HVX optimization of function SimdAddFeatureDifference. Delete SimdHvxAddFeatureDifference.cpp and drop the HVX dispatch path, declaration, auto-test, and VS2022 project entries. Document the removal in the 7.2.166 release notes. Co-authored-by: igor.ermolaev --- docs/2026.html | 1 + prj/vs2022/Hvx.vcxproj | 1 - prj/vs2022/Hvx.vcxproj.filters | 3 - src/Simd/SimdHvx.h | 4 - src/Simd/SimdHvxAddFeatureDifference.cpp | 107 ----------------------- src/Simd/SimdLib.cpp | 5 -- src/Test/TestAddFeatureDifference.cpp | 5 -- 7 files changed, 1 insertion(+), 125 deletions(-) delete mode 100644 src/Simd/SimdHvxAddFeatureDifference.cpp diff --git a/docs/2026.html b/docs/2026.html index c86a3e3607..ea14622f96 100644 --- a/docs/2026.html +++ b/docs/2026.html @@ -164,6 +164,7 @@
Removing
  • HVX optimization of function AbsDifference.
  • HVX optimization of function AbsDifferenceSum.
  • HVX optimization of function AbsGradientSaturatedSum.
  • +
  • HVX optimization of function AddFeatureDifference.
  • Python wrapper

    diff --git a/prj/vs2022/Hvx.vcxproj b/prj/vs2022/Hvx.vcxproj index 49f60020bf..a0f45b352c 100644 --- a/prj/vs2022/Hvx.vcxproj +++ b/prj/vs2022/Hvx.vcxproj @@ -21,7 +21,6 @@ - diff --git a/prj/vs2022/Hvx.vcxproj.filters b/prj/vs2022/Hvx.vcxproj.filters index 50e073b9c6..7a6668dfb7 100644 --- a/prj/vs2022/Hvx.vcxproj.filters +++ b/prj/vs2022/Hvx.vcxproj.filters @@ -83,9 +83,6 @@ Hvx\Statistics - - Hvx\Motion - Hvx\Image diff --git a/src/Simd/SimdHvx.h b/src/Simd/SimdHvx.h index b63682d184..b30265218b 100644 --- a/src/Simd/SimdHvx.h +++ b/src/Simd/SimdHvx.h @@ -12,10 +12,6 @@ namespace Simd #ifdef SIMD_HVX_ENABLE namespace Hvx { - void AddFeatureDifference(const uint8_t* value, size_t valueStride, size_t width, size_t height, - const uint8_t* lo, size_t loStride, const uint8_t* hi, size_t hiStride, - uint16_t weight, uint8_t* difference, size_t differenceStride); - void BgrToGray(const uint8_t* bgr, size_t width, size_t height, size_t bgrStride, uint8_t* gray, size_t grayStride); diff --git a/src/Simd/SimdHvxAddFeatureDifference.cpp b/src/Simd/SimdHvxAddFeatureDifference.cpp deleted file mode 100644 index ea0488c1b7..0000000000 --- a/src/Simd/SimdHvxAddFeatureDifference.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. - * SPDX-License-Identifier: MIT - */ -#include "Simd/SimdMemory.h" -#include "Simd/SimdStore.h" - -namespace Simd -{ -#ifdef SIMD_HVX_ENABLE - namespace Hvx - { - SIMD_INLINE HVX_Vector FeatureDifference(HVX_Vector value, HVX_Vector lo, HVX_Vector hi) - { - return Q6_Vub_vmax_VubVub(Q6_Vub_vsub_VubVub_sat(value, hi), Q6_Vub_vsub_VubVub_sat(lo, value)); - } - - SIMD_INLINE HVX_Vector ShiftedWeightedSquare(HVX_Vector diff, int weight) - { - // diff^2 as 16-bit unsigned: even/odd byte products - HVX_VectorPair sq = Q6_Wuh_vmpy_VubVub(diff, diff); - HVX_Vector sq_even = Q6_V_lo_W(sq); - HVX_Vector sq_odd = Q6_V_hi_W(sq); - - // Multiply 16-bit squares by weight -> 32-bit results - // vmpy_VuhRuh uses Rt.uh[0] for even and Rt.uh[1] for odd halfwords, - // so pack weight into both halfword lanes. - int w2 = weight | (weight << 16); - HVX_VectorPair pe = Q6_Wuw_vmpy_VuhRuh(sq_even, w2); - HVX_VectorPair po = Q6_Wuw_vmpy_VuhRuh(sq_odd, w2); - - // Shift 32-bit products right by 16 bits - HVX_Vector pe_lo = Q6_Vuw_vlsr_VuwR(Q6_V_lo_W(pe), 16); - HVX_Vector pe_hi = Q6_Vuw_vlsr_VuwR(Q6_V_hi_W(pe), 16); - HVX_Vector po_lo = Q6_Vuw_vlsr_VuwR(Q6_V_lo_W(po), 16); - HVX_Vector po_hi = Q6_Vuw_vlsr_VuwR(Q6_V_hi_W(po), 16); - - // Pack 32-bit -> 16-bit with unsigned saturation (interleaved) - HVX_Vector r_even = Q6_Vuh_vsat_VuwVuw(pe_hi, pe_lo); - HVX_Vector r_odd = Q6_Vuh_vsat_VuwVuw(po_hi, po_lo); - - // Clamp 16-bit values to 255 before extracting low bytes - HVX_Vector max255 = Q6_V_vsplat_R(0x00FF00FF); - r_even = Q6_Vuh_vmin_VuhVuh(r_even, max255); - r_odd = Q6_Vuh_vmin_VuhVuh(r_odd, max255); - - return Q6_Vb_vshuffe_VbVb(r_odd, r_even); - } - - template void AddFeatureDifference(const uint8_t* value, size_t valueStride, size_t width, size_t height, - const uint8_t* lo, size_t loStride, const uint8_t* hi, size_t hiStride, - uint16_t weight, uint8_t* difference, size_t differenceStride) - { - assert(width >= A); - if (align) - { - assert(Aligned(value) && Aligned(valueStride)); - assert(Aligned(lo) && Aligned(loStride)); - assert(Aligned(hi) && Aligned(hiStride)); - assert(Aligned(difference) && Aligned(differenceStride)); - } - - size_t alignedWidth = AlignLo(width, A); - - for (size_t row = 0; row < height; ++row) - { - for (size_t col = 0; col < alignedWidth; col += A) - { - const HVX_Vector _value = Load(value + col); - const HVX_Vector _lo = Load(lo + col); - const HVX_Vector _hi = Load(hi + col); - HVX_Vector _difference = Load(difference + col); - - const HVX_Vector fd = FeatureDifference(_value, _lo, _hi); - const HVX_Vector inc = ShiftedWeightedSquare(fd, weight); - Store(difference + col, Q6_Vub_vadd_VubVub_sat(_difference, inc)); - } - for (size_t col = alignedWidth; col < width; ++col) - { - int v = value[col], l = lo[col], h = hi[col]; - int fd1 = (v > h) ? (v - h) : 0; - int fd2 = (l > v) ? (l - v) : 0; - int fd = (fd1 > fd2) ? fd1 : fd2; - int inc = (fd * fd * weight) >> 16; - int sum = difference[col] + inc; - difference[col] = (uint8_t)(sum > 255 ? 255 : sum); - } - value += valueStride; - lo += loStride; - hi += hiStride; - difference += differenceStride; - } - } - - void AddFeatureDifference(const uint8_t* value, size_t valueStride, size_t width, size_t height, - const uint8_t* lo, size_t loStride, const uint8_t* hi, size_t hiStride, - uint16_t weight, uint8_t* difference, size_t differenceStride) - { - if (Aligned(value) && Aligned(valueStride) && Aligned(lo) && Aligned(loStride) && - Aligned(hi) && Aligned(hiStride) && Aligned(difference) && Aligned(differenceStride)) - AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride); - else - AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride); - } - } -#endif -} diff --git a/src/Simd/SimdLib.cpp b/src/Simd/SimdLib.cpp index cd96c3a44a..850dfc894a 100644 --- a/src/Simd/SimdLib.cpp +++ b/src/Simd/SimdLib.cpp @@ -506,11 +506,6 @@ SIMD_API void SimdAddFeatureDifference(const uint8_t * value, size_t valueStride if (Neon::Enable && width >= Neon::A) Neon::AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride); else -#endif -#ifdef SIMD_HVX_ENABLE - if (Hvx::Enable && width >= Hvx::A) - Hvx::AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride); - else #endif Base::AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride); } diff --git a/src/Test/TestAddFeatureDifference.cpp b/src/Test/TestAddFeatureDifference.cpp index 02655bc8d2..745044a4eb 100644 --- a/src/Test/TestAddFeatureDifference.cpp +++ b/src/Test/TestAddFeatureDifference.cpp @@ -127,11 +127,6 @@ namespace Test result = result && AddFeatureDifferenceAutoTest(FUNC(Simd::Neon::AddFeatureDifference), FUNC(SimdAddFeatureDifference)); #endif -#ifdef SIMD_HVX_ENABLE - if (Simd::Hvx::Enable && TestHvx(options) && W >= Simd::Hvx::A) - result = result && AddFeatureDifferenceAutoTest(FUNC(Simd::Hvx::AddFeatureDifference), FUNC(SimdAddFeatureDifference)); -#endif - return result; } }