2015-02-08 91 views
1

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

+0

你有一些代码吗?你使用哪种编程语言? – 2015-02-08 22:58:17

+0

为什么这很重要?这如何影响你? – 2015-02-09 07:38:30

+0

这很重要,因为我最终得到了大量的空闲线程。我为系统的每个核心运行我的守护程序的副本。在典型的现代硬件中,它是48个内核,所以我有2300个空闲的OpenMP线程无所事事。我需要OpenMP来加速重启,我很少重新启动所有的实例。这一点也很重要,因为这些线程使用coredumps进行问题分析变得复杂。 – Kostja 2015-02-09 15:35:46

回答

0

理论上,OpenMP在“编译指示”子句的最后有一个隐含的同步。因此,当OpenMP并行工作结束时,所有线程都将被删除。你不需要杀死它们或释放它们:OpenMP自动执行它。

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

+0

Uhm,no,'omp_get_thread_num'告诉你当前的线程号,而不是当前正在执行的线程的数量,也不是允许的最大线程数。 – Mehrdad 2015-02-09 04:17:28

+2

我不认为它杀死了线程。线程在线程池中创建,以便在需要时再次使用。这减少了在并行区域之间创建和删除线程的常常很大的开销。 – 2015-02-09 07:37:44

+0

已编辑(我想说“omp_get_num_threads”,而不是“thread_num” – 2015-02-09 21:52:46

1

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

在你的情况下,我会推荐一个两个程序解决方案(一个并行排序和一个守护进程序列)。您如何在它们之间传递数据取决于您。你可以做一些简单的事情,比如把它写到一个文件然后再读一遍。这可能不像听起来那么慢,因为现代Linux发行版可能会将该文件保留在文件缓存中的内存中。

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

相关问题