Skip to content

dnn: use dispatching for Winograd optimizations#26155

Merged
asmorkalov merged 1 commit intoopencv:4.xfrom
mshabunin:dnn-dispatch
Nov 14, 2024
Merged

dnn: use dispatching for Winograd optimizations#26155
asmorkalov merged 1 commit intoopencv:4.xfrom
mshabunin:dnn-dispatch

Conversation

@mshabunin
Copy link
Copy Markdown
Contributor

@mshabunin mshabunin commented Sep 17, 2024

Problem:

  • build OpenCV with -DCPU_BASELINE= configuration option (x86_64)
  • build fails with missing symbols in dnn module

Solution

Use standard OpenCV dispatching mechanism for Winograd function

TODO:

  • Remove debugging output (CV_LOG_WARNING and Winofunc::name field)
  • Check NEON_FP16 Winograd implementation (build with -DENABLE_FP16=ON should enable useFP16)
  • Remove block size assertions in implementations (e.g. CV_Assert(winoIblock == 3 && ...)
  • Use single namespace in .simd.hpp file

@asmorkalov
Copy link
Copy Markdown
Contributor

Dispatch works with jetson orin. Please go ahead and clean-up the debug logs.

@mshabunin mshabunin force-pushed the dnn-dispatch branch 2 times, most recently from 59b6ef2 to 0db738c Compare October 25, 2024 17:15
@asmorkalov
Copy link
Copy Markdown
Contributor

I tried ARMv7 with cmake -DCPU_BASELINE= -DCPU_DISPATCH=NEON ../opencv and got build error:

[ 38%] Building CXX object modules/highgui/CMakeFiles/opencv_highgui.dir/src/backend.cpp.o
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp: In function ‘cv::dnn::Winofunc cv::dnn::getWinofunc_F32()’:
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:14:50: error: ‘getWinofunc_F32’ is not a member of ‘cv::dnn::opt_NEON’
     CV_CPU_DISPATCH(getWinofunc_F32, (), CV_CPU_DISPATCH_MODES_ALL);
                                                  ^
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:14:50: note: suggested alternatives:
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:12:19: note:   ‘cv::dnn::getWinofunc_F32’
 cv::dnn::Winofunc getWinofunc_F32()
                   ^
In file included from /mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:6:0:
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.simd.hpp:1342:19: note:   ‘cv::cpu_baseline::getWinofunc_F32’
 cv::dnn::Winofunc getWinofunc_F32()
                   ^
In file included from /mnt/disk/opencv/modules/core/include/opencv2/core/private/cv_cpu_include_simd_declarations.hpp:26:0,
                 from /mnt/disk/opencv-build/modules/dnn/layers/cpu_kernels/conv_winograd_f63.simd_declarations.hpp:3,
                 from /mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:7:
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.simd.hpp:13:19: note:   ‘cv::opt_NEON::getWinofunc_F32’
 cv::dnn::Winofunc getWinofunc_F32();
                   ^
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp: In function ‘cv::dnn::Winofunc cv::dnn::getWinofunc_F16()’:
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:19:50: error: ‘getWinofunc_F16’ is not a member of ‘cv::dnn::opt_NEON’
     CV_CPU_DISPATCH(getWinofunc_F16, (), CV_CPU_DISPATCH_MODES_ALL);
                                                  ^
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:19:50: note: suggested alternatives:
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:17:19: note:   ‘cv::dnn::getWinofunc_F16’
 cv::dnn::Winofunc getWinofunc_F16()
                   ^
In file included from /mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:6:0:
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.simd.hpp:1851:19: note:   ‘cv::cpu_baseline::getWinofunc_F16’
 cv::dnn::Winofunc getWinofunc_F16()
                   ^
In file included from /mnt/disk/opencv/modules/core/include/opencv2/core/private/cv_cpu_include_simd_declarations.hpp:26:0,
                 from /mnt/disk/opencv-build/modules/dnn/layers/cpu_kernels/conv_winograd_f63.simd_declarations.hpp:3,
                 from /mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp:7:
/mnt/disk/opencv/modules/dnn/src/layers/cpu_kernels/conv_winograd_f63.simd.hpp:14:19: note:   ‘cv::opt_NEON::getWinofunc_F16’
 cv::dnn::Winofunc getWinofunc_F16();
                   ^
modules/dnn/CMakeFiles/opencv_dnn.dir/build.make:718: recipe for target 'modules/dnn/CMakeFiles/opencv_dnn.dir/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp.o' failed
make[2]: *** [modules/dnn/CMakeFiles/opencv_dnn.dir/src/layers/cpu_kernels/conv_winograd_f63.dispatch.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
[ 39%] Building CXX object modules/highgui/CMakeFiles/opencv_highgui.dir/src/window.cpp.o

@mshabunin
Copy link
Copy Markdown
Contributor Author

I tried ARMv7 with cmake -DCPU_BASELINE= -DCPU_DISPATCH=NEON ../opencv and got build error:

This issue should be fixed now.

@asmorkalov asmorkalov merged commit 4866811 into opencv:4.x Nov 14, 2024
@mshabunin mshabunin deleted the dnn-dispatch branch November 14, 2024 19:29
@asmorkalov asmorkalov mentioned this pull request Nov 21, 2024
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