gpt4 book ai didi

rust - Rust 中哪些整数运算具有更高性能的替代方法?

转载 作者:行者123 更新时间:2023-11-29 07:45:09 24 4
gpt4 key购买 nike

当在 Rust 中编写将运行数百万次的整数函数时(想想像素处理),使用具有最高性能的操作是很有用的——类似于 C/C++。

虽然引用手册解释了行为的变化,但并不总是很清楚哪些方法比标准的(见注释 1.) 整数算术运算具有更高的性能。我假设 wrapping_add 编译成等同于 C 的加法。

在标准运算(加/减/乘/模/除/移位/位操作...)中,哪些运算具有默认情况下未使用的更高性能替代方案?


注意:

  1. 标准是指使用符号 a + bi/kc % e 的整数运算...等
    您在编写数学表达式时会使用什么 - 除非您有特殊需要使用其中一种包装或返回溢出的方法。
  2. 我意识到回答这个问题可能需要做一些研究。因此,我很乐意通过查看生成的程序集来进行一些检查,以查看哪些操作使用未经检查/原始操作。
  3. 可能是检查/未检查操作之间的速度差异并不显着,如果是这种情况,我仍然希望能够编写一个“快速”版本的函数与“安全”版本进行比较,得出我自己的结论,即它是否是给定功能的合理选择。
  4. 在提到像素处理后,SIMD 已成为一种可能的解决方案。尽管这是一个很好的建议。这仍然给我们留下了不能使用 SIMD 优化的情况,因此快速整数运算的一般情况仍然需要考虑。

最佳答案

Of the standard operations (add / subtract / multiply / modulo / divide / shift / bit manipulation...), which operations have higher performance alternatives which aren't used by default?

请注意,Rust 是为性能而设计的;因此,虽然在 Debug 中检查了整数运算,但在 Release 中它们被定义为包装,除非您特别指示编译器否则。 p>

因此,在具有默认选项的 Release模式下,严格之间没有性能差异:

  • +wrapping_add
  • -wrapping_sub
  • *wrapping_mul
  • /wrapping_div
  • %wrapping_rem
  • <<wrapping_shl
  • >>wrapping_shr

对于无符号整数,性能因此严格类似于 C 或 C++;然而,对于有符号整数,优化器可能会产生不同的结果,因为有符号整数的下溢/溢出在 C 和 C++ 中是未定义的行为(gcc 和 Clang 接受一个 -fwrapv 标志来强制包装即使是有符号整数,但这不是默认值) .

我希望使用 checked_* , overflow_*saturating_*然而,方法通常会更慢。


然后,一个有趣的切线是了解当您按下开关并明确要求检查算法时会发生什么。

目前,Rust 实现1 是下溢/溢出检查的精确实现。每个加法、减法、乘法……都是独立检查的,优化器不擅长融合这些分支。

具体而言,精确 实现可排除临时溢出:5 + x - 5无法优化为 x ,因为 5 + x可能会溢出。它还排除了一般的自动矢量化。

只有当优化器可以证明不存在溢出时(它通常不能),您可能希望重新获得更适合优化的无分支路径。

人们应该注意到,对于一般软件来说,这种影响几乎不明显,因为算术指令只占总成本的一小部分。然而,当这个比例上升时,它会非常明显,而且它确实出现在 SPEC2006 基准测试中的一部分与 Clang 中。

此开销足以被视为不适合默认激活的检查。

1 这是由于 LLVM 方面的技术限制; Rust 实现只是委托(delegate)给 LLVM。


在未来,有希望实现检查的模糊。模糊实现背后的想法是,不是检查每个操作,而是只执行它们并设置一个标志,或者在下溢/溢出的情况下使值中毒。然后,在使用结果之前,执行检查(分支)。

根据 Joe Duffy 的说法,他们在 Midori 中有这样的实现,并且性能影响几乎不明显,因此它似乎是可行的。不过,我还不知道在 LLVM 中有任何类似的努力。

关于rust - Rust 中哪些整数运算具有更高性能的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41101936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com