#simd #sse #no-std

nightly no-std llml_simd

针对多种目标的SIMD(单指令多数据)扩展

7个版本

0.1.6 2024年2月28日
0.1.5 2022年5月4日
0.1.4 2022年4月3日
0.1.3 2022年2月11日

#316 in WebAssembly

42 每月下载量

MIT 许可证

100KB
2.5K SLoC

Crates.io NPM Rust docs

LLML的SIMD

SIMD (Single Instruction Multiple Data) 扩展,适用于多种目标。该项目最初启动是为了方便扩展 LLML 的支持目标和功能

内容

这个crate/library包含了对SSE、AVX(参见 AVX支持)、NEON和WASM的原生级别SIMD指令的绑定(附带一些polyfill)。它还包含所有数据类型的直观实现(参见 直观实现

无std

llml_simd 是一个无std crate。这意味着它可以无缝地用于嵌入式系统项目。

直观实现

如果没有检测到支持的目标(或者您启用了 force_naive 功能),Rust 将以直观模式编译SIMD向量。这种模式将所有数据类型表示为数组,通过迭代器执行大部分方法。虽然 不推荐 使用这种模式,但如果您打算与其他没有SIMD支持的程序共享代码,则该模式很有用。

警告
虽然不是显式的SIMD,但 rustc 可能仍然会优化代码的某些部分以利用SIMD指令,如果您允许它这样做。如果您想完全禁用SIMD指令,请使用x86/x86_64上的 --target-feature=-sse 和arm/aarch64上的 --target-feature=-neon(在这种情况下将自动使用直观模式,无需启用 force_naive

AVX支持

如果Rust检测到 avx 作为目标功能 并且 您已启用 use_avx 功能(参见 功能),则 llml_simd 将使用AVX指令编译所有超过128位长的向量,显著提高性能。

JavaScript库

多亏了WASM,llml_simd 通过npm可用于JavaScript/TypeScript。
您可以使用以下命令将其安装到您的Node项目中:npm i llml_simd

功能

功能 描述
use_std 启用标准库功能。默认启用
force_naive 强制使用原始类型(见原始实现
use_avx 启用AVX SIMD类型的使用(见AVX支持
random 通过rand启用向量的随机生成
serialize 通过serde启用向量的序列化和反序列化

示例

点积(Rust)

use llml_simd::float::single::f32x4;

pub fn main() {
    let alpha = f32x4::new([1., 2., 3., 4.]);
    let beta = f32x4::new([5., 6., 7., 8.]);

    let dot = (alpha * beta).sum();
    assert_eq!(dot, 70.);
}

点积(JavaScript)

import { f32x4 } from llml_simd

let alpha = new f32x4(new Float32Array([1, 2, 3, 4]))
let beta = new f32x4(new Float32Array([5, 6, 7, 8]))

let dot = alpha.mul(beta).sum()
console.assert(dot === 70)

依赖项

~0.3–1MB
~20K SLoC