如何优化cpu分支未命中减慢的跳转指令?

时间:2012-06-28 14:20:12

标签: c++ compiler-construction programming-languages cpu cpu-architecture

背景

众所周知,随机分支会花费大量开销。 And there was a post in SO answering such question.

许多CPU架构中的跳转指令都可以看到类似的性能影响。 And there was a post in SO for such theme as well

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

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

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

许多嵌入式设备,智能手机等应该要求最高性能

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

调用数百万个函数调用,并且可能不希望更改软件体系结构,就像将所有间接跳转转换为直接跳转一样......

如果条件如下,

条件:

  • 必须以最快的速度运行
    • 在第一次运行时 或
    • 跳转看起来完全随机到cpu

以下是否能达到最佳效果?

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

如何获得最佳性能:

  • 总是使用可能或不太可能的分支
  • 使用预链接
  • 使用mlock或readahead,cacheflush(ICACHE)函数调用
  • 重写间接跳转动态或静态直接跳转 (found a paper written in 1996 by Bradley M Kuhn用于某些情况下的静态重写)

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

3 个答案:

答案 0 :(得分:2)

你是说你可以近乎确定地预测分支将去哪里,但CPU不能?当分支预测失败时会产生沉重的成本;如果您的分支预测表很热并且每次都在达到相同的路径,我认为分支预测可能会成功。 (如果它不一致,那么显然预测不能100%成功。)

答案 1 :(得分:1)

CPU已经为您执行此操作,请参阅Branch Prediction

答案 2 :(得分:1)

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

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