NVIDIA / cccl

CUDA Core Compute Libraries
https://nvidia.github.io/cccl/
Other
1.17k stars 139 forks source link

Strided Iterators and 'Skip' Iterators #706

Open cdeterman opened 6 years ago

cdeterman commented 6 years ago

Is there anything equivalent in Thrust that corresponds to the strided_iterator found in boost compute? On the same topic of operating on specific elements of a buffer, is there a way to operator on 'padded' objects? Note, I also have this same question posted in boost compute For example, take the row-wise padded matrix:

8 2 7 0 0 0
6 5 4 0 0 0
1 3 9 0 0 0 

So the internal flat buffer would be

8 2 7 0 0 0 6 5 4 0 0 0 1 3 9 0 0 0

As an example, how could I use sort on just the 'non-padded' elements?

Likewise, the column wise may also be padded (less common but might as well include here)

8 2 7 0 0 0
6 5 4 0 0 0
1 3 9 0 0 0 
0 0 0 0 0 0
0 0 0 0 0 0 
0 0 0 0 0 0
henryiii commented 6 years ago

I think it only exists as an example: https://github.com/thrust/thrust/blob/master/examples/strided_range.cu

cdeterman commented 6 years ago

@henryiii thanks, I wonder why it hasn't been formally added in to thrust. Any additional thoughts regarding the 'padding' problem?

brycelelbach commented 6 years ago

This falls into the broader category of "multi-dimensional" support, I think, although a skip iterator could be useful for a linear sequence.

We don't have a firm design for what we're going to do in this space. But, I imagine we'll eventually want a family of strided iterators.

Note, however, that traditionally such iterators have all sorts of performance problems.

SEE ALSO: https://www.youtube.com/watch?v=EVGenON6p9g SEE ALSO: https://github.com/brycelelbach/mditerator SEE ALSO: https://github.com/brycelelbach/mdspan SEE ALSO: wg21.link/P0009

jrhemstad commented 2 years ago

@brycelelbach @allisonvacanti there have been several times where I've wanted something very simple like this for linear sequences. I don't think we need a full on md-span or multi-dimensional iterator for something this simple. Similarly, I've wanted a counting_iterator that takes a "step" value.

I imagine these would look something like this:

template <typename InputIterator, typename Stride>
auto make_strided_iterator(InputIterator it, Stride stride);

template <typename Incrementable>
auto make_counting_iterator(Incremenetable begin, Incrementable step);
jrhemstad commented 2 years ago

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1899r0.pdf

Equivalent for ranges.