performance - 为什么条件移动不易受到分支预测失败的影响?

标签 performance assembly optimization cpu-architecture branch-prediction

阅读后this post (answer on StackOverflow) (在优化部分),我想知道为什么条件移动不易受到分支预测失败的影响。我发现an article on cond moves here (PDF by AMD) 。此外,他们还声称 cond 具有性能优势。移动。但这是为什么呢?我没看到。在评估该 ASM 指令时,尚不知道前面的 CMP 指令的结果。

最佳答案

错误预测的分支代价高昂

如果一切顺利的话,现代处理器通常每个周期执行一到三个指令(如果它不会停止等待这些指令从先前指令或内存到达的数据依赖性)。

上面的语句对于紧密循环来说出人意料地适用,但这不应该让您忽视一个额外的依赖项,该依赖项可以阻止指令在其周期到来时执行: 对于要执行的指令,处理器必须在 15-20 个周期之前开始获取和解码它。

处理器遇到分支时应该做什么?获取和解码两个目标不会扩展(如果有更多分支,则必须并行获取指数数量的路径)。因此,处理器仅推测地获取并解码两个分支之一。

这就是为什么错误预测的分支代价高昂:它们花费了 15-20 个周期,而这些周期由于高效的指令管道而通常是不可见的。

有条件迁移从来都不是很昂贵

条件移动不需要预测,因此它永远不会有这种惩罚。它与普通指令一样具有数据依赖性。事实上,条件移动比普通指令具有更多的数据依赖性,因为数据依赖性包括“条件真”和“条件假”两种情况。在有条件地将 r1 移动到 r2 的指令之后,r2 的内容似乎取决于 r2 的先前值code> 和 r1。良好预测的条件分支允许处理器推断出更准确的依赖关系。但是,如果数据依赖项需要时间才能到达,那么它们通常需要一到两个周期才能到达。

请注意,从内存到寄存器的条件移动有时会是一个危险的赌注:如果条件是从内存读取的值未分配给寄存器,那么您就白等了内存。但指令集中提供的条件移动指令通常是寄存器到寄存器,从而防止程序员出现这种错误。

关于performance - 为什么条件移动不易受到分支预测失败的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14131096/

相关文章:

optimization - Yslow 替代方案 - 针对小型网站的优化

performance - nodejs、dynamodb 表获取操作回调或异步

c - @function 处的 Mingw32 汇编器错误

assembly - 在 Visual Studio 代码中运行 asm

android - ARM 上的 DACR 读/写

java - 为什么当我在 System.out.println 语句之外调用 System.nanoTime() 时,我的程序运行得很快?

mysql - 这些 MySQL 数据库设计(附后)中的哪一个最适合 moSTLy 读取高性能?

java - 将 node.js 进程与 java/scala 代码连接起来的最快方法

javascript - function.call() 或 click()

c# - 避免 c# 编译器优化临时变量的 Noop 方法