#simd #simd-vector #aligned #memory #alignment

nightly simd_aligned

安全且快速的对齐数据结构,具有简单透明的'扁平'访问方式

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

MIT 许可证

36KB
683

Build Status Maintenance

注意 - 目前不要使用此crate。它已被重新激活以使FFSVM编译,但需要一些架构上的工作。

一句话总结

你想要使用 std::simd,但意识到没有简单、安全且快速的方法来对齐你的内存中的 f32x8(及其朋友),并且将它们作为常规的 f32 切片进行处理以便于加载和操作;simd_aligned 是救星。

亮点

  • 建立在 std::simd 之上,便于数据处理
  • 支持从 u8x2f64x8 的所有类型
  • 以扁平切片(&[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日:初始版本。

常见问题解答

它与 fasterstd::simd 有何关系?

  • simd_aligned 基于 std::simd 构建。它的目标是提供支持简单和安全的标量访问模式的常用 SIMD 对齐数据结构。

  • faster(截至今天)如果你已经拥有现有的扁平切片并且在代码中想要“全 SIMD 操作”,它非常好。然而,特别是当同时处理多个切片时(例如,内核计算),未对齐数组性能的影响可能会变得更为明显(例如,在 ffsvm 中的情况,高达 10% - 20%)。

无运行时依赖