2016-07-07 113 views
0

在我的C++应用程序的开始附近,我的主线程使用OMP来并行化几个for循环。在第一个并行化的for循环之后,我看到所使用的线程在应用程序期间保持存在,并且使用命令(在CentOS 7中工作)在主线程中重复用于后续OMP循环:如何在工作线程中重用由主线程创建的OMP线程池?

for i in $(pgrep myApplication); do ps -mo pid,tid,fname,user,psr -p $i;done 

后来在我的程序中,我从主线程启动了一个boost线程,其中我使用OMP并行化了一个for循环。在这一点上,我看到创建了一组全新的线程,其开销很大。

在boost线程中是否可以使OMP并行for循环重用由主线程创建的原始OMP线程池?

编辑:一些伪代码:

myFun(data) 
{ 

    // Want to reuse OMP thread pool from main here. 
    omp parallel for 
    for(int i = 0; i < N; ++i) 
    { 
     // Work on data 
    } 

} 


main 
{ 

    // Thread pool created here. 
    omp parallel for 
    for(int i = 0; i < N; ++i) 
    { 
     // do stuff 
    } 


    boost::thread myThread(myFun) // Constructor starts thread. 

    // Do some serial stuff, no OMP. 

    myThread.join(); 


} 
+2

OpenMP与其他线程机制的交互不是规范的一部分,因此在很大程度上依赖于实现。 GNU OpenMP运行时会在TLS中保留一个指向线程池的指针并将其传播给(嵌套的)团队。通过'pthread_create'(或'boost :: thread'或'std :: thread')启动的线程不会继承指针,因此会产生一个新的池。其他OpenMP运行时可能也是如此。 –

+0

@HristoIliev谢谢,这也是我从阅读中收集到的。你是否知道这方面的解决方法?我可以修改我的应用程序以使boost :: thread实例保持活动状态以重用其OMP线程池,但我希望能够快速修复。 – user1777820

+2

我不知道任何解决方法。此外,从最终用户角度来看,OpenMP运行时应该是一个黑盒子,以保持便携性。 –

回答

1

的OpenMP的与其它线程机制的相互作用被故意留出本说明书的和因此取决于大量上的实现。 GNU OpenMP运行时会在TLS中保留一个指向线程池的指针并将其传播给(嵌套的)团队。通过pthread_create(或boost::threadstd::thread)启动的线程不会继承指针,因此会产生新的池。其他OpenMP运行时可能也是如此。

标准中有一个要求,在大多数实现中基本上会强制这种行为。它是关于线程专用的语义变量和它们的值如何对面的相同的线程分叉的不同的平行区域(OpenMP的标准,2.15.2 threadprivate Directive)保留:

在非线程专用变量的数据的值 - 初始线程保证仅当所有的以下的条件成立的两个连续有源parallel区域之间保持的:

  • 既不parallel区域嵌套在另一个明确的并行区域内。
  • 用于执行parallel区域的线程数是相同的。
  • 用于执行parallel区域的线程关联策略是相同的。
  • 在封闭任务区域中的DYN-VAR内部控制变量的值是在进入两个parallel区域

如果这些条件全部成立,并且两个区域都引用了threadprivate变量,那么在其各自区域中具有相同线程号的线程将引用该变量的同一副本。

除性能外,这可能是在OpenMP运行时中使用线程池的主要原因。

现在,设想两个分开的线程分叉的两个平行区域共享相同的工作线程池。第一个线程分叉了一个并行区域,并设置了一些threadprivate变量。后来,第二个并行区域由同一个线程分叉,在那里使用那些threadprivate变量。但是在两个平行区域之间的某处,一个并行区域由第二个线程分叉,并使用来自同一个池的工作线程。由于大多数实现保留TLS中的threadprivate变量,因此不能再声明上述语义。一个可能的解决方案是为每个单独的线程添加新的工作线程到池中,这与创建新的线程池没有多大区别。

我不知道任何解决方法,以使工作线程池共享。如果可能的话,它将不可移植,因此OpenMP的主要优点将会丢失。