操作员" - "的Openmp减少

noo*_*rul 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Hri*_*iev 8

减少OpenMP的功能如下:每个线程被给予其局部减小变量和操作的拷贝诸如+=和-=影响本地副本.然后在最后执行以下减少操作:

a = init_value op a_0 op a_1 op a_2 op ... op a_(N-1)
Run Code Online (Sandbox Code Playgroud)

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

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

这意味着,reduction(-:a)您仍然可以将所有私有值相加,即两者+和-减少量相等.这是实现它的正确方法,因为假设-减少只与var -= expror var = var - expr表达式相结合.因此,您的程序不符合标准,因为您没有阅读OpenMP的复杂细节,您将得到您应得的.

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

#pragma omp parallel reduction(-:a)
{
    a -= omp_get_thread_num() + 1;
}
Run Code Online (Sandbox Code Playgroud)