我遇到了关于分支预测的帖子(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()
需要重置当前状态和可能的一些簿记变量。可能它只需要