2016-11-20 92 views
-1

最初AB的值是10,通過用於環路AB創造了一些延遲之後再被設置爲55,然後其在此代碼印刷..pragma和omp如何在這兩個代碼中產生相同的輸出?

#include <iostream> 
using namespace std; 
int main() 
{ 
    long j, i; 
    int ab=10 ; 

    for(i=0; i<1000000000; i++) ; 

    ab=55; 

    cout << "\n----------------\n"; 

    for(j=0; j<100; j++) 
     cout << endl << ab; 

    return 0;  
} 

此代碼的目的也是一樣的,但什麼從這段代碼中可以看出,在某些延遲之後,在第二個雜注塊應該打印10和55(多線程)之前,ab的值變爲55,但是第二個雜注塊僅在第一個for循環創建的延遲之後打印,然後打印只有55.

#include <iostream> 
#include <omp.h> 
using namespace std; 

int main() 
{ 
    long j, i; 
    int ab=10; 
    omp_set_num_threads(2); 
    #pragma omp parallel 
    { 
     #pragma omp single 
     { 
      for(i=0; i<1000000000; i++) ; 
      ab=55; 
     } 

     #pragma omp barrier 

     cout << "\n----------------\n"; 

     #pragma omp single 
     { 
      for(j=0; j<100; j++) 
      cout << endl << ab; 
     } 
    } 
    return 0; 
} 
+0

那對於循環確實會延遲程序嗎?任何體面的編譯器都會將其完全移除。並且[不要不必要地使用'endl'](http://stackoverflow.com/q/213907/995714) –

回答

0

所以你想通過改變變量的值來「觀察競態條件」在第一區域中並從第二區域打印該值。

有幾件事阻止你實現這一點。

  1. 第一個(也明確指出)是#pragma omp barrier。此OpenMP語句請求運行時,運行#pragma omp parallel的線程必須等到隊中的所有線程都到達。這首先barrier迫使兩個線程處於屏障,因此在這一點上AB將擁有價值55

  2. #pragma omp single(這裏隱含說明)包含一個隱含的``等待clause, so the team of threads running the平行region`會等到這個地區已經完成。同樣,這意味着在第一個區域結束後,ab的值將爲55。

爲了努力實現(並注意「嘗試」,因爲這將取決於從試驗運行,這取決於幾個因素[OS線程調度,OpenMP的線程調度,硬件資源可用...]) 。你可以從你給一個嘗試這種替代版本:

#include <iostream> 
#include <omp.h> 
using namespace std; 

int main() 
{ 
    long j, i; 
    int ab=10; 
    omp_set_num_threads(2); 
    #pragma omp parallel 
    { 
     #pragma omp single nowait 
     { 
      for(i=0; i<1000000000; i++) ; 
      ab=55; 
     } 

     cout << "\n----------------\n"; 

     #pragma omp single 
     { 
      for(j=0; j<100; j++) 
       cout << endl << ab; 
     } 
    } 
    return 0; 
} 

BTW,而不是在循環迭代長途旅行數,你可以使用電話,如sleep/usleep

相關問題