有没有办法在GNU OpenMP中结束空闲线程?

时间:2015-02-08 21:58:18

标签: openmp

我在程序开始时使用OpenMP进行并行排序。加载和排序数据后,程序将作为守护程序运行,并且不再使用OpenMP。有没有办法关闭OpenMP创建的空闲线程? omp_set_num_threads()不会影响已为任务创建的空闲线程。

3 个答案:

答案 0 :(得分:1)

我不相信有一种方法可以触发线程的破坏。现代OpenMP实现倾向于在池中保留线程以加速启动未来的并行部分。

在您的情况下,我建议使用两个程序解决方案(一个与排序并行,一个串行用于守护程序)。如何在它们之间传递数据取决于您。您可以做一些简单的事情,比如将其写入文件然后再次阅读。这听起来可能不像听起来那么慢,因为现代的Linux发行版可能会将该文件保存在文件缓存中的内存中。

如果你真的想确保它留在内存中,你可以同时启动这两个进程并允许它们共享内存并允许第一个并行排序过程在完成后退出。

答案 1 :(得分:0)

理论上,OpenMP在“pragma”子句的末尾有一个隐式同步。因此,当OpenMP并行工作结束时,所有线程都将被删除。你不需要杀死它们或释放它们:OpenMP会自动执行此操作。

也许“omp_get_num_threads()”告诉你程序的实际配置,而不是活动线程的数量。我的意思是:如果你将线程数设置为4,omp会告诉你配置是“4个线程”,但这并不意味着实际上有4个线程正在进行中。

答案 2 :(得分:0)

请查看OMP_WAIT_POLICY,这是OpenMP 4中的新功能[https://gcc.gnu.org/onlinedocs/libgomp/OMP_005fWAIT_005fPOLICY.html]

如果您的OpenMP实施不够新,那么有非便携式替代方案,例如GOMP_SPINCOUNT。我记得在OpenMP规范的讨论中,至少英特尔,IBM,Cray和Oracle已经支持他们自己实现这个功能了。