2011-11-15 106 views
2

我正在嘗試並行化由第三方編寫的大型程序。我不能透露代碼,但我會嘗試給出我想要做的最接近的例子。 根據下面的代碼。正如你所看到的那樣,由於「並行」這個子句在while循環內部,線程的創建/銷燬是在每次迭代中完成的,這是昂貴的。 鑑於我無法將Initializors ...等移到「while」循環之外。如何讓OpenMP在每次運行程序時只創建一次線程?

--base代碼

void funcPiece0() 
{ 
    // many lines and branches of code 
} 


void funcPiece1() 
{ 
    // also many lines and branches of code 
} 

void funcCore() 
{ 
    funcInitThis(); 
    funcInitThat(); 

#pragma omp parallel 
    { 
#pragma omp sections 
     { 
#pragma omp section 
      { 
       funcPiece0(); 
      }//omp section 
#pragma omp section 
      { 
       funcPiece1(); 
      }//omp section 
     }//omp sections 
    }//omp parallel 

} 

int main() 
{ 

    funcInitThis(); 
    funcInitThat(); 
#pragma omp parallel 
    { 
    while(1) 
    { 
     funcCore(); 
    } 
    } 

} 

我尋求做是爲了避免每次迭代的創建/銷燬,並在節目的開始/結束讓它一次。我對「平行」條款的置換做了許多變化。我基本上有相同的本質是(只有一個線程創建/銷燬每個程序運行) - 我試過了,但在初始化函數中失敗了「非法訪問」。

void funcPiece0() 
{ 
    // many lines and branches of code 
} 


void funcPiece1() 
{ 
    // also many lines and branches of code 
} 

void funcCore() 
{ 
    funcInitThis(); 
    funcInitThat(); 

//#pragma omp parallel 
// { 
#pragma omp sections 
     { 
#pragma omp section 
      { 
       funcPiece0(); 
      }//omp section 
#pragma omp section 
      { 
       funcPiece1(); 
      }//omp section 
     }//omp sections 
// }//omp parallel 

} 

int main() 
{ 

    funcInitThis(); 
    funcInitThat(); 

    while(1) 
    { 
     funcCore(); 
    } 

} 

-

任何幫助,將不勝感激! 謝謝!

+0

請注意,OpenMP網站有一個論壇,您可以在其中發佈有關OpenMP的問題 - 請訪問http://openmp.org/forum/ – 2011-11-21 04:26:38

回答

2

OpenMP僅在啓動時創建工作線程。並行雜注不產生線程。你如何確定線程產生?

+0

謝謝您的回答。我的程序被絞死了,當我用調試器暫停它時,使用我的編譯器,我看到許多工作線程執行「pragma omp parallel」函數。線程「應該」產生於哪裏? – user598208

+1

線程在您的程序啓動時(或第一次需要,具體取決於實現)啓動。在其他任何地方暫停你的程序,你會發現線程還在那裏 – crazyjul

0

這可以完成!這裏的關鍵是在一個單獨的並行部分內部移動循環,並確保無論用於確定是否重複,所有線程將做出完全相同的決定。我已經使用共享變量並在檢查循環條件之前進行同步。

所以這個代碼:

initialize(); 
while (some_condition) { 
    #pragma omp parallel 
    { 
    some_parallel_work(); 
    } 
} 

可以轉化成這樣的:

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
    initialize(); //if initialization cannot be parallelized 
    } 
    while (some_condition_using_shared_variable) { 
    some_parallel_work(); 
    update_some_condition_using_shared_variable(); 
    #pragma omp flush 
    } 
} 

最重要的是要確保每一個線程進行的同時點在同一決定你的代碼。作爲一個最後的想法,本質上正在做的是將創建/銷燬線程(每當#pragma omp並行開始/結束時)的開銷交易爲線程決策制定的同步開銷。我認爲同步應該會更快,但是在這裏有很多參數可能並不總是這樣。