我正在使用monte carlo方法模拟随机微分方程,该方法原则上非常适合openMP,因为不同的实现彼此不依赖。不幸的是,我的代码遇到了一些问题,一旦打开openMP,它就会产生错误的结果。没有它,它就可以很好地工作。我的“关键”循环如下所示:

double price = 0.0
#pragma omp parallel for private(VOld, VNew)
for (long i = 0; i < NSim; ++i){
    VOld = S_0;
    for (long index = 0; index < Nt; ++index){
        VNew = VOld  + (dt * r * VOld) + (sqrdt * sig * VOld * dW());
        VOld = VNew;
    }
    double tmp = myOption.PayOff(VNew);
    price += (tmp)/double(NSim);
}

我将非常感谢您的帮助。先感谢您 :-)

最佳答案

一个常见的错误是忘记了每个线程必须具有自己的随机数生成器。如果不是这种情况,那么每次对dW的调用都会弄乱(共享的而不是私有(private)的)随机数生成器的内部状态。

我希望这有帮助。

10-06 09:17