c++ - MC 模拟中的 openmp 私有(private)/共享数据

标签 c++ boost openmp montecarlo

我正在使用蒙特卡罗方法模拟随机微分方程,原则上该方法非常适合 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/

相关文章:

c++ - Boost Date 回到过去

boost - Boost.Hana 中的 BOOST_FUSION_ADAPT_ASSOC 相当于什么?

performance - 带有 "collapse()"的用于嵌套 for 循环的 OpenMP 在没有时性能更差

fortran - openmp 长指令列表 fortran77 的语法

c++ - int 和数组的指针

c++ - 如何使用 Qt c++ QGeoServiceProvider 从地理地址获取纬度/经度?

c++ - 从 SIMD vector 中提取集合字节位置

c++ - BOOST_FOREACH 宏强制方法脱离 Visual Studio 命名空间

c - OpenMP 递归并行性 (QuickSort)

c++ - For循环不会在没有return语句的int函数中终止