The combined effect of this sequence of change is:

  * a reduction in the number of template instantiations, by
    - avoiding needless dependency of IndexType,
    - special formulas for low-rank extents,
    - special formulas for (nearly) fully dynamic extents.

  * improved code quality, by
    - precomputing partial products of the static extents,
    - special cases for low-rank extents,
    - rewriting the condition E[i] == dynamic_extent in a more
      optimizer friendly manner.
    - effectively loop-unrolling extents::operator==.

While simplistic micro-benchmarking shows the effectiveness of these
changes, likely the stronger argument is presented in each commit:
  a) each change removes needless complexity,
  b) before/after examples of generated code show the effectiveness.

Luc Grosheintz (8):
  libstdc++: Reduce template instantiations in <mdspan>.
  libstdc++: Precompute products of static extents.
  libstdc++: Improve low-rank layout_{left,right}::stride.
  libstdc++: Improve fully dynamic extents in mdspan.
  libstdc++: Improve nearly fully dynamic extents in mdspan.
  libstdc++: Reduce indirection in extents::extent.
  libstdc++: Improve extents::operator==.
  libstdc++: Replace numeric_limit with __int_traits in mdspan.

 libstdc++-v3/include/std/mdspan               | 282 +++++++++++++-----
 .../mdspan/extents/class_mandates_neg.cc      |   3 +
 2 files changed, 208 insertions(+), 77 deletions(-)

-- 
2.50.0

Reply via email to