首页 > 解决方案 > 如何在 for 循环中使用 OMP(C 编程)

问题描述

我在下面做错了什么?代码将 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++;
    }
  }
}```

标签: cloopsfor-loopparallel-processingopenmp

解决方案


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


推荐阅读