如何优化因 CPU 分支未命中而减慢的跳转指令
How can you optimize jump instruction slowed by cpu branch miss?
Background
众所周知,随机分支会花费大量开销。SO中有一篇文章回答了这个问题。
在许多 CPU 架构中,跳转指令也可以看到类似的性能影响。SO中也有关于此类主题的帖子
因此,如果您使用函数指针之类的编程模式,或者只是基于类的普通可继承C++函数调用,我们必须支付分支未命中的成本。
即使是最先进的硬件分支预测算法也只能做基于全局共享地址历史的分支预测,也许它可能会推测性地获取分支目标地址代码等等。
但根据定义,它不适用于第一次执行。
许多嵌入式设备、智能手机等应要求在
- 启动时间
- 首次执行应用程序(如浏览器)
它调用了数百万个函数调用,并且可能不想显着改变那里的软件架构,例如将所有间接跳转转换为直接跳转......
如果条件如下,
条件:
- 必须以最高速度运行
- 第一次运行时
或 - 跳跃对CPU来说看起来完全是随机的
- 第一次运行时
以下是否最好达到结果?
我想知道任何将间接跳转为直接跳转的动态/静态代码重写的示例。
如何获得最大性能:
- 始终使用可能或不太可能的分支
- 使用预链接
- 使用 mlock 或预读,缓存刷新 (ICACHE) 函数调用
- 重写间接跳转为动态或静态
直接跳转(发现布拉德利·M·库恩(Bradley M Kuhn)在1996年写的一篇论文,用于某些情况下的静态重写)
我发现的论文是在源代码级别将虚拟函数调用转换为静态函数调用,但二进制链接时间优化似乎更适合软件开发人员的观点。
你是说你可以几乎肯定地预测分支将走向何方,但 CPU 不能?当分支预测失败时,会产生沉重的成本;如果您的分支预测表很热,并且每次都遇到相同的路径,我认为分支预测可能会成功。(如果不一致,那么显然预测不可能100%成功。
对于函数指针和虚函数,您需要预测分支的目标,因为在编译时无法知道接下来需要执行哪些代码。
http://en.wikipedia.org/wiki/Branch_target_predictor
CPU 已经为您执行此操作,请参阅分支预测。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 空基优化子对象的地址
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 为新的指令集扩展程序进行了优化的代码的向后兼容性
- 英特尔®事务同步扩展新指令 (TSX-NI) 与英特尔 TSX 有何不同?
- char*与上一条指令中设置的值的比较未优化
- MOVL多数据指令与装配优化对比
- 如何优化因 CPU 分支未命中而减慢的跳转指令
- x86汇编指令优化
- visual编译器指令在C++中重新排序优化(以及禁止它们的原因)
- 确定eigen是否为SSE指令优化了代码
- 为什么GCC或Clang在使用快速数学时不优化到1指令的倒数
- SSE微优化指令顺序
- 为什么不能'B)优化到单个TEST指令
- 您将如何编写可能优化为一条SSE指令的无符号加法代码
- SSE指令在实践中优化了什么,编译器如何启用和使用它们