2015-07-21 88 views
1

现在我正在学习用C并行编程使用OpenMP,现在我已经在下面的问题绊倒了。我有一个简单的for循环,我想要并行化。使用OpenMP,我想下面的代码应该做的工作并行编程使用OpenMP

unsigned long int teller_groot; 
int    boel = 0; 
int    k = 0; 
int    l = 1; 
unsigned long int sum2; 
int    thread_id; 
int    nloops; 

#pragma omp parallel private(thread_id, nloops) 
{ 
    sum2 = 0; 
    #pragma omp for 
     for (teller_groot=1000000; teller_groot<1000000000000; teller_groot++) 
     { 
      boel = 0; 
      for (int i = 0; i < 78498; i++) 
      { 
       if (floor(teller_groot/array[i]) == teller_groot/array[i])      
       { 
        boel = 1; 
        break; 
       } 
      } 

      if (boel == 0) 
      { 
       sum2 = sum2 + teller_groot; 
      } 

      if (sum2 >= 1000000000) 
      { 
       sum2 = sum2 - 1000000000; 
      } 

      if (k == 10000000) 
      { 
       printf("%d, ", l); 
       l++; 
       k = 0; 
      } 

      k++; 
     } 

     thread_id = omp_get_thread_num(); 

     printf("Thread %d performed %d iterations of the loop.\n", thread_id, nloops); 
} 

代码

​​

只是我知道我们是多么遥远的循环。如果我运行该程序,它不会打印任何内容,这意味着它不计算任何内容。那么代码有什么问题?谢谢。

+0

请修复缩进和使用空格;它看起来非常糟糕! –

+0

@意义 - 事情对不起,LP已编辑,所以我希望它现在看起来确定。 – Badshah

+0

是否执行了最后一个'printf'? – LPs

回答

1

你声明的变量k(等等)OpenMP的外for循环。当变量在并行区域外声明时,默认情况下它们具有共享作用域。这意味着所有使用将被检查和写入同一k变量,这可能会导致竞争条件的线程。

如果你想写入同一个变量k你可以使用锁或原子更新产生你想要的行为不同的线程。

否则,在并行区域开始在#pragma声明宣布k作为私有变量:

#pragma omp parallel private(thread_id, nloops, k) 

一个好的底漆可以在这里找到:http://supercomputingblog.com/openmp/tutorial-parallel-for-loops-with-openmp/

+0

我让所有的变量都是私有的(也是k),但它仍然没有做任何事情。你知道为什么吗? – Badshah

1

我没有足够的声誉评论,所以我正在写一个答案。

你的代码的一部分,正好卡住? (由到底意味着它需要非常多的时间?)

因为:

  if (floor(teller_groot/array[i]) == teller_groot/array[i])      
      { 
       boel = 1; 
       break; 
      } 

你要做的就是地板的结果(可以说使它简单)41分之22= 0.536到=> 0.5,然后检查0.536 == 0.5是否不相等,因此命令中断可能无法执行,具体取决于您尚未指定的数组中的内容。

而且,你的很多变量都共享包括阵列,这可能有所作为,以及和变量nloops没有指定的(除非某处上面的代码中,你已经证明)

检查这个pdf关于OpenMP的: http://openmp.org/mp-documents/OpenMP4.0.0.Examples.pdf

编辑: 顺便说一句,尽量的printf之后刷新缓冲区():fflush(标准输出)