2

モンテカルロ法を使用して確率微分方程式をシミュレートしています。これは、異なる実現が互いに依存しないため、原則として 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);
}

助けていただければ幸いです。前もって感謝します :-)

4

3 に答える 3

2

よくある間違いは、各スレッドに独自の乱数ジェネレーターが必要であることを忘れていることです。そうでない場合、dW を呼び出すたびに、(プライベートではなく共有された) 乱数ジェネレーターの内部状態が台無しになります。

これが役立つことを願っています。

于 2013-05-24T23:08:58.160 に答える
2

私が見る問題の 1 つは、変数に競合状態があることですprice。減量すればいいのに

#pragma omp parallel for private(VOld, VNew) reduction(+:price)

同じことがあなたの変数にも当てはまりますOptionPrice

また、rng は非公開ではなく、まだ共有されているように見えます。プライベートにするか、プライベートと宣言する場合は、並列ブロックで定義する必要があります(プライベート変数については、プライベートと宣言するよりも、自動的にプライベートにする並列ブロックで宣言することを好みます)。

于 2013-05-25T13:58:56.357 に答える