2015-07-21 104 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(標準輸出)