如何优化因 CPU 分支未命中而减慢的跳转指令

How can you optimize jump instruction slowed by cpu branch miss?

本文关键字:指令 何优化 优化 分支 CPU      更新时间:2023-10-16

Background

众所周知,随机分支会花费大量开销。SO中有一篇文章回答了这个问题。

在许多 CPU 架构中,跳转指令也可以看到类似的性能影响。SO中也有关于此类主题的帖子

因此,如果您使用函数指针之类的编程模式,或者只是基于类的普通可继承C++函数调用,我们必须支付分支未命中的成本。

即使是最先进的硬件分支预测算法也只能做基于全局共享地址历史的分支预测,也许它可能会推测性地获取分支目标地址代码等等。

但根据定义,它不适用于第一次执行。

许多嵌入式设备、智能手机等应要求在

  • 启动时间
  • 首次执行应用程序(如浏览器)

它调用了数百万个函数调用,并且可能不想显着改变那里的软件架构,例如将所有间接跳转转换为直接跳转......

如果条件如下,

条件:

  • 必须以最高速度运行
    • 第一次运行时
    • 跳跃对CPU来说看起来完全是随机的

以下是否最好达到结果?

我想知道任何将间接跳转为直接跳转的动态/静态代码重写的示例。

如何获得最大性能:

  • 始终使用可能或不太可能的分支
  • 使用预链接
  • 使用 mlock 或预读,缓存刷新 (ICACHE) 函数调用
  • 重写间接跳转为动态或静态
    直接跳转(发现布拉德利·M·库恩(Bradley M Kuhn)在1996年写的一篇论文,用于某些情况下的静态重写)

我发现的论文是在源代码级别将虚拟函数调用转换为静态函数调用,但二进制链接时间优化似乎更适合软件开发人员的观点。

你是说你可以几乎肯定地预测分支将走向何方,但 CPU 不能?当分支预测失败时,会产生沉重的成本;如果您的分支预测表很热,并且每次都遇到相同的路径,我认为分支预测可能会成功。(如果不一致,那么显然预测不可能100%成功。

对于函数指针和虚函数,您需要预测分支的目标,因为在编译时无法知道接下来需要执行哪些代码。

http://en.wikipedia.org/wiki/Branch_target_predictor

CPU 已经为您执行此操作,请参阅分支预测。