#array #simd #generic #numeric

无 std numeric-array

封装了泛型数组,增加了高效数值特质的实现

20 个版本

0.6.1 2024年7月5日
0.5.2 2020年10月7日
0.5.1 2020年8月31日
0.5.0 2020年4月11日
0.1.6 2017年9月22日

#344数据结构

Download history 238/week @ 2024-04-26 262/week @ 2024-05-03 243/week @ 2024-05-10 189/week @ 2024-05-17 180/week @ 2024-05-24 175/week @ 2024-05-31 189/week @ 2024-06-07 192/week @ 2024-06-14 243/week @ 2024-06-21 188/week @ 2024-06-28 239/week @ 2024-07-05 202/week @ 2024-07-12 207/week @ 2024-07-19 257/week @ 2024-07-26 225/week @ 2024-08-02 186/week @ 2024-08-09

909 每月下载量
13 个 crate(3 个直接) 中使用

MIT/Apache

59KB
1.5K SLoC

numeric-array

crates.io Documentation MIT/Apache-2 licensed

numeric-array 是一个封装了 generic-array 的包装器,它增加了高效数值特质的实现,旨在鼓励 LLVM 自动将表达式转换为 SIMD 指令并在编译时进行评估。

NumericArray 本身实现了所有稳定的 core::ops 特质,以及必要的薄 NumericConstant 类型,以区分常量值和 NumericArray 本身。

此外,还实现了大多数 num_traits,包括 Num 本身。因此,您甚至可以将整个数组用作泛型数字。

示例

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]);
}

当与 RUSTFLAGS = "-C opt-level=3 -C target-cpu=native" 一起使用时,Rust 和 LLVM 足够聪明,可以将几乎所有操作自动转换为 SIMD 指令,或者甚至仅在编译时进行评估。上面的示例实际上是在编译时进行评估的,所以如果您查看汇编代码,它只会显示结果。

这对于需要数组简单分片操作的场合非常理想。

依赖项

~320–580KB
~13K SLoC