c – 试图了解OpenMP代码不能并行化的原因

前端之家收集整理的这篇文章主要介绍了c – 试图了解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 ) ....
     ...
  }

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

原文链接:https://www.f2er.com/c/118531.html

猜你在找的C&C++相关文章