c++ - 运算符(operator) "-"的 Openmp 减少

标签 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 reduction 时得到了错误的输出...对于下面的代码,reduction(+) 给出了 threadnum() 总和的输出,但是当我提到 reduction (-) 时,它给出了相同的输出... “+”和“-”的输出为 3。

最佳答案

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.6 reduction 子句):

(The partial results of a subtraction reduction are added to form the final value.)

这意味着使用 reduction(-:a) 您仍然可以将所有私有(private)值加在一起,即 +- 归约是相等的。这是实现它的正确方法,因为它假设 - 减少只会与 var -= exprvar = var - expr 表达式。因此,您的程序不符合标准,而您因不了解 OpenMP 的复杂细节而得到应得的后果。

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

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

关于c++ - 运算符(operator) "-"的 Openmp 减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16564189/

相关文章:

c++ - openmp并行性能

c++ - CMake 可以使用 c++ 而不是 mpicxx 来编译我的代码吗?

c++ - 为什么将 '*' 放在返回结构指针的函数上?

c++ - 函数指针的静态初始化

c++ - C++ OpenMP 代码中的内存泄漏

c++ - 任务 : OpenMP directive name required

c++ - OpenMP 实现比串行实现慢

c++ - 如何刷新QGraphicsView以显示QGraphicsScene的背景更改

c++ - 使用指针访问数组的值

c++ - 测试如何验证特定功能是否已执行