微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 ) ....
     ...
  }

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐