操作员“ - ”的Openmp减少

时间:2013-05-15 11:46:34

标签: c++ openmp

int main()
{
    int a=0;
    omp_set_num_threads(2);
    #pragma omp parallel reduction(+ : a)
    {
        a = omp_get_thread_num()+1;
    }
    std::cout << "Output:" << a;
    return 1;
}

我使用openmp减少输出错误...对于下面的代码,减少(+)给出threadnum()的总和的输出,但是当我提到减少( - )时,它给出相同的输出......我输出为“+”和“ - ”的输出为3。

2 个答案:

答案 0 :(得分:8)

OpenMP函数的减少如下:每个线程都有一个简化变量的本地副本,+=-=等操作会影响本地副本。然后在最后执行以下减少操作:

a = init_value op a_0 op a_1 op a_2 op ... op a_(N-1)

其中N是线程数,init_value是还原操作的初始化值。 +-减少操作的初始化值为0(零)。虽然在减法中有一个问题,但它在OpenMP标准中作为对最终值形成方式的注释进行了解释(§2.9.3.6reduction子句):

  

(添加减法的部分结果以形成最终值。)

这意味着,对于reduction(-:a),您仍然可以将所有私有值添加到一起,即+-减少量相等。这是实现它的正确方法,因为假设-缩减仅与var -= exprvar = var - expr表达式相结合。因此,您的程序不符合标准,并且因为没有阅读OpenMP的复杂细节而得到您应得的。

reduction(-:a)的正确示例是:

#pragma omp parallel reduction(-:a)
{
    a -= omp_get_thread_num() + 1;
}

答案 1 :(得分:0)

使用-进行缩减总是很棘手,因为减法运算符的非交换性...最好添加所有内容然后否定结果;任何阅读代码的人都可以清楚地阅读标准!