From SIMD Wrappers to SIMD Ranges (pt 2).
Joel Falcou, Denis Yaroshevskiy
Compiling multiple versions
- dlls (tutorial)
- one binary
- ODR / modules
- Can the standard help?
Tuning algorithms
- Usecases can differ
- Experiments
- unrolling/aligning/cardinal
- sparse/dense
Is this a problem?
- Data is in L1
- Operation is very cheap
- Peter Corders
- align when it's cheap
Library support?
- eve::aligned_ptr / aligned iterators
- "aligned load is safe" trick
- Is the input range aligned?
- legacy instructions
- simd_flag_aligned
Thanks
- Peter Cordes
- Ilya Albrecht
- Mohamed Mediouni
- Geoff Langdale
What are we talking about?
- NOT range<simd>
- algo::range ~ ranges::range
- iterator is a position
contiguous_range?
- Positions outside
- previous_aligned/next_aligned
- base + offset
is everything random access?
eve iterator model
- value_type
- types_to_consider
- operator + / - / <=>
- read / write / load / store
- ---------------------------
- iterator_cardinal / cardinal_cast
- *partially_aligned* / unalign
views
- convert
- zip
- map*
- iota
- reverse/backward
no filter view
- compress store
- transform_copy_if
map view
- [](wide<int, N>){}
- value_type
- what's N?
- Luke D'alessandro: projections
Sharing iteration logic
- iteration(options, range, delegate)
- for_each_iteration
- for_each_iteration_fixed_overflow
- for_each_iteration_with_expensive_optional_part
- two_stage_iteration
Performance portability
- compress/masked store/table lookup
- don't expose
- don't care
- query
Why not std::array?
- std::array is great
- intent
- sizeof(4 shorts)
- dynamic sizes
- element access
- ABI
Regularity
Regularity
- it could work
- std::array is great
- simd and scalar code to look the same
- all(==) - mostly tests
- regular operator< - ?
- garbage
- dynamic size
- no problematic usecase
Thanks
- Co-authors of eve
- Matthias Kretz
- std::datapar contributors
- People sharing their research