Skip to content

Add IsSorted to hwy/contrib/algo#3111

Merged
copybara-service[bot] merged 1 commit into
google:masterfrom
dcsid:algo/is-sorted
Jun 12, 2026
Merged

Add IsSorted to hwy/contrib/algo#3111
copybara-service[bot] merged 1 commit into
google:masterfrom
dcsid:algo/is-sorted

Conversation

@dcsid

@dcsid dcsid commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Adds IsSorted to hwy/contrib/algo, from the op wishlist. Closes #3094.

IsSorted(d, in, count) matches std::is_sorted (non-decreasing). Per #3094 there is also a comparator overload: comp(d, a, b) returns a mask, true where a is ordered strictly before b — e.g. passing Gt checks descending order. The default forwards Lt.

Implementation follows find-inl.h: 2x-unrolled loop comparing each vector with an overlapping load offset by one element, AllFalse(Or(...)) early-exit, masked LoadN tail.

Tests check both overloads against scalar references: random and boundary lengths, 3 misalignments, random / sorted / all-equal / single-descent inputs (including descents at block boundaries and the last pair). Pass locally on NEON, NEON_BF16, NEON_WITHOUT_AES, EMU128.

Performance vs std::is_sorted (Apple M4 Pro, clang 21 -O2, 64Ki sorted elements = full scan; scalar baseline ~15 µs):

type lanes speedup
int8 16 ~19x
int16 8 ~10x
int32 / float 4 ~4.6x
double 2 ~2.4x

@google-cla

google-cla Bot commented Jun 11, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

Vectorized equivalent of std::is_sorted, with an overload taking a
comparator func (per google#3094): the range is sorted iff comp(d, in[i+1],
in[i]) is false for all i. The default overload checks non-decreasing
order via Lt. Based on the loop structure of find-inl.h: 2x-unrolled
overlapping offset-by-one loads, AllFalse early-exit, masked LoadN tail.
@dcsid dcsid closed this Jun 11, 2026
@dcsid dcsid reopened this Jun 11, 2026
@dcsid

dcsid commented Jun 12, 2026

Copy link
Copy Markdown
Contributor Author

Fix for the pre-existing CI breakage is up: #3113. Happy to rebase this PR once it lands.

@jan-wassenberg jan-wassenberg left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice, thanks for adding - and impressive speedups :) We'll probably be able to merge already because internal tests are green.

@copybara-service copybara-service Bot merged commit a1e1dbf into google:master Jun 12, 2026
35 of 89 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add IsSorted to hwy/contrib/algo (op_wishlist item)

2 participants