[PATCH v4] libstdc++: Implement [simd] for C++26
Matthias Kretz
MatthiasKretz@gmx.net
Tue Feb 24 13:03:08 GMT 2026
@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
──────────────────────────────────────────────────────────────────────────
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part.
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260224/21bd63f0/attachment.sig>
More information about the Libstdc++
mailing list