我正在使用蒙特卡罗方法模拟随机微分方程,原则上该方法非常适合 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)的)随机数生成器的内部状态。
我希望这会有所帮助。
关于c++ - MC 模拟中的 openmp 私有(private)/共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16744282/