三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Rust 1.98 新 API 助力:浮点运算速度大幅提升,数值代码加速可期!

Rust 1.98 新 API 助力:浮点运算速度大幅提升,数值代码加速可期!

整数求和速度快

先从整数示例作为性能基准,告知 Rust 生成现代硬件支持指令,用 `RUSTFLAGS="-C target-cpu=x86-64-v3"` 编译代码。给出对 int64 类型切片求和的 Rust 函数 `naive_sum_i64`,并在 NumPy 中创建整数数组进行基准测试。测量求和速度,发现每个值仅需 0.5 条 CPU 指令,推测编译器使用 SIMD 指令,实际测试也证实使用 SIMD 指令后 CPU 能快速对整数求和。

浮点求和速度慢?!

创建一百万个浮点值,实现简单浮点求和函数 `naive_sum`,比较整数与浮点求和性能,发现浮点求和慢且编译器未使用 SIMD 浮点操作。原因是浮点运算不满足结合律,如 `a + (b + c)` 不一定等于 `(a + b) + c`,编译器为保证结果与未优化代码相同,不会对浮点操作重新排序或进行可能改变结果的优化。

Rust 的新代数运算符:告知编译器何时灵活处理

从 Rust 1.98 版本开始有新特性,除常规浮点算术运算外,还有新的“代数”算术运算符,允许编译器利用实数代数性质优化浮点运算。

示例:优化的成对求和
对大量浮点数求和可使用算法最小化舍入误差,如 `numpy.sum()` 用的成对求和算法。在 Rust 中实现该算法,添加最上面两个浮点数用普通加法,达到阈值后用代数加法。该实现比 NumPy 快,且与 NumPy 精度大致相同,代码结构更简洁。
另一个示例:平方差之和
计算两个数组平方差之和,给出普通算术运算符和代数运算符的实现。测试结果相似,测量性能发现使用代数运算使代码运行速度快一倍。

加速数值代码!

成对求和算法说明既需严格运算符保证准确性,也需宽松运算符追求速度。用 Rust 编写数值代码可受益,等能使用 Rust 1.98 时可尝试,未使用 Rust 的也可考虑切换。还提到加速 Python 代码的方法及订阅时事通讯学习 Python 工具技术的信息。

← 返回列表