8

OpenMPの使い方を学び始めたところです。次のコードが Visual Studio 2008 と並行して実行されない理由を理解しようとしています。コンパイルして正常に実行されます。ただし、クアッド コア マシンでは 1 つのコアしか使用しません。これは、 MATLAB mex 関数に移植しようとしているコードの一部です。どんなポインタでも大歓迎です。

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v)
for(t = 0; t<T; t++)
{
    dz = aRNG->randn();
    v += mrdt* (tv - v) +
         vv_v_sqrt_dt * dz +
         vv_vv_v_dt*(dz*dz - 1.);

    sum_v += v;
    if(t == ts_count-1)
    {
        int_v->at_w(k++) = sum_v/(double)(t+1);
        ts_count += ts;
    }
}
4

3 に答える 3

5

v 変数は、前の反復の v 値を使用して計算されます

  for(t = 0; t<T; t++) {
     ...
     v += ... ( tv - v ) ....
     ...
  }

それはできません。並列処理が壊れます。ループは、任意の順序で実行できる必要があります。または、一度に異なる並列チャンクを使用して、副作用なしで実行できる必要があります。一見すると、この種のループを並列化できるようには見えません。

于 2010-01-22T00:30:39.040 に答える
0

よくわかりません。OpenMPを使用してから久しぶりですが、ループ変数tがプライベートに設定されています。それはあなたが望むものですか?それは並列化変数ではありませんか?

于 2010-01-21T22:06:10.310 に答える
0

「sum_v」変数を使用している可能性があります。リダクションを実行しているため、ランタイムはおそらくそこに値を蓄積するだけで、ループが完了した後にのみ「通常」にアクセスすることを期待しています。

于 2010-01-21T22:10:38.653 に答える