如果谓词在开始时就确定了,如何减少分支或分支惩罚?

问题描述 投票:0回答:1

考虑以下代码。布尔值

predicate
的真或假取决于用户。所以我们无法判断哪一个更有可能。

if (predicate)
    logicA()
else
    logicB()

不过有一个好处,

predicate
一旦设置,就保证不能再修改了。

我的问题是:

  • 这里的这个案例实际上会引入分支未命中惩罚吗?我做了一些搜索,我知道现代 CPU 中的分支预测器非常智能。例如,他们可以动态预测。因此,就我而言,预测器可能发现谓词始终为真,因此它将切换为始终预测
    logicA()
  • 如果分支未命中不可驱逐,有什么办法可以优化我的问题吗?据我所知,Linux可以重写其代码以从“调试”模式和“非调试”模式切换。这个策略当然不适用于我的情况,因为很难定义“开始时间”本身。编译器或CPU什么时候应该开始假设
    predicate
    已初始化并且不会再改变?我认为这对他们来说是一项艰巨的任务。所以我想知道你是否能想出一些绝妙的主意?
c++
1个回答
0
投票

如果你的谓词从运行假值切换到运行真值,那么分支预测器应该会错过前几个真值,然后切换到准确的预测。

如果这太昂贵,那么您可以使用函数指针作为您调用的东西,并在用户执行该操作时重新分配它一次。但这可能会影响其他优化(例如内联),所以这确实是任何人的猜测。

我会测量目标架构。

© www.soinside.com 2019 - 2024. All rights reserved.