gpt4 book ai didi

c++ - 分支预测和除以零

转载 作者:IT老高 更新时间:2023-10-28 12:48:07 34 4
gpt4 key购买 nike

我正在编写如下所示的代码...

if(denominator == 0){
return false;
}
int result = value / denominator;

...当我想到 CPU 中的分支行为时。

https://stackoverflow.com/a/11227902/620863这个答案表示 CPU 将尝试正确猜测分支将走向哪条路,并且只有在发现它错误地猜测分支时才停止该分支。

但是如果 CPU 错误地预测了上面的分支,它会在下面的指令中除以零。但这并没有发生,我想知道为什么? CPU 是否实际上执行了除以零并在执行任何操作之前等待查看分支是否正确,或者它是否可以告诉它在这些情况下不应该继续?怎么回事?

最佳答案

当基于预测推测性地执行分支时,CPU 可以自由地做任何事情。但它需要以对用户透明的方式这样做。因此它可能会出现“除以零”错误,但如果分支预测结果错误,这应该是不可见的。按照同样的逻辑,它可能会将写入分阶段写入内存,但实际上可能不会提交。

作为一名 CPU 设计师,我不会费心去预测过去这样的故障。那可能不值得。故障可能意味着一个错误的预测,并且很快就会自行解决。

这种自由是件好事。考虑一个简单的 std::accumulate 循环。分支预测器会正确预测很多跳转(for (auto current = begin, current != end;++current) 通常会跳回到循环的开头),并且有很多可能出现故障的内存读取次数 (sum += *current)。但是在前一个分支解决之前拒绝读取内存值的 CPU 会慢很多。然而,在循环结束时错误预测的跳转很可能会导致无害的内存故障,因为预测的分支试图读取缓冲区。这需要在没有明显故障的情况下解决。

关于c++ - 分支预测和除以零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31782587/

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