【问题标题】:Is there a way to end idle threads in GNU OpenMP?有没有办法结束 GNU OpenMP 中的空闲线程?
【发布时间】:2015-02-08 21:58:18
【问题描述】:

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

【问题讨论】:

  • 你有一些代码吗?您使用哪种编程语言?
  • 为什么这很重要?这对您有何影响?
  • 这很重要,因为我最终得到了大量的空闲线程。我为系统的每个核心运行我的守护程序的副本。在当今典型的硬件上,它有 48 个内核,所以我有大约 2300 个空闲的 OpenMP 线程什么都不做。我需要 OpenMP 来加速重启,我很少完全重启所有实例。这一点也很重要,因为这些线程使 coredump 的问题分析变得复杂。
  • 弗拉基米尔,我还没有创建一个独立的测试用例,这是我正在运行的 OpenMP 代码:github.com/tarantool/tarantool/blob/master/third_party/…,后来我在 gdb 和核心转储中看到了 OpenMP 线程。
  • 如果您在 48 核系统上有 2300 个空闲 OpenMP 线程,则说明您的代码或环境存在严重问题。这不是一个合理的情况。

标签: openmp


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 嗯,不,omp_get_thread_num 告诉你当前线程数,而不是当前正在执行的线程数,也不是允许的最大线程数。
      • 我不认为它会杀死线程。线程是在线程池中创建的,因此可以在需要时再次使用它们。这减少了在并行区域之间创建和删除线程的通常显着开销。
      • 已编辑(我想说“omp_get_num_threads”,而不是“thread_num”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多