gpt4 book ai didi

performance - 我可以在每次除法时禁用检查零除法吗?

转载 作者:行者123 更新时间:2023-11-29 07:47:40 25 4
gpt4 key购买 nike

为了更好的理解Rusts panic/exception机制,我写了下面这段代码:

#![feature(libc)]

extern crate libc;

fn main() {
let mut x: i32;
unsafe {
x = libc::getchar();
}

let y = x - 65;
println!("{}", x);

let z = 1 / y;
println!("{}", z);
}

我想检查 Rust 如何处理被零除的情况。最初我假设它要么将未处理的 SIGFPE 带到脸上然后死去,要么它实现了一个处理程序并将其重新路由到 panic (现在可以处理了吗?)。

代码很冗长,因为我想确保 Rust 在编译时知道某些东西为零时不会做任何“聪明”的事情,因此用户输入。只需给它一个“A”,它就可以解决问题。

我发现 Rust 实际上生成的代码会在每次除法发生之前检查是否为零除法。我什至看了一次大会。 :-)

长话短说:我可以禁用此行为吗?我想对于更大的数据集,这会对性能产生相当大的影响。为什么不使用我们的 CPU 能力来为我们检测这些东西呢?我可以设置自己的信号处理程序并改为处理 SIGFPE 吗?

根据 an issue on Github前段时间情况肯定不同。

我认为事先检查每个部门离“零成本”还很远。你怎么认为?我是否遗漏了一些明显的东西?

最佳答案

I think checking every division beforehand is far away from "zero-cost". What do you think?

你测量了什么?

执行的指令数是性能的一个非常差的代表;矢量化代码通常更冗长,但速度更快。

所以真正的问题是:这个分支的成本是多少?

由于故意除以 0 的可能性很小,而无意中除以 0 的可能性稍大一些,因此分支总是会被正确预测,除以 0 时除外。但是,考虑到 panic 的代价,错误预测的分支是你最不担心的事情。

因此,成本是:

  • 稍胖的装配体,
  • 分支预测器中的一个占用槽。

确切的影响很难确定,对于数学密集型代码,它可能会产生影响。尽管我会提醒您,整数除法一开始是 ~100 个周期1,因此大量数学代码会尽可能避开它(它可能是您的程序中最耗时的一条指令)中央处理器)。

1 参见 Agner Fog's Instruction Table :例如,在 Intel Nehalem DIV 和 IDIV 上,64 位积分的延迟分别为 28 到 90 个周期和 37 到 100 个周期。


除此之外,rustc 是在 LLVM 之上实现的,它委托(delegate)实际代码生成。因此,rustc 在许多情况下都受 LLVM 的支配,这就是其中之一。

LLVM 有两条整数除法指令:udiv and sdiv .

两者都有除数为 0 的未定义行为。

Rust 旨在消除未定义的行为,因此必须防止除以 0 的发生,以免优化器破坏发出的代码而无法修复。

它按照 LLVM 手册中的建议使用检查。

关于performance - 我可以在每次除法时禁用检查零除法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42544491/

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