On Friday, 1 March 2013 at 15:38:28 UTC, Piotr Szturmaj wrote:
Range abstraction is limiting some useful optimizations, mainly
vectorization. Even if range internally uses a buffer and does
some SIMD operations on it, it exposes only one element from
this buffer, which can't be used for next SIMD operation. In
other words it limits pipelining.
Well, why don't you write a range whose "elements" are vectors?
Or that operate on vectors.
The range abstraction only defines how you iterate and view a
collection. YOU are the one that defines what the elements in
that collection are.
For example, "chunk" will do exactly that: Given a range, it
transforms it into a range of sub-slices:
//----
int[] arr = iota(0, 16).array(); //[0, 1, 2, ..., 16]
auto chunks = std.range.chunks(arr, 4);
foreach (int[] chunk ; chunks)
{
chunk[] *= 2;
writeln(chunk);
}
//----
What else are you asking for? Nothing is stopping you from
pipping the chunk elements with another range, btw.