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。
答案 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 -= expr
或var = var - expr
表达式相结合。因此,您的程序不符合标准,并且因为没有阅读OpenMP的复杂细节而得到您应得的。
reduction(-:a)
的正确示例是:
#pragma omp parallel reduction(-:a)
{
a -= omp_get_thread_num() + 1;
}
答案 1 :(得分:0)
使用-
进行缩减总是很棘手,因为减法运算符的非交换性...最好添加所有内容然后否定结果;任何阅读代码的人都可以清楚地阅读标准!