有任何可移植的方式进行分支预测提示吗?考虑以下示例:
if (unlikely_condition) {
/* ..A.. */
} else {
/* ..B.. */
}
这和做有什么不同吗?
if (!unlikely_condition) {
/* ..B.. */
} else {
/* ..A.. */
}
还是使用编译器特定提示的唯一方法? (例如,GCC上的__builtin_expect)
编译器会根据条件的顺序对
if
条件进行不同的处理吗? 最佳答案
进行静态分支预测的规范方法是if
不分支地进行预测(即,每个if
子句都被执行,而不是else
),并采用循环和向后goto
。因此,如果您希望静态预测很重要,请不要在else
中放入常见情况。绕过未采取的循环并不容易。我从未尝试过,但我想将它放在else
子句中应该可以很好地移植。
许多编译器支持某种形式的#pragma unroll
,但是仍然有必要使用某种#if
保护它以保护其他编译器。
理论上,分支预测提示可以表达有关如何转换程序的流控制图以及如何将基本块安排在可执行内存中的完整描述……因此,有各种各样的事情要表达,并且大多数都不是很可移植。
正如GNU在__builtin_expect
文档中所建议的那样,配置文件引导的优化优于提示,并且工作量较小。