3

背景

众所周知,随机分支的开销很大。 And there was a post in SO answering such question.如何优化由cpu分支遗漏放慢的跳转指令?

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

所以,如果你使用的函数指针或只是普通的可继承的基于C++类的函数调用的编程模式,我们必须支付分支未命中的代价。

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

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

许多嵌入式设备,智能手机等应

  • 开机时间要求最高性能
  • 像浏览器的应用程序的第一次执行

其中要求数以百万计的函数调用和可能不希望以显着改变那里的软件体系结构,如将所有间接跳转转换为直接跳转...

如果cond itions如下所示,

条件:

  • 必须以最快的速度
    • 在第一次运行
    • 跳跃看起来完全随机的CPU
  • 运行

是否跟随最好的结果是什么?

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

如何获得最大的性能:

  • 始终使用任一分支可能或不可能
  • 使用预链接
  • 使用m锁或预读,cacheflush(ICACHE)函数调用
  • 改写间接跳转至直接跳转动态或静态
    found a paper written in 1996 by Bradley M Kuhn用于某些情况下的静态重写)

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

+2

嗯,没有,有就无条件跳转没有可能的分支预测错误惩罚。 –

+0

这是不是很清楚你真的问。但也许你正在寻找手动插入分支预测器提示?这些是不可移植的,但是你可以在某些平台上使用诸如'likely()或'unlikely()'等宏。 – TJD

+2

@HansPassant,你忘了“直接”。您可能会对无条件的间接跳转进行误预测。 – AProgrammer

回答

2

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

+0

是的,我正在谈论CPU无法预测的情况,程序员可以在编译时或运行时使用附加信息进行预测。 (在文本部分取代直接调用直接调用似乎只是一个解决方案...但我想知道是否有任何指令,如分支可能或类似的告诉CPU分支预测表是热的,或不) – holmes

+0

如果每次呼叫的方式都是相同的,并且呼叫频繁发生,分支预测器将在您没有任何干预的情况下计算出来。 – StilesCrisis

+0

是的,但是如果您想改变主意并随意放置不同的函数指针呢? CPU无法预测这种分支模式。 – holmes