我正在嘗試並行化由第三方編寫的大型程序。我不能透露代碼,但我會嘗試給出我想要做的最接近的例子。 根據下面的代碼。正如你所看到的那樣,由於「並行」這個子句在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();
}
}
-
任何幫助,將不勝感激! 謝謝!
請注意,OpenMP網站有一個論壇,您可以在其中發佈有關OpenMP的問題 - 請訪問http://openmp.org/forum/ – 2011-11-21 04:26:38