3 个版本 (破坏性)
使用旧 Rust 2015
0.3.0 | 2018年7月1日 |
---|---|
0.2.0 | 2018年6月30日 |
0.1.0 | 2018年2月2日 |
在 Rust 模式 中排名 #1877
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 — 宏的初始实现