分支预测和随机过程(例如蒙特卡罗)

时间:2015-11-03 12:41:38

标签: c random branch-prediction

我遇到了关于分支预测的帖子(Why is it faster to process a sorted array than an unsorted array?),它让我想到了我自己的蒙特卡罗模拟。为了特殊起见,我们假设我们正在使用C语言并为CPU编写代码。 (这有关系吗?)假设你有一个类似这样的循环:

while ( condition ) {

    // dE will be stochastic...
    dE = MonteCarloMove();

    // ...and d is a random number between 0 and 1
    d = RandomRealNumber(0,1);

    w = exp(-dE);
    if ( dE < 0 || d < w ) {
        AcceptMonteCarloMove();
    }
    else {
        RejectMonteCarloMove();
    }
}

在我看来,if..else语句中的分支预测是完全无用的,因为它是随机的。在正确设计的蒙特卡罗模拟中,您将获得与拒绝一样多的接受。所以这是我的问题:

  • 是否有任何技术可以用来避免像这样的随机过程中的分支减速?
  • 如果是这样,考虑到MonteCarloMove()可能涉及一些昂贵的数值计算,它是否可能提供任何显着的加速?

更新:如果这个一般性问题无法解决,或者答案通常是否定的,假设我们可以对if语句中的函数做出一些假设:

  • AcceptMonteCarloMove()是一个更新模拟当前状态的函数。它可能需要做的就是
    • 将值从一个变量复制到另一个变量;
    • 执行简单算术(加法/减法)。
  • RejectMonteCarloMove()需要重置当前状态和可能的一些簿记变量。可能它只需要
    • 将值从一个变量复制到另一个变量。

0 个答案:

没有答案