在现代奔腾上,似乎不再可能向处理器提供分支提示。假设像 gcc 这样的配置文件编译器具有配置文件引导优化获得有关可能的分支行为的信息,它可以做些什么来生成执行更快的代码?
我知道的唯一选择是将不太可能的分支移动到函数的末尾。还有别的事吗?
更新。
http://download.intel.com/products/processor/manual/325462.pdf第 2a 卷,第 2.1.1 节说
“分支提示前缀 (2EH, 3EH) 允许程序向处理器提示最可能的分支代码路径。仅将这些前缀与条件分支指令 (Jcc) 一起使用。其他使用分支提示前缀和/或其他带有 Intel 64 或 IA-32 指令的未定义操作码被保留;这样的使用可能会导致不可预知的行为。”
我不知道这些是否真的有任何影响。
另一方面,第 3.4.1 节。http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf说_
" 编译器生成的代码可提高英特尔处理器中分支预测的效率。英特尔 C++ 编译器通过以下方式完成此任务:
- 将代码和数据保存在不同的页面上
- 使用条件移动指令消除分支
- 生成与静态分支预测算法一致的代码
- 在适当的地方内联
- 如果迭代次数是可预测的,则展开
通过配置文件引导优化,编译器可以布置基本块以消除函数最常执行路径的分支,或者至少提高它们的可预测性。分支预测不必是源级别的关注点。有关详细信息,请参阅英特尔 C++ 编译器文档。"
http://cache-www.intel.com/cd/00/00/40/60/406096_406096.pdf在“PGO 的性能改进”中说
" PGO 最适用于具有许多在编译时难以预测的频繁执行分支的代码。一个示例是具有密集错误检查的代码,其中错误条件大部分时间都是错误的。不经常执行(冷)错误处理代码可以重新定位,因此很少会错误地预测分支。将交错到频繁执行(热)代码中的冷代码最小化可以改善指令缓存行为。