8

我刚开始学习如何使用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;
    }
}
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 回答