是否可以告诉分支预测变量跟随分支的可能性有多大?

为了清楚起见,在这里我不打算进行任何形式的可移植性,因此任何将我与特定机器绑定的解决方案都可以。

基本上,我有一条if语句,它将在99%的时间中将其评估为true,并试图提高性能的最后一个时钟,我是否可以发出某种编译器命令(使用GCC 4.1.2和x86 ISA,如果重要)告诉分支预测器它应该为该分支缓存?


慕姐4208626
浏览 596回答 3
3回答

繁花不似锦

是的,但是没有效果。例外是Netburst之前的较旧(过时)体系结构,即使如此,它也无法做任何可衡量的事情。英特尔在Netburst架构中引入了一个“分支提示”操作码,在某些较旧的架构上,默认的静态分支预测用于冷跳跃(向后预测采用,向前预测未采用)。GCC使用来实现此目标__builtin_expect (x, prediction),其中预测通常为0或1。所有较新的处理器体系结构(> = Core 2)都会忽略编译器发出的操作码。在实际执行某些操作的小角落情况是旧的Netburst架构发生冷跳的情况。英特尔现在建议不要使用静态分支提示,这可能是因为他们认为增加代码大小比提高边际速度有害得多。除了对预测变量的无用分支提示__builtin_expect有用之外,编译器还可以对代码重新排序以提高缓存使用率或节省内存。有多种原因导致其无法正常运行。处理器可以完美预测小循环(n <64)。处理器可以完美地预测小的重复模式(n〜7)。处理器本身可以比编译期间的编译器/编程器更好地估计运行时分支的概率。分支的可预测性(=分支将被正确预测的概率)比采用分支的概率重要得多。不幸的是,这高度依赖于体系结构,并且众所周知,很难预测分支的可预测性。在Agner Fogs 手册中了解有关分支预测的内部工作的更多信息。另请参阅gcc 邮件列表。
打开App,查看更多内容
随时随地看视频慕课网APP