OpenMP线程重生

时间:2019-05-10 19:34:14

标签: parallel-processing openmp

我有一个带有许多数学函数的类,这些函数使用OpenMP来使循环并行化。每次我调用这些类函数之一时,都会产生一组线程,执行它们的工作并将其删除。 有可能避免线程破坏和重生吗?我可以保持线程活动并将其分配给其他功能或其他功能吗?在运行时,线程数不会更改。

1 个答案:

答案 0 :(得分:3)

OpenMP并未定义OpenMP实现对工作线程的作用。完全实现多线程的方式取决于目标操作系统和OpenMP实现的质量。

合理的OpenMP实现将使用注释中提到的线程池。这意味着在为第一个并行区域生成线程之后(甚至可能在调用main()之前发生),线程将尽可能多地保持活动状态。 LL VM和Intel的OpenMP实现在并行区域结束后使线程在旋转循环中处于活动状态,从而使运行时节省了从操作系统中唤醒线程的费用。

如果您提供有关目标OpenMP实施的更多详细信息,我也许可以推荐更多的调整参数。

编辑::添加了更多有关如何一般控制等待行为的信息。

OpenMP版本3.0引入了环境变量OMP_WAIT_POLICY,该变量控制线程在并行区域结束之后是否应进入旋转等待。如果变量设置为active,则线程旋转等待,从而消耗CPU周期。设置为passive时,线程不会旋转,而是等待OS信号,产生处理器等,以唤醒下一个并行区域。该变量还会影响等待锁定和屏障完成的时间。

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