OpenMP:减少总和 - 如果不使用+ =则结果不正确

时间:2014-05-20 07:51:30

标签: openmp

我的代码如下:

#include <stdio.h>
#include <omp.h>

#define N       10
double x[N];
int main(void)
{
    double sum = 0.0;
#pragma omp parallel
    {
#pragma omp for
        for (int i = 0; i < N; ++ i)
            x[i] = (double) i;

#pragma omp for reduction(+:sum)
        for (int i = 0; i < N; ++ i)
        {
            sum += (double) x[i];
        }
    }

    printf("%le\n", sum);

    return 0;
}

输出为45,这是有道理的。但是,如果我用sum += (double) x[i]替换sum = (double) x[i],那么输出总是为43.有人可以解释为什么会发生这种情况吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您将sum += (double) x[i]替换为sum = (double) x[i],则不会使结果累积,因此,sum将存储上次迭代的值。

答案 1 :(得分:0)

我想我知道这里发生了什么。我认为每个ITERATION都复制了sum,但实际上每个THREAD都会复制sum。我有8个线程正在运行,因此其中一个线程已经失去了初始值。解决了。谢谢你在这里的所有答案!