Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign upTracking issue for chunks_exact/_mut; slice chunks with exact size #47115
Comments
sdroege
added a commit
to sdroege/rust
that referenced
this issue
Jan 2, 2018
sdroege
added a commit
to sdroege/rust
that referenced
this issue
Jan 2, 2018
This comment has been minimized.
This comment has been minimized.
|
Example can be found here The relevant part with differences in the assembly is before: .LBB4_24:
cmp r11, 4
mov eax, 4
cmovb rax, r11
test rbx, rbx
je .LBB4_18
cmp rbx, 4
mov edx, 4
cmovb rdx, rbx
test r13, r13
je .LBB4_18
mov qword ptr [rbp - 96], rax
mov qword ptr [rbp - 48], rsi
mov qword ptr [rbp - 56], r9
cmp r11, 3
jbe .LBB4_27
mov qword ptr [rbp - 96], rdx
mov qword ptr [rbp - 48], rsi
mov qword ptr [rbp - 56], r9
cmp rbx, 3
jbe .LBB4_29
cmp rax, 1
je .LBB4_39
lea r10, [r13 + rax]
sub r11, rax
lea r12, [r15 + rdx]
sub rbx, rdx
cmp rax, 3
jb .LBB4_41
je .LBB4_42
movzx r14d, byte ptr [r13]
movzx r8d, byte ptr [r13 + 1]
movzx eax, byte ptr [r13 + 2]
imul r13d, eax, 19595
imul edi, r8d, 38470
imul eax, r14d, 7471
add eax, edi
add eax, r13d
shr eax, 16
mov byte ptr [r15], al
cmp rdx, 1
je .LBB4_44
mov byte ptr [r15 + 1], al
cmp rdx, 3
jb .LBB4_45
mov byte ptr [r15 + 2], al
je .LBB4_46
mov byte ptr [r15 + 3], 0
test r11, r11
mov r15, r12
mov r13, r10
jne .LBB4_24after: .LBB5_18:
test rsi, rsi
je .LBB5_20
add rdx, -4
movzx r10d, byte ptr [rsi]
movzx eax, byte ptr [rsi + 1]
movzx ebx, byte ptr [rsi + 2]
lea rsi, [rsi + 4]
imul r13d, ebx, 19595
imul eax, eax, 38470
imul ebx, r10d, 7471
add ebx, eax
add ebx, r13d
shr ebx, 16
mov byte ptr [rcx], bl
mov byte ptr [rcx + 1], bl
mov byte ptr [rcx + 2], bl
mov byte ptr [rcx + 3], 0
lea rcx, [rcx + 4]
cmp rdx, 4
jae .LBB5_18 |
sdroege
added a commit
to sdroege/rust
that referenced
this issue
Jan 2, 2018
sdroege
added a commit
to sdroege/rust
that referenced
this issue
Jan 2, 2018
sdroege
referenced this issue
Jan 2, 2018
Merged
Add slice::ExactChunks and ::ExactChunksMut iterators #47126
This comment has been minimized.
This comment has been minimized.
|
I don't want to derail your discussion too much. Const generics and value-level chunks both have their uses. I'm reminded of this existing implementation of the "const" kind of chunking, in this case in an iterator that actually allows access to the whole blocks and then the uneven tail at the end: BlockedIter. Note that a |
This comment has been minimized.
This comment has been minimized.
|
Interesting, thanks for mentioning that. For my use case that would probably work more or less the same way, but it's slightly different indeed. |
This comment has been minimized.
This comment has been minimized.
|
BlockedIter was developed while looking at exactly the hand off between the blocks and the elementwise tail; the idea was to avoid some of the loss that otherwise shows up in code that converts between slices and slice iterators. In this case it's the same pointer being bumped through the whole iteration. |
This comment has been minimized.
This comment has been minimized.
|
The chunks iterators are a good candidate for zip specialization (TrustedRandomAccess trait) |
This comment has been minimized.
This comment has been minimized.
|
True. I'll add that in a bit, as a separate PR for the existing chunked iterators and as a separate commit for the new ones. |
sdroege
referenced this issue
Jan 2, 2018
Merged
Implement TrustedRandomAccess for slice::{Chunks, ChunksMut, Windows} #47142
This comment has been minimized.
This comment has been minimized.
|
I forgot to add some benchmark results earlier. This is with the code from #47115 (comment) and running on a 1920*1080*4 byte slice. Basically 2.46x as fast.
|
kennytm
added a commit
to kennytm/rust
that referenced
this issue
Jan 4, 2018
bors
added a commit
that referenced
this issue
Jan 5, 2018
sdroege
added a commit
to sdroege/rust
that referenced
this issue
Jan 9, 2018
bluss
added
T-libs
B-unstable
C-tracking-issue
labels
Jan 13, 2018
bluss
changed the title
Add slice::ExactChunks and ::ExactChunksMut that always returns slices with the requested size
Tracking issue for exact_chunks/_mut; slice chunks with exact size
Jan 13, 2018
sdroege
added a commit
to sdroege/rust
that referenced
this issue
Jan 13, 2018
This comment has been minimized.
This comment has been minimized.
Thinking of this from another direction, if either Rust or LLVM were to magically figure out how to perform this optimization in the case of |
GuillaumeGomez
added a commit
to GuillaumeGomez/rust
that referenced
this issue
Jan 14, 2018
kennytm
added a commit
to kennytm/rust
that referenced
this issue
Jan 15, 2018
kennytm
added a commit
to kennytm/rust
that referenced
this issue
Jan 15, 2018
bors
closed this
in
#47126
Jan 15, 2018
This comment has been minimized.
This comment has been minimized.
|
This shouldn't have been closed by the merge, can someone reopen it? I don't have the permissions for that it seems |
bluss
reopened this
Jan 15, 2018
Kerollmops
referenced this issue
Jan 20, 2018
Open
Implement `par_exact_chunks/_mut`; slice chunks with exact size. #510
This comment has been minimized.
This comment has been minimized.
|
The libs team discussed this and the consensus was to stabilize this with the methods panicking before returning an iterator if the slice’s length is not a multiple of the requested chunk size. This is consistent with e.g. @rfcbot fcp merge |
sdroege
changed the title
Tracking issue for exact_chunks/_mut; slice chunks with exact size
Tracking issue for chunks_exact/_mut; slice chunks with exact size
Sep 25, 2018
pietroalbini
added a commit
to pietroalbini/rust
that referenced
this issue
Sep 25, 2018
This comment has been minimized.
This comment has been minimized.
|
With that done, how do we go from here to stabilization? |
sdroege
referenced this issue
Sep 26, 2018
Merged
Add slice::rchunks(), rchunks_mut(), rchunks_exact() and rchunks_exact_mut() #54580
This comment has been minimized.
This comment has been minimized.
|
The next step would be FCP, but this issue is already in FCP. It has a blocking concern that would need to be resolved by @SimonSapin to make progress (assuming there's consensus about what to do with panicking) |
This comment has been minimized.
This comment has been minimized.
|
Ok we discussed this a bit at libs triage, and the conclusion is that we'd like to recheck that the concerns with the original panicking API are resolved with today's implementation. To recap, today's implementation (on nightly) doesn't panic if the slice doesn't have an exact multiple of the length, but rather it's silently ignored. There are inherent methods on each iterator, though, to pull out the remainder. @shepmaster does this resolve your original concern? Or others as well, any opposition to having the current semantics be stabilized? |
This comment has been minimized.
This comment has been minimized.
I am happy with the current external behavior of the function. |
This comment has been minimized.
This comment has been minimized.
|
Ok great! @SimonSapin can you |
This comment has been minimized.
This comment has been minimized.
|
Are there any new concerns? @SimonSapin |
This comment has been minimized.
This comment has been minimized.
|
@rfcbot resolve panicking |
This comment has been minimized.
This comment has been minimized.
|
Ping checkbox @aturon, @sfackler, or @withoutboats |
rfcbot
added
final-comment-period
and removed
proposed-final-comment-period
labels
Oct 17, 2018
This comment has been minimized.
This comment has been minimized.
rfcbot
commented
Oct 17, 2018
|
|
This comment has been minimized.
This comment has been minimized.
|
Ok! It's been quite awhile here so I think it's ok to shirt circuit the FCP slightly, @sdroege want to send the stabilization PR? |
This comment has been minimized.
This comment has been minimized.
|
Should we consider #54580 to be "trivially enough" similar to this to stabilize at the same time? |
This comment has been minimized.
This comment has been minimized.
SimonSapin
referenced this issue
Oct 18, 2018
Closed
Tracking issue for [T]::rchunks, rchunks_mut, rchunks_exact, rchunks_exact_mut #55177
sdroege
added a commit
to sdroege/rust
that referenced
this issue
Oct 18, 2018
This comment has been minimized.
This comment has been minimized.
|
There's now #55178 for the stabilization of this here (but not |
sdroege commentedJan 2, 2018
•
edited
This is inspired by ndarray and generally seems to allow llvm to remove more bounds checks in the code using the iterator (because the slices will always be exactly the requested size), and doesn't require the caller to add additional checks.
A PR adding these for further discussion will come in a bit.
Open questions:
Should the new iterators panic if the slice is not divisible by the
chunk_size, or omit any leftover elements.The latter is implemented right now and very similar to how
zipworks and @shepmaster even argues that without this, this iterator is kind of useless and the optimization should be implemented as part of the normal chunks iterator (which seems non-trivial, see ).Omission of leftover elements is also how this iterator is implemented in ndarray (but far more general).
~~~For the leftover elements a function could be provided, see #51339 which implements that.~~~
A function for getting access to the remainder exists on the iterator, similar to how
slice::Iterandslice::IterMutgive access to the tail (note: the remainder are the odd elements that don't completely fill a chunk, it's not the tail!)The majority of people (who spoke up here) seem to prefer the non-panicking behaviour
Should it be called
exact_chunksorchunks_exact? The former is how it's called inndarray, the latter is potentially more discoverable in e.g. IDEs.It was renamed to
chunks_exact