#线性 #组合 #向量

无 std axpy

用于自动矢量化 n-元线性组合的宏

3 个版本 (破坏性)

使用旧 Rust 2015

0.3.0 2018年7月1日
0.2.0 2018年6月30日
0.1.0 2018年2月2日

Rust 模式 中排名 #1877

MIT OR Apache-2.0 OR BSD-2-Clause

10KB
66

AXPY

一个基于宏的替代表达模板的解决方案,用于高效地处理类似于切片的对象的 n-元线性组合,即实现了 .iter().iter_mut() 的对象。经过优化编译,生成的源代码省略了边界检查,将由 LLVM 自动矢量化。

示例

#[macro_use] extern crate axpy;
fn test(a: f64, x: &[f64], y: &[f64], z: &mut [f64]) {
    // some random expression
    axpy![z = a * x + z - 2.*y];

    // this becomes:
    // for (z, (x, y)) in z.iter_mut().zip(x.iter().zip(y.iter())) {
    //     *z = a * *x + 1. * *z - 2. * *y;
    // }
}

几乎所有“合理”的任意数量向量的线性组合(直到编译器宏递归限制)都是允许的,以及其他赋值语句,例如 +=-=,除了 =。赋值的变量可以自由地出现在表达式的任何位置,允许原地修改而不需要辅助变量。有关更多信息,请参阅源代码——就宏代码而言,它注释得相当详细。唯一的限制是,在表达式中,如果标量和向量项相乘,标量必须位于左侧。

许可

许可协议下

  • Apache License 2.0,或者
  • MIT License,或者
  • BSD 2-Clause License,

由您选择。

贡献

除非您明确声明,否则您提交给作品并有意包含在内的任何贡献,根据 Apache-2.0 许可协议定义,应按上述方式三重许可,不附加任何其他条款或条件。

致谢

  • static-cond 是我学习进行令牌相等匹配的方法,该方法用于在此代码中允许赋值变量出现在整个表达式中。

版本

  • 0.3.0 — 通过重新思考宏模式恢复了使用整型类型的能力
  • 0.2.0 — 通过依赖进一步的(已验证)优化(例如 1*x 和 x-0 是无操作)简化了宏
  • 0.1.0 — 宏的初始实现

无运行时依赖