试图了解为什么OpenMP代码不平行

我刚开始学习如何使用OpenMP。 我想弄清楚为什么下面的代码不能与Visual Studio 2008并行运行。它编译并运行正常。 但是它在我的四核机器上只使用了一个核心。 这是我尝试移植到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;
    }
}

v变量是使用先前迭代的v值计算的

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

你不能那样做,它打破了平行。 该循环必须能够以任何顺序运行,或者一次运行不同的并行块​​,而没有副作用。 乍一看,它看起来并不像你可以并行化这种循环。


我不太确定,自从我使用OpenMP之后已经很长时间了,但是您将循环变量t设置为私有。 那是你要的吗? 这不是平行化变量吗?


一种可能性是你正在使用“sum_v”变量。 由于您正在执行缩减操作,因此运行时可能只会在其中累积值,并且只有在循环完成后才能“正常”访问它。

链接地址: http://www.djcxy.com/p/44133.html

上一篇: Trying to know why the OpenMP code does not parallelise

下一篇: Design pattern for a database application that must work disconnected