我正在使用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)的)随机数生成器的内部状态。
我希望这有帮助。