【发布时间】:2016-07-07 20:39:34
【问题描述】:
在我的 c++ 应用程序开始时,我的主线程使用 OMP 并行化多个 for 循环。在第一个并行化 for 循环之后,我看到使用的线程在应用程序期间仍然存在,并被重用于后续 OMP 循环,使用命令(在 CentOS 7 中工作)从主线程执行:
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 线程池,但我希望能快速修复。
-
我不知道有任何解决方法。此外,从最终用户的角度来看,OpenMP 运行时应该是一个黑匣子,以使范例保持可移植性。
-
@HristoIliev 这很公平。我不明白他们为什么不让 OMP 线程池成为全球性的,但我相信他们有他们的理由。感谢您确认没有解决方法或我错过了什么。随意将您的 cmets 复制粘贴到回复中,我会接受它们作为答案。
-
我添加了一个答案,希望能回答您的问题。
标签: c++ multithreading boost openmp