../hwy/examples/dot_product_mixed_precision.cc fails to compile with: error: no matching function for call to 'SumOfMulQuadAccumulate'
- Dominant language
- C++
- Stars
- 5.8k
- Forks
- 471
- Avg merge
- 1d 6h
- Merged PRs (30d)
- 81
Description
I just git clone latest head of git (ed86e8f) and compiled it. toolchain is gcc-15.3.0, on armv7a. this build is without neon and fails:
```
[55/78] /usr/bin/armv7a-unknown-linux-musleabihf-g++ -DHWY_SHARED_DEFINE -I/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999 -O2 -pipe -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard -fomit-frame-pointer -std=c++17 -fPIE -fvisibility=hidden -fvisibility-inlines-hidden -Wno-builtin-macro-redefined -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\" -fmerge-all-constants -Wall -Wextra -Wconversion -Wsign-conversion -Wvla -Wnon-virtual-dtor -Wcast-align -fmath-errno -fno-exceptions -Wno-psabi -MD -MT CMakeFiles/dot_product_mixed_precision.dir/hwy/examples/dot_product_mixed_precision.cc.o -MF CMakeFiles/dot_product_mixed_precision.dir/hwy/examples/dot_product_mixed_precision.cc.o.d -o CMakeFiles/dot_product_mixed_precision.dir/hwy/examples/dot_product_mixed_precision.cc.o -c /var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc
FAILED: [code=1] CMakeFiles/dot_product_mixed_precision.dir/hwy/examples/dot_product_mixed_precision.cc.o
/usr/bin/armv7a-unknown-linux-musleabihf-g++ -DHWY_SHARED_DEFINE -I/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999 -O2 -pipe -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard -fomit-frame-pointer -std=c++17 -fPIE -fvisibility=hidden -fvisibility-inlines-hidden -Wno-builtin-macro-redefined -D__DATE__=\"redacted\" -D__TIMESTAMP__=\"redacted\" -D__TIME__=\"redacted\" -fmerge-all-constants -Wall -Wextra -Wconversion -Wsign-conversion -Wvla -Wnon-virtual-dtor -Wcast-align -fmath-errno -fno-exceptions -Wno-psabi -MD -MT CMakeFiles/dot_product_mixed_precision.dir/hwy/examples/dot_product_mixed_precision.cc.o -MF CMakeFiles/dot_product_mixed_precision.dir/hwy/examples/dot_product_mixed_precision.cc.o.d -o CMakeFiles/dot_product_mixed_precision.dir/hwy/examples/dot_product_mixed_precision.cc.o -c /var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc: In function 'uint32_t hwy::N_SCALAR::DotProductSIMD(const uint8_t*, const uint8_t*, size_t)':
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc:54:39: error: no matching function for call to 'SumOfMulQuadAccumulate(const DU32&, hwy::N_SCALAR::Vec1, hwy::N_SCALAR::Vec1, V&)'
54 | sum = hn::SumOfMulQuadAccumulate(du32, hn::LoadU(du8, a + i),
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
55 | hn::LoadU(du8, b + i), sum);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc:54:39: note: there are 5 candidates
In file included from /var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/highway.h:727,
from /var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc:26:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5960:22: note: candidate 1: 'template::type>::type>::type, int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DI32, VFromD >, VFromD >, VFromD)'
5960 | HWY_API VFromD SumOfMulQuadAccumulate(DI32 di32,
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5960:22: note: template argument deduction/substitution failed:
In file included from /var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/highway.h:19:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/base.h: In substitution of 'template using hwy::EnableIf = typename hwy::EnableIfT::type [with bool Condition = false]':
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5959:23: required from here
794 | hwy::EnableIf, expected>()>* = nullptr
| ^~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/base.h:627:7: error: no type named 'type' in 'struct hwy::EnableIfT'
627 | using EnableIf = typename EnableIfT::type;
| ^~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5988:22: note: candidate 2: 'template::type>::type>::type, unsigned int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DU32, VFromD >, VFromD >, VFromD)'
5988 | HWY_API VFromD SumOfMulQuadAccumulate(
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5988:22: note: template argument deduction/substitution failed:
In file included from /var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/highway.h:722:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/scalar-inl.h: In substitution of 'template using hwy::N_SCALAR::VFromD = decltype (hwy::N_SCALAR::Zero(D())) [with D = hwy::N_SCALAR::Simd]':
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5988:22: required by substitution of 'template::type>::type>::type, unsigned int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DU32, VFromD >, VFromD >, VFromD) [with DU32 = hwy::N_SCALAR::Simd; hwy::EnableIf<((bool)IsSame::type>::type>::type, unsigned int>())>* = 0]'
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc:54:39: required from here
54 | sum = hn::SumOfMulQuadAccumulate(du32, hn::LoadU(du8, a + i),
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
55 | hn::LoadU(du8, b + i), sum);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/scalar-inl.h:117:29: error: no matching function for call to 'Zero(hwy::N_SCALAR::Simd)'
117 | using VFromD = decltype(Zero(D()));
| ~~~~^~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/scalar-inl.h:117:29: note: there is 1 candidate
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/scalar-inl.h:112:17: note: candidate 1: 'template* , class T> hwy::N_SCALAR::Vec1 hwy::N_SCALAR::Zero(D)'
112 | HWY_API Vec1 Zero(D /* tag */) {
| ^~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/scalar-inl.h:112:17: note: template argument deduction/substitution failed:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6018:22: note: candidate 3: 'template::type>::type>::type, int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DI32, VFromD >, VFromD >, VFromD)'
6018 | HWY_API VFromD SumOfMulQuadAccumulate(
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6018:22: note: template argument deduction/substitution failed:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6053:22: note: candidate 4: 'template::type>::type>::type, long long int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DI64, VFromD >, VFromD >, VFromD)'
6053 | HWY_API VFromD SumOfMulQuadAccumulate(
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6053:22: note: template argument deduction/substitution failed:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6097:22: note: candidate 5: 'template::type>::type>::type, long long unsigned int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DU64, VFromD >, VFromD >, VFromD)'
6097 | HWY_API VFromD SumOfMulQuadAccumulate(
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6097:22: note: template argument deduction/substitution failed:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc:63:37: error: no matching function for call to 'SumOfMulQuadAccumulate(const DU32&, hwy::N_SCALAR::VFromD >, hwy::N_SCALAR::VFromD >, V&)'
63 | sum = hn::SumOfMulQuadAccumulate(du32, hn::LoadN(du8, a + i, remainder),
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
64 | hn::LoadN(du8, b + i, remainder), sum);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/examples/dot_product_mixed_precision.cc:63:37: note: there are 5 candidates
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5960:22: note: candidate 1: 'template::type>::type>::type, int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DI32, VFromD >, VFromD >, VFromD)'
5960 | HWY_API VFromD SumOfMulQuadAccumulate(DI32 di32,
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5960:22: note: template argument deduction/substitution failed:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5988:22: note: candidate 2: 'template::type>::type>::type, unsigned int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DU32, VFromD >, VFromD >, VFromD)'
5988 | HWY_API VFromD SumOfMulQuadAccumulate(
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:5988:22: note: template argument deduction/substitution failed:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6018:22: note: candidate 3: 'template::type>::type>::type, int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DI32, VFromD >, VFromD >, VFromD)'
6018 | HWY_API VFromD SumOfMulQuadAccumulate(
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6018:22: note: template argument deduction/substitution failed:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6053:22: note: candidate 4: 'template::type>::type>::type, long long int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DI64, VFromD >, VFromD >, VFromD)'
6053 | HWY_API VFromD SumOfMulQuadAccumulate(
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6053:22: note: template argument deduction/substitution failed:
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6097:22: note: candidate 5: 'template::type>::type>::type, long long unsigned int>())>* > hwy::N_SCALAR::VFromD hwy::N_SCALAR::SumOfMulQuadAccumulate(DU64, VFromD >, VFromD >, VFromD)'
6097 | HWY_API VFromD SumOfMulQuadAccumulate(
| ^~~~~~~~~~~~~~~~~~~~~~
/var/tmp/portage/dev-cpp/highway-9999/work/highway-9999/hwy/ops/generic_ops-inl.h:6097:22: note: template argument deduction/substitution failed:
```
the full and compressed build log: [build.log.gz](https://github.com/user-attachments/files/32145096/build.log.gz)
Contributor guide
Research direction
Start with hwy/examples/dot_product_mixed_precision.cc at the SumOfMulQuadAccumulate calls on lines 54 and 63, then inspect the candidate overloads in hwy/ops/generic_ops-inl.h and scalar behavior in hwy/ops/scalar-inl.h. Reproduce the reported GCC 15.3.0 armv7a build without NEON; done means the example compiles successfully in that configuration.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- build-system, compilers
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100