我有以下代码,导致错误的输出。
#pragma omp parallel private(i,piold) shared(pi,sign)
{
#pragma omp for reduction(+:pi) schedule (static)
for (i = 0; i < 100000; i++){
piold = pi;
pi += sign/(2*i+1);
sign=-sign;
}
}
pi = 4*pi;
我有点迷失,因为我不熟悉OpenMP。令我困惑的是如何在线程之间传递sign
,pi
和piold
?它们无法共享,因为备用迭代需要不同的值。因此,一种方法是将迭代分为奇数和偶数,但这似乎非常低效。
在这种情况下有任何建议吗?
答案 0 :(得分:2)
看起来您尝试使用Leiniz formula来近似pi。
C ++支持在范围内声明迭代,因此从私有中删除i。
for(unsigned int i = 0; i&lt; 10000; i ++)
可以根据i的奇数/偶数属性知道符号,因此请使用(i&amp; 1)检查并从私人中删除符号
int sign = 1 - (i & 1);
pi += (sign == 1 ? 1f : -1f) / (2 * i + 1);
piold不影响最终结果pi,从私人
您可以阅读http://bisqwit.iki.fi/story/howto/openmp/了解更多信息。由于我现在没有编译器支持OpenMP,所以我无法测试并提供示例代码。但我建议两个案例:
double plus = 0.0;
for (int i = 0; i < 5000; i++)
plus += (4 * i + 1);
和
double minus = 0.0;
for (int i = 0; i < 5000; i++)
minus += (4 * i + 3);
然后
pi = plus - minus;