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 -= expr
或 var = 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/