我的代码如下:
#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.有人可以解释为什么会发生这种情况吗?
谢谢!
答案 0 :(得分:3)
如果您将sum += (double) x[i]
替换为sum = (double) x[i]
,则不会使结果累积,因此,sum
将存储上次迭代的值。
答案 1 :(得分:0)
我想我知道这里发生了什么。我认为每个ITERATION都复制了sum
,但实际上每个THREAD都会复制sum
。我有8个线程正在运行,因此其中一个线程已经失去了初始值。解决了。谢谢你在这里的所有答案!