如何让OpenMP在每次运行程序时只创建一次线程?

我正在尝试并行化由第三方编写的大型程序。 我无法透露代码,但我会尽力给出我想做的最接近的例子。 基于以下代码。 正如您所看到的,由于“并行”子句在INS循环中,因此每次迭代都会完成线程的创建/销毁,这是非常昂贵的。 鉴于我无法将Initializors …等移动到“while”循环之外。

– 基础代码

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仅在启动时创建工作线程。 parallel pragma不会产生线程。 你如何确定产生的线程?

这可以做到! 这里的关键是将循环移动到一个单独的并行部分内,并确保用于确定是否重复的所有线程,所有线程将做出完全相同的决定。 我已经使用了共享变量并在检查循环条件之前进行了同步。

所以这段代码:

 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并行开始/结束的部分)转换为用于线程决策的同步开销。 我认为同步应该更快,但是这里有许多参数,这可能并不总是如此。