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.
减少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)