-
-
Notifications
You must be signed in to change notification settings - Fork 56.3k
Description
System Information
OpenCV version: 4.x / 3.x
Target architecture: ppc64le, POWER9
Compiler: GCC 13.x
Operating system: openSUSE Tumbleweed
VSX enabled: Yes (CV_VSX=ON)
Downstream project: ncnn
Detailed description
OpenCV builds successfully on POWER9 with VSX enabled.
However, when building a downstream project (such as ncnn) that uses OpenCV and links against it, the linker fails due to missing symbols related to vector conversion functions between float and double precision:
undefined reference to vec_cvfo(vector double const&)
This is because in vsx_utils.hpp, the functions:
VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, vec_floate)
VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, vec_doubleo)
are only valid if the underlying architecture supports POWER10-level VSX instructions for float64<->float32 conversion.
POWER9 lacks these instructions, but the macro doesn't guard against this, and there is no fallback definition. As a result, OpenCV compiles fine (no direct call), but consumers that indirectly rely on these intrinsics fail at link time.
Steps to reproduce
- Use a POWER9 (ppc64le) system with VSX enabled (e.g., GCC defines VSX)
- Build OpenCV 4.12.0 with default options (no error)
- Build ncnn with OpenCV support enabled
- Error:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[ 74s] 260 | VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[ 74s] 261 | VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[ 74s] from /usr/include/opencv2/core.hpp:53,
[ 74s] from /usr/include/opencv2/core/core.hpp:48,
[ 74s] from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/squeezenet.cpp:21:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[ 74s] 260 | VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[ 74s] from /usr/include/opencv2/core.hpp:53,
[ 74s] from /usr/include/opencv2/core/core.hpp:48,
[ 74s] from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/yolov3.cpp:20:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[ 74s] 260 | VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[ 74s] from /usr/include/opencv2/core.hpp:53,
[ 74s] from /usr/include/opencv2/core/core.hpp:48,
[ 74s] from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/fasterrcnn.cpp:21:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[ 74s] 260 | VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[ 74s] from /usr/include/opencv2/core.hpp:53,
[ 74s] from /usr/include/opencv2/core/core.hpp:48,
[ 74s] from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/yolov2.cpp:20:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[ 74s] 260 | VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[ 74s] from /usr/include/opencv2/core.hpp:53,
[ 74s] from /usr/include/opencv2/core/core.hpp:48,
[ 74s] from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/rfcn.cpp:21:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[ 74s] 260 | VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[ 74s] 261 | VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[ 74s] 261 | VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[ 74s] 261 | VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[ 74s] 261 | VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[ 74s] from /usr/include/opencv2/core.hpp:53,
[ 74s] from /usr/include/opencv2/core/core.hpp:48,
[ 74s] from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/yolov5.cpp:21:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[ 74s] 260 | VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[ 74s] 261 | VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp)
[ 74s] | ^~~~~~~~~~~~~~~~
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[ 74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[ 74s] 261 | VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp)
Suggested Fix
Issue submission checklist
- I report the issue, it's not a question
- I checked the problem with documentation, FAQ, open issues, forum.opencv.org, Stack Overflow, etc and have not found any solution
- I updated to the latest OpenCV version and the issue is still there
- There is reproducer code and related data files (videos, images, onnx, etc)