OpenMP:减少和共享

时间:2016-11-11 05:38:35

标签: c++ openmp

我有以下代码,导致错误的输出。

#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。令我困惑的是如何在线程之间传递signpipiold?它们无法共享,因为备用迭代需要不同的值。因此,一种方法是将迭代分为奇数和偶数,但这似乎非常低效。

在这种情况下有任何建议吗?

1 个答案:

答案 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,所以我无法测试并提供示例代码。但我建议两个案例:

  • 使用openmp部分将公式的(+)和( - )分成2个线程,使用奇数/偶数。你将有两个部分

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;
  • 使用pi的减少条款