OpenMP 线程重生

OpenMP thread respawn

我有一个 class,其中包含许多使用 OpenMP 并行化 for 循环的数学函数。每次我调用其中一个 class 函数时,都会产生一组线程,完成它们的工作并将被删除。 是否有可能避免线程破坏和重生?我可以让线程保持活动状态并将它们分配给另一个函数或其他东西吗?线程数在运行时不会改变。

OpenMP 没有定义 OpenMP 实现对工作线程的作用。 multi-threading 的实现方式完全取决于目标 OS 和 OpenMP 实现的质量。

合理的 OpenMP 实现将使用评论中提到的线程池。这意味着在为第一个并行区域生成线程后(甚至可能在调用 main() 之前发生),线程将尽可能保持活动状态。 LL VM 和 Intel 的 OpenMP 实现在并行区域结束后使线程在自旋循环中保持活动状态,以便运行时从 OS.

中节省昂贵的线程 wake-up

如果您提供有关您的目标 OpenMP 实现的更多详细信息,我可能会推荐一些更多的调整参数。

编辑: 添加了更多关于如何总体控制等待行为的信息。

OpenMP 版本 3.0 引入了环境变量 OMP_WAIT_POLICY,用于控制线程是否应在并行区域结束后进入 spin-wait。如果该变量设置为 active,线程自旋等待并因此消耗 CPU 个周期。设置为 passive 线程不会旋转,但会等待 OS 信号、让出处理器等以唤醒下一个并行区域。该变量还会影响等待锁和屏障完成。

OpenMP 5.0 版定义了 omp_pause_resource()omp_pause_resource_all() API 例程。这个想法是 "shutdown" 足够的 OpenMP,这样 OpenMP 实现就不会从其他并行库或语言生成的线程中夺走资源。一个示例性应用是,在 OpenMP 并行区域结束后,可以关闭 OpenMP,并且具有 C++ 线程的新并行区域可以消耗所有机器。 omp_pause_resource() 例程在特定设备上停止 OpenMP,而 omp_pause_resource_all() 在所有设备上停止 OpenMP。这些调用定义了两个级别:omp_pause_soft 在 OpenMP 稍后恢复执行时保留 OpenMP 状态,omp_pause_hard 在恢复 OpenMP 时必须从头开始重新初始化 OpenMP 实现。