Skip to content

Conversation

pratham-mcw
Copy link
Contributor

Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

  • I agree to contribute to the project under Apache 2 License.

  • To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV

  • The PR is proposed to the proper branch

  • This PR introduces an ARM64-specific optimization for the add_mul function in edgeaware_filters_common.cpp using NEON intrinsics.

  • The optimization is applied only when CV_NEON is defined and the runtime NEON check (cv::checkHardwareSupport(CV_CPU_NEON)) passes.

  • The SIMD implementation leverages NEON instructions (vld1q_f32, vmulq_f32, vaddq_f32, vst1q_f32) to accelerate the fused multiply-add operation on 4-element float vectors.

  • This brings parity with existing x64 SIMD optimizations using SSE1.

  • The addition of the ARM64 NEON optimization for the add_mul function in edgeaware_filters_common.cpp has led to performance improvements in some tests of GuidedFilter function.

image

Comment on lines 67 to 71
inline bool CPU_SUPPORT_NEON()
{
static const bool is_supported = cv::checkHardwareSupport(CV_CPU_NEON);
return is_supported;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The checkHardwareSupport function is very simple:

bool checkHardwareSupport(int feature)
{
    CV_DbgAssert( 0 <= feature && feature <= CV_HARDWARE_MAX_FEATURE );
    return currentFeatures->have[feature];
}

No need to add static field for caching.

}
}
#elif CV_NEON
if (CPU_SUPPORT_NEON())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is CV_CPU_HAS_SUPPORT_NEON macro for this:
include/opencv2/core/cv_cpu_helper.h:411:# define CV_CPU_HAS_SUPPORT_NEON (cv::checkHardwareSupport(CV_CPU_NEON))

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @asmorkalov ,
I’ve removed the custom CPU_SUPPORT_NEON() helper and updated the code to use the existing CV_CPU_HAS_SUPPORT_NEON macro instead.

@asmorkalov
Copy link
Contributor

 /usr/bin/ccache /usr/bin/c++  -DCVAPI_EXPORTS -D_USE_MATH_DEFINES -D__OPENCV_BUILD=1 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/ci/opencv/hal/ipp/include -I3rdparty/ippicv/ippicv_lnx/icv/include -I3rdparty/ippicv/ippicv_lnx/iw/include -I/home/ci/opencv/3rdparty/dlpack/include -I/home/ci/opencv_contrib/modules/ximgproc/include -Imodules/ximgproc -I/home/ci/opencv/modules/core/include -I/home/ci/opencv/modules/flann/include -I/home/ci/opencv/modules/imgproc/include -I/home/ci/opencv/modules/dnn/include -I/home/ci/opencv/modules/features2d/include -I/home/ci/opencv/modules/imgcodecs/include -I/home/ci/opencv/modules/calib3d/include -I/home/ci/opencv/modules/video/include -isystem . -isystem /usr/include/eigen3 -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG -fPIC   -std=c++11 -MD -MT modules/ximgproc/CMakeFiles/opencv_ximgproc.dir/src/edgeaware_filters_common.cpp.o -MF modules/ximgproc/CMakeFiles/opencv_ximgproc.dir/src/edgeaware_filters_common.cpp.o.d -o modules/ximgproc/CMakeFiles/opencv_ximgproc.dir/src/edgeaware_filters_common.cpp.o -c /home/ci/opencv_contrib/modules/ximgproc/src/edgeaware_filters_common.cpp
  /home/ci/opencv_contrib/modules/ximgproc/src/edgeaware_filters_common.cpp:64:2: error: #endif without #if
     64 | #endif
        |  ^~~~~
  /home/ci/opencv_contrib/modules/ximgproc/src/edgeaware_filters_common.cpp:63:1: error: expected declaration before '}' token
     63 | }  // end
        | ^

@asmorkalov asmorkalov self-assigned this Sep 15, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants