【问题标题】:How to deal with OpenMP thread pool contention如何处理 OpenMP 线程池争用
【发布时间】:2011-05-04 14:02:29
【问题描述】:

我正在开发一个同时使用粗粒度和细粒度多线程的应用程序。也就是说,我们手动管理线程池上大型工作单元的调度,然后在这些工作单元中,某些功能利用 OpenMP 进行更细粒度的多线程。

我们通过在成本最高的循环中选择性地使用 OpenMP 实现了收益,但担心会在我们将 OpenMP 块添加到成本更低的循环中时为 OpenMP 工作池造成争用。有没有办法向 OpenMP 发出信号:如果池可用,则代码块应使用池,否则应串行处理循环?

【问题讨论】:

    标签: multithreading openmp


    【解决方案1】:

    您可以使用 omp_set_num_threads(int) 设置否。池内的线程数。然后,如果可能,编译器将尝试创建一个线程池并安排它们。如果无法创建池,那么它将创建尽可能多的线程并以串行方式运行其他线程。

    for more info try this link

    【讨论】:

    • 创建线程的是运行时,而不是编译器。如果请求的线程数多于可以创建的线程数,则取决于 OpenMP 规范中概述的许多因素。如果 ICV dyn-var(控制线程数量的动态调整)为“假”,那么它是实现定义的将发生什么。如果 dyn-var 为“真”,那么它将获得一定数量的线程并并行运行该区域。除非嵌套并行被“关闭”或不受支持,否则区域不会串行运行。
    【解决方案2】:

    您可以通过巧妙地使用parallel 指令上的omp_get_num_threadsomp_set_num_threadsifnum_threads 子句来做您想做的事。 OpenMP 3.0 还提供了tasks,这可能很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2013-02-03
      • 1970-01-01
      • 2011-11-03
      • 2015-03-23
      • 2021-08-28
      相关资源
      最近更新 更多