【问题标题】:How to use OMP in for loops (C Programming)如何在 for 循环中使用 OMP(C 编程)
【发布时间】:2021-12-15 18:05:21
【问题描述】:

我在下面做错了什么?代码将 CPU 固定在 100% 并且没有结束。似乎是一个无限循环。帮助表示赞赏。

#include <stdio.h>

int main(void)
{
  
  unsigned long number2;
  unsigned long number = 1;
   
  #pragma omp parallel for  
  for (number = 1; number <= 10000; number++)
  {
    unsigned long max = 0, count = 0;    
    number2 = number;

    while (number2 != 1)
    {
      if (number2 > max)
        max = number2;
      if (number2 % 2 == 0)
        number2 /= 2;
      else
        number2 = 3 * number2 + 1;
      count++;
    }    
  }

}

更新:以下工作。

不确定根本原因是什么。本来可以

  1. 数据类型溢出其边界,即 int -> unsigned int
  2. number2 必须设为私有,等等。
#include <omp.h>

int main(int argc, char **argv)
{
  unsigned int i;
  #pragma omp parallel for
  for (i = 1; i < 10000000; i++)
  {
    unsigned int number2 = i; unsigned int max; unsigned int count = 0;
    while (number2 != 1)
    {
      if (number2 > max)
        max = number2;
      if (number2 % 2 == 0)
        number2 /= 2;
      else
        number2 = 3 * number2 + 1;
      count++;
    }
  }
}```

【问题讨论】:

  • number2 是共享的还是私有的?
  • @Shawn number2 是私人的。我已经解决了这个问题。将更新 OP。谢谢!
  • 在你的第二个版本中,max 看起来像你想要的 unsigned int max = i; 时没有初始化

标签: c loops for-loop parallel-processing openmp


【解决方案1】:

已解决。

不确定根本原因是什么。本来可以

数据类型超出其边界,即 int -> unsigned int

或 number2 必须设为私有,等等。

【讨论】:

    【解决方案2】:

    在您的代码的第一个版本中,number2 是共享的,所有线程同时访问/修改它。这是一场数据竞赛 ---> 未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2019-02-16
      • 2018-05-22
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多