8 个版本
0.4.1 | 2024年6月23日 |
---|---|
0.4.0 | 2023年3月10日 |
0.2.1 | 2019年6月11日 |
0.1.3 | 2018年9月13日 |
0.1.2 | 2018年8月15日 |
#250 in 数据结构
每月 32 次下载
在 3 个crate中使用(通过ffsvm)
36KB
683 行
注意 - 目前不要使用此crate。它已被重新激活以使FFSVM编译,但需要一些架构上的工作。
一句话总结
你想要使用 std::simd
,但意识到没有简单、安全且快速的方法来对齐你的内存中的 f32x8
(及其朋友),并且将它们作为常规的 f32
切片进行处理以便于加载和操作;simd_aligned
是救星。
亮点
- 建立在
std::simd
之上,便于数据处理 - 支持从
u8x2
到f64x8
的所有类型 - 以扁平切片(
&[f32]
)的方式思考,但获得正确对齐的SIMD向量的性能(&[f32x16]
) - 将
u8s
、...、f36s
定义为当前平台的“最佳猜测”(WIP) - 提供多维
VectorD
和 NxM 维度的MatrixD
。
注意:目前这是一个实验性的crate。功能可能会根据 std::simd
的发展而添加或删除。最终目的是能够无障碍地加载和处理数据。
示例
生成一个可以容纳 10
个类型为 f64
元素的向量。内部可能分配 5
个类型为 f64x2
的元素,或 3
个类型为 f64x4
的元素,具体取决于平台。所有元素都保证具有适当的对齐方式,以便快速访问。
#![feature(portable_simd)]
use std::simd::*;
use simd_aligned::*;
// Create vectors of `10` f64 elements with value `0.0`.
let mut v1 = VectorD::<f64s>::with(0.0, 10);
let mut v2 = VectorD::<f64s>::with(0.0, 10);
// Get "flat", mutable view of the vector, and set individual elements:
let v1_m = v1.flat_mut();
let v2_m = v2.flat_mut();
// Set some elements on v1
v1_m[0] = 0.0;
v1_m[4] = 4.0;
v1_m[8] = 8.0;
// Set some others on v2
v2_m[1] = 0.0;
v2_m[5] = 5.0;
v2_m[9] = 9.0;
let mut sum = f64s::splat(0.0);
// Eventually, do something with the actual SIMD types. Does
// `std::simd` vector math, e.g., f64x8 + f64x8 in one operation:
sum = v1[0] + v2[0];
基准测试
使用 simd_aligned
没有性能损失,同时保留了处理扁平数组的所有简单性。
test vectors::packed ... bench: 77 ns/iter (+/- 4)
test vectors::scalar ... bench: 1,177 ns/iter (+/- 464)
test vectors::simd_aligned ... bench: 71 ns/iter (+/- 5)
状态
- 2023年3月10日:在最新的 Rust nightly 版本上再次编译成功。
- 2018年8月8日:初始版本。
常见问题解答
它与 faster 和 std::simd
有何关系?
-
simd_aligned
基于std::simd
构建。它的目标是提供支持简单和安全的标量访问模式的常用 SIMD 对齐数据结构。 -
faster
(截至今天)如果你已经拥有现有的扁平切片并且在代码中想要“全 SIMD 操作”,它非常好。然而,特别是当同时处理多个切片时(例如,内核计算),未对齐数组性能的影响可能会变得更为明显(例如,在 ffsvm 中的情况,高达 10% - 20%)。