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 每月下载量
100KB
2.5K SLoC
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