#simd-accelerated #iterator #find #max #itertools #position #filter #standard #argmax #argmin

simd-itertools

SIMD-accelerated alternatives for common operations like contains, max, find etc

7 releases

0.3.0 Feb 8, 2025
0.2.3 Jul 15, 2024
0.1.1 Jul 11, 2024

#281 in Concurrency

Download history 181/week @ 2025-02-25 214/week @ 2025-03-04 138/week @ 2025-03-11 69/week @ 2025-03-18 56/week @ 2025-03-25 213/week @ 2025-04-01 84/week @ 2025-04-08 80/week @ 2025-04-15 39/week @ 2025-04-22 27/week @ 2025-04-29 116/week @ 2025-05-06 106/week @ 2025-05-13 222/week @ 2025-05-20 59/week @ 2025-05-27 39/week @ 2025-06-03 17/week @ 2025-06-10

356 downloads per month
Used in candystore

MIT/Apache

150KB
798 lines

SIMD-accelerated iterators

crates.io

Unmatched flexibility 🤯

let needles = [42, 52, 94];
arr.iter().any_simd(|x| needles.contains(x) || x > 156);
  • Works by letting LLVM do the vectorization (may change in the future).
  • Functions are made easy to paste into Godbolt for inspection.

Currently the following are implemented:

find filter position all any argmin/argmax

Tradeoffs

Every piece of software makes tradeoffs. The goal of this library it to provide the majority of performance gains gained from going scalar -> vectorized, while staying user-friendly. If you are looking to shave off the last few cycles this might not be what you are looking for.

⚠️ Warning ⚠️:

The library makes one extra assumption over the stdlib: The closure may be executed any number of times:

arr.iter().simd_position(|x| {
    println!("hello world");
    *x == 42
})

May print a different number of times compared to the standard library. This shouldn't be an issue under normal use-cases but something to keep in mind.

Why is this not part of the standard library

It's tricky. Hopefully one day.

Dependencies

~220–650KB
~15K SLoC