【发布时间】:2016-06-11 01:33:50
【问题描述】:
我正在尝试对在同一代码中初始化的数组的所有元素求和。由于每个元素都是相互独立的,因此我尝试并行执行求和。我的代码如下所示:
int main(int argc, char** argv)
{
cout.precision(20);
double sumre=0.,Mre[11];
int n=11;
for(int i=0; i<n; i++)
Mre[i]=2.*exp(-10*M_PI*i/(1.*n));
#pragma omp parallel for reduction(+:sumre)
for(int i=0; i<n; i++)
{
sumre+=Mre[i];
}
cout<<sumre<<"\n";
}
我编译和运行的:
g++ -O3 -o sum sumparallel.cpp -fopenmp
./sum
分别。我的问题是每次运行时输出都不同。有时它给了
2.1220129388411006488
或
2.1220129388411002047 有谁知道这里发生了什么?
【问题讨论】:
-
double只有 15–17 位有效十进制数字精度。 -
我主要担心的是我对获得良好的精度非常感兴趣,所以我不知道如何使用 OpenMP 来管理它。
-
在几个 SO Q 和 As 中也相关并涵盖了 f-p 算术的非结合性和并行 f-p 算术的非确定性。我自己对知识总和的贡献之一——stackoverflow.com/questions/32074644/…——还有其他人。
标签: openmp