no-std numeric-array

Wrapper around generic-array that adds efficient numeric trait implementations

20 releases

0.6.1 Jul 5, 2024
0.5.2 Oct 7, 2020
0.5.1 Aug 31, 2020
0.5.0 Apr 11, 2020
0.1.6 Sep 22, 2017

#612 in Data structures

Download history 188/week @ 2024-06-10 229/week @ 2024-06-17 239/week @ 2024-06-24 223/week @ 2024-07-01 171/week @ 2024-07-08 223/week @ 2024-07-15 208/week @ 2024-07-22 238/week @ 2024-07-29 232/week @ 2024-08-05 247/week @ 2024-08-12 180/week @ 2024-08-19 287/week @ 2024-08-26 276/week @ 2024-09-02 278/week @ 2024-09-09 325/week @ 2024-09-16 426/week @ 2024-09-23

1,373 downloads per month
Used in 14 crates (3 directly)

MIT/Apache

59KB
1.5K SLoC

numeric-array

crates.io Documentation MIT/Apache-2 licensed

numeric-array is a wrapper around generic-array that adds efficient numeric trait implementations, designed to encourage LLVM to autovectorize expressions into SIMD instructions and perform compile-time evaluation.

All stable core::ops traits are implemented for NumericArray itself, plus the thin NumericConstant type, which is required to differentiate constant values from NumericArray itself.

Additionally, most of num_traits are implemented, including Num itself. So you can even use a whole array as a generic number.

Example:

use num_traits::Float;
use numeric_array::{NumericArray, narr};

fn main() {
    let a = narr![f32; 1, 2, 3, 4];
    let b = narr![f32; 5, 6, 7, 8];
    let c = narr![f32; 9, 1, 2, 3];

    // Compiles to a single vfmadd213ps instruction on my machine
    let d = a.mul_add(b, c);

    assert_eq!(d, narr![f32; 14, 13, 23, 35]);
}

When used with RUSTFLAGS = "-C opt-level=3 -C target-cpu=native", then Rust and LLVM are smart enough to autovectorize almost all operations into SIMD instructions, or even just evaluate them at compile time. The above example is actually evaluated at compile time, so if you were to view the assembly it would show the result only.

This is ideal for situations where simple component-wise operations are required for arrays.

Dependencies

~320–580KB
~13K SLoC