gpt4 book ai didi

c++ - 减少(op :var) has the same effect as shared(var)

转载 作者:行者123 更新时间:2023-11-30 03:55:59 24 4
gpt4 key购买 nike

我已经尝试将此代码片段用于reduction(op:var) 概念验证,它工作正常并给出结果 = 656700

int i, n, chunk;
float a[100], b[100], result;
/* Some initializations */
n = 100; chunk = 10; result = 0.0;
for (i=0; i < n; i++) {
a[i] = i * 1.0;
b[i] = i * 2.0;
}
//Fork has only for loop
#pragma omp parallel for default(shared) private(i) schedule(static,chunk) reduction(+:result)
for (i=0; i < n; i++)
result = result + (a[i] * b[i]);
printf("Final result= %f\n",result);

当我尝试相同的代码但没有 reduction(+:result) 时,它给了我相同的结果 656700!我认为这是非常有意义的,因为缩减依赖于共享变量,换句话说,shared 子句就足以进行此类操作。

我很困惑!

最佳答案

Reduction 使用您可见的共享变量,但在内部使用该变量的私有(private)拷贝。当您忘记 reduction 子句时,更多线程可能会尝试同时更新 reduction 变量的值。那是一种竞争条件。由于对同一资源的竞争,结果可能是错误的,而且速度也会变慢。

通过缩减,每个线程都有一个变量的私有(private)拷贝并使用它。当缩减区域完成时,使用缩减运算符将私有(private)拷贝缩减为最终共享变量。

关于c++ - 减少(op :var) has the same effect as shared(var),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28766388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com