在我的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();
}
OpenMP与其他线程机制的交互不是规范的一部分,因此在很大程度上依赖于实现。 GNU OpenMP运行时会在TLS中保留一个指向线程池的指针并将其传播给(嵌套的)团队。通过'pthread_create'(或'boost :: thread'或'std :: thread')启动的线程不会继承指针,因此会产生一个新的池。其他OpenMP运行时可能也是如此。 –
@HristoIliev谢谢,这也是我从阅读中收集到的。你是否知道这方面的解决方法?我可以修改我的应用程序以使boost :: thread实例保持活动状态以重用其OMP线程池,但我希望能够快速修复。 – user1777820
我不知道任何解决方法。此外,从最终用户角度来看,OpenMP运行时应该是一个黑盒子,以保持便携性。 –