2011-11-15 74 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并行开始/结束时)的开销交易为线程决策制定的同步开销。我认为同步应该会更快,但是在这里有很多参数可能并不总是这样。