arm - 当前 CPU 上的分支预测有多普遍?

标签 arm cpu-architecture branch-prediction

由于对性能的巨大影响,我从不怀疑我现在的桌面CPU是否有分支预测。当然可以。但各种 ARM 产品又如何呢? iPhone或Android手机有分支预测吗?较旧的任天堂 DS?基于 PowerPC 的 Wii 怎么样? PS 3?

它们是否具有复杂的预测单元并不那么重要,但它们是否至少具有一些动态预测,以及它们是否按照预期执行一些指令分支。

具有分支预测功能的 CPU 的截止值是多少?几十年前的手持式计算器显然没有这个功能,而我的台式电脑却有。但是谁能更清楚地概述动态分支预测的位置呢?

如果还不清楚,我说的是条件变化的预测,在运行时改变预期路径。

最佳答案

任何具有超过几个阶段的管道的 CPU 至少需要一些原始分支预测,否则它可能会停止等待计算结果以决定走哪条路。 Intel Atom 是一个有序核心,但具有相当深的管道,因此需要一个相当不错的分支预测器。

旧的 ARM 7 设计只有三个阶段。将其与分支延迟槽(MIPS 上必需,SPARC 上可选)之类的东西结合起来,分支预测就没那么有用了。

顺便说一句,当 MIPS 决定通过超过 4 个流水线级来获得更高性能时,分支延迟槽就成了一个烦恼。在最初的设计中,这是必要的,因为没有分支预测器。因此,您必须在分支之前执行的最后一条指令之前对分支指令进行排序。由于管道较长,他们需要一个分支预测器,从而消除了对分支延迟槽的需要,但无论如何他们都必须模拟它才能运行旧代码。

分支延迟槽的问题是它只能在大约 50% 的时间内被有用的指令填充。其余时间,您要么用结果可能会被丢弃的指令填充它,要么使用 NO-OP。

关于arm - 当前 CPU 上的分支预测有多普遍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8241426/

相关文章:

c - 使用 __builtin_expect 进行边界检查

assembly - 从人为的子例程返回到修改后的返回地址时,BR/RET 时序差异

c - 如何使用 ARM Cortex A9 中的 SWI 来使能 IRQ 中断?

c++ - 程序运行良好数小时,最终出现内存地址 0x10 的段错误

floating-point - 了解 FMA 指令性能

Android 模拟器 ABI

caching - 如何查看末级缓存中有多少个切片?

linux - 在 x64 Ubuntu 主机上获取 arm 的开发库包?

arm - 不同的ARM厂商提供的指令集不同吗?

optimization - 优化分支预测:如何概括可以在不同的编译器,解释器和硬件预测下运行的代码?