加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – OpenMP:nowait和reduce条款是相同的pragma

发布时间:2020-12-16 06:00:44 所属栏目:百科 来源:网络整理
导读:我正在学习OpenMP,并且遇到了以下示例: #pragma omp parallel shared(n,a,b,c,d,sum) private(i){ #pragma omp for nowait for (i=0; in; i++) a[i] += b[i]; #pragma omp for nowait for (i=0; in; i++) c[i] += d[i]; #pragma omp barrier #pragma omp fo
我正在学习OpenMP,并且遇到了以下示例:
#pragma omp parallel shared(n,a,b,c,d,sum) private(i)
{
    #pragma omp for nowait
    for (i=0; i<n; i++)
        a[i] += b[i];

    #pragma omp for nowait
    for (i=0; i<n; i++)
        c[i] += d[i];
    #pragma omp barrier

    #pragma omp for nowait reduction(+:sum)
    for (i=0; i<n; i++)
        sum += a[i] + c[i];
} /*-- End of parallel region --*/

在最后一个循环中,有一个现在和一个减少条款.它是否正确?缩减条款是否不需要同步化?

解决方法

第二个和最后一个循环中的现在有点多余. OpenMP规范现在在区域结束之前提到,所以也许这可以留在.

但是,在第二个循环之前的现在以及它之后的明显障碍是多余的.

特别是没有必要减少.

此外,共享和私有子句在C中是不必要的:shared是多余的,private不应该被使用.如果你需要一个线程私有变量,只需在并行区域内声明它.特别是在C中,你应该在循环中声明循环变量,而不是之前.

#pragma omp parallel
{
    #pragma omp for nowait
    for (int i = 0; i < n; ++i)
        a[i] += b[i];

    #pragma omp for
    for (int i = 0; i < n; ++i)
        c[i] += d[i];

    #pragma omp for nowait reduction(+:sum)
    for (int i = 0; i < n; ++i)
        sum += a[i] + c[i];
} // End of parallel region

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读