On Tue, Feb 24, 2026 at 2:04 PM Matthias Kretz <[email protected]>
wrote:

> @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?
>
Yes, I think so.

>
> 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?
>
I think the above ouput is something that I would expect when I ask for 63
elements
simd vec, so I would say we are OK for now.

>
> 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
> ──────────────────────────────────────────────────────────────────────────
>

Reply via email to