@Jonathan: I assume this patch is on your todo list already? ;) @Thomasz: Should I submit a PR on top of my branch on the forge to get started on complex support?
General comment: There's one important design alternative that might help against template bloat when using very large widths. Right now e.g. vec<double, 63> on SSE is a nasty explosion of the following vec<double, N>: 32, 31 -> 16, 15 -> 8, 7 -> 4, 3 -> 2, 1. So that's 11 different basic_vec instantiations when the user writes vec<double, 63>. Granted, a user shouldn't do that when targeting SSE. So, do we care? If we care, the alternative implementation of vec<double, 63> would use array<vec<double, 2>, 31> and vec<double, 1> as data members. This is possible to implement. But it doesn't make the code easier (especially reductions), and it amounts to a partial rewrite. - Matthias Matthias Kretz [Wednesday, 11 February 2026 16:07:29 CET]: > Tested on x86_64-pc-linux-gnu. > Reviewed by Tomasz at https://forge.sourceware.org/gcc/gcc-TEST/pulls/117. > > ------------- 8< ------------ > > This implementation differs significantly from the > std::experimental::simd implementation. One goal was a reduction in > template instantiations wrt. what std::experimental::simd did. > > Design notes: > > - bits/vec_ops.h contains concepts, traits, and functions for working > with GNU vector builtins that are mostly independent from std::simd. > These could move from std::simd:: to std::__vec (or similar). However, > we would then need to revisit naming. For now we kept everything in > the std::simd namespace with __vec_ prefix in the names. The __vec_* > functions can be called unqualified because they can never be called > on user-defined types (no ADL). If we ever get simd<UDT> support this > will be implemented via bit_cast to/from integral vector > builtins/intrinsics. > > - bits/simd_x86.h extends vec_ops.h with calls to __builtin_ia32_* that > can only be used after uttering the right GCC target pragma. > > - basic_vec and basic_mask are built on top of register-size GNU vector > builtins (for now / x86). Any larger vec/mask is a tree of power-of-2 > #elements on the "first" branch. Anything non-power-of-2 that is > smaller than register size uses padding elements that participate in > element-wise operations. The library ensures that padding elements > lead to no side effects. The implementation makes no assumption on the > values of these padding elements since the user can bit_cast to > basic_vec/basic_mask. > > Implementation status: > > - The implementation is prepared for more than x86 but is x86-only for > now. > > - Parts of [simd] *not* implemented in this patch: > > - std::complex<floating-point> as vectorizable types > - [simd.permute.dynamic] > - [simd.permute.mask] > - [simd.permute.memory] > - [simd.bit] > - [simd.math] > - mixed operations with vec-mask and bit-mask types > - some conversion optimizations (open questions wrt. missed > optimizations in the compiler) > > - This patch implements P3844R3 "Restore simd::vec broadcast from int", > which is not part of the C++26 WD draft yet. If the paper does not get > accepted the feature will be reverted. > > - The standard feature test macro __cpp_lib_simd is not defined yet. > > Tests: > > - Full coverage requires testing > 1. constexpr, > 2. constant-propagating inputs, and > 3. unknown (to the optimizer) inputs > - for all vectorizable types > * for every supported width (1–64 and higher) > + for all possible ISA extensions (combinations) > = with different fast-math flags > ... leading to a test matrix that's far out of reach for regular > testsuite builds. > > - The tests in testsuite/std/simd/ try to cover all of the API. The > tests can be build in every combination listed above. Per default only > a small subset is built and tested. > > - Tests can still emit bogus -Wpsabi warnings (see PR98734) which are > filtered out via dg-prune-output. > > Benchmarks: > > - The current implementation has been benchmarked in some aspects on > x86_64 hardware. There is more optimization potential. However, it is > not always clear whether optimizations should be part of the library > if they can be implemented in the compiler. > > - No benchmark code is included in this patch. > > libstdc++-v3/ChangeLog: > > * include/Makefile.am: Add simd headers. > * include/Makefile.in: Regenerate. > * include/bits/version.def (simd): New. > * include/bits/version.h: Regenerate. > * include/bits/simd_alg.h: New file. > * include/bits/simd_details.h: New file. > * include/bits/simd_flags.h: New file. > * include/bits/simd_iterator.h: New file. > * include/bits/simd_loadstore.h: New file. > * include/bits/simd_mask.h: New file. > * include/bits/simd_mask_reductions.h: New file. > * include/bits/simd_reductions.h: New file. > * include/bits/simd_vec.h: New file. > * include/bits/simd_x86.h: New file. > * include/bits/vec_ops.h: New file. > * include/std/simd: New file. > * testsuite/std/simd/arithmetic.cc: New test. > * testsuite/std/simd/creation.cc: New test. > * testsuite/std/simd/loads.cc: New test. > * testsuite/std/simd/mask.cc: New test. > * testsuite/std/simd/reductions.cc: New test. > * testsuite/std/simd/shift_left.cc: New test. > * testsuite/std/simd/shift_right.cc: New test. > * testsuite/std/simd/simd_alg.cc: New test. > * testsuite/std/simd/sse_intrin.cc: New test. > * testsuite/std/simd/stores.cc: New test. > * testsuite/std/simd/test_setup.h: New test. > * testsuite/std/simd/traits_common.cc: New test. > * testsuite/std/simd/traits_impl.cc: New test. > * testsuite/std/simd/traits_math.cc: New test. > > libstdc++-v3/include/Makefile.am | 12 + > libstdc++-v3/include/Makefile.in | 12 + > libstdc++-v3/include/bits/simd_alg.h | 98 + > libstdc++-v3/include/bits/simd_details.h | 1405 ++++++++++ > libstdc++-v3/include/bits/simd_flags.h | 187 ++ > libstdc++-v3/include/bits/simd_iterator.h | 177 ++ > libstdc++-v3/include/bits/simd_loadstore.h | 399 +++ > libstdc++-v3/include/bits/simd_mask.h | 1946 ++++++++++++++ > .../include/bits/simd_mask_reductions.h | 118 + > libstdc++-v3/include/bits/simd_reductions.h | 109 + > libstdc++-v3/include/bits/simd_vec.h | 2301 +++++++++++++++++ > libstdc++-v3/include/bits/simd_x86.h | 1413 ++++++++++ > libstdc++-v3/include/bits/vec_ops.h | 583 +++++ > libstdc++-v3/include/bits/version.def | 13 + > libstdc++-v3/include/bits/version.h | 9 + > libstdc++-v3/include/std/simd | 48 + > libstdc++-v3/testsuite/std/simd/arithmetic.cc | 336 +++ > libstdc++-v3/testsuite/std/simd/creation.cc | 76 + > libstdc++-v3/testsuite/std/simd/loads.cc | 84 + > libstdc++-v3/testsuite/std/simd/mask.cc | 176 ++ > libstdc++-v3/testsuite/std/simd/reductions.cc | 97 + > libstdc++-v3/testsuite/std/simd/shift_left.cc | 68 + > .../testsuite/std/simd/shift_right.cc | 92 + > libstdc++-v3/testsuite/std/simd/simd_alg.cc | 144 ++ > libstdc++-v3/testsuite/std/simd/sse_intrin.cc | 42 + > libstdc++-v3/testsuite/std/simd/stores.cc | 74 + > libstdc++-v3/testsuite/std/simd/test_setup.h | 807 ++++++ > .../testsuite/std/simd/traits_common.cc | 687 +++++ > .../testsuite/std/simd/traits_impl.cc | 160 ++ > .../testsuite/std/simd/traits_math.cc | 62 + > 30 files changed, 11735 insertions(+) > create mode 100644 libstdc++-v3/include/bits/simd_alg.h > create mode 100644 libstdc++-v3/include/bits/simd_details.h > create mode 100644 libstdc++-v3/include/bits/simd_flags.h > create mode 100644 libstdc++-v3/include/bits/simd_iterator.h > create mode 100644 libstdc++-v3/include/bits/simd_loadstore.h > create mode 100644 libstdc++-v3/include/bits/simd_mask.h > create mode 100644 libstdc++-v3/include/bits/simd_mask_reductions.h > create mode 100644 libstdc++-v3/include/bits/simd_reductions.h > create mode 100644 libstdc++-v3/include/bits/simd_vec.h > create mode 100644 libstdc++-v3/include/bits/simd_x86.h > create mode 100644 libstdc++-v3/include/bits/vec_ops.h > create mode 100644 libstdc++-v3/include/std/simd > create mode 100644 libstdc++-v3/testsuite/std/simd/arithmetic.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/creation.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/loads.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/mask.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/reductions.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/shift_left.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/shift_right.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/simd_alg.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/sse_intrin.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/stores.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/test_setup.h > create mode 100644 libstdc++-v3/testsuite/std/simd/traits_common.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/traits_impl.cc > create mode 100644 libstdc++-v3/testsuite/std/simd/traits_math.cc -- ────────────────────────────────────────────────────────────────────────── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtz Center for Heavy Ion Research https://gsi.de std::simd ──────────────────────────────────────────────────────────────────────────
signature.asc
Description: This is a digitally signed message part.
