首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在openmp中reduction的用法是什么?

在openmp中reduction的用法是什么?
EN

Stack Overflow用户
提问于 2013-05-14 06:32:18
回答 2查看 3.5K关注 0票数 2

我有一段并行化的代码。

代码语言:javascript
复制
int i,n; double area,pi,x;
area=0.0;
#pragma omp parallel for private(x) reduction (+:area)
for(i=0; i<n; i++){
x= (i+0.5)/n;
area+= 4.0/(1.0+x*x);
}
pi = area/n;

据说,如果我们不使用缩减,那么缩减将消除可能发生的竞态条件。我仍然在想,我们是否需要添加lastprivate for area,因为它在并行循环之外使用,并且在它之外是不可见的。否则,削减也涵盖了这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2013-05-14 06:38:48

Reduction负责为每个线程制作area的私有副本。一旦平行区结束,面积就会在一次原子操作中减小。换句话说,公开的area是每个线程的所有私有area的集合。

代码语言:javascript
复制
thread 1 - private area = compute(x)
thread 2 - private area = compute(y)
thread 3 - private area = compute(z)

reduction step - public area = area<thread1> + area<thread2> + area<thread3> ...
票数 2
EN

Stack Overflow用户

发布于 2013-05-14 21:32:19

你不需要lastprivate。为了帮助您理解缩减是如何完成的,我认为看看如何使用atomic来完成这一点是很有用的。下面的代码

代码语言:javascript
复制
float sum = 0.0f;
pragma omp parallel for reduction (+:sum)
for(int i=0; i<N; i++) {
    sum += //
}

等同于

代码语言:javascript
复制
float sum = 0.0f;
#pragma omp parallel
{
    float sum_private = 0.0f;
    #pragma omp for nowait
    for(int i=0; i<N; i++) {
        sum_private += //
    }
    #pragma omp atomic
    sum += sum_private;
}

虽然这个替代方案有更多的代码,但它有助于展示如何使用更复杂的运算符。使用reduction时的一个限制是atomic只支持几个基本运算符。如果您想使用更复杂的运算符(例如SSE/AVX加法),则可以使用critical reduction with OpenMP with SSE/AVX替换atomic

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16532229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档