【问题标题】:How does OpenMP reuse threadsOpenMP 如何重用线程
【发布时间】:2015-12-10 21:10:27
【问题描述】:

我认为创建和删除线程可能代价高昂。 OpenMP 是否尝试重用现有线程?例如,

#pragma omp parallel sections num_threads(4)
   {
    #pragma omp section
    { ... worker A ... }
    #pragma omp section
    { ... worker B ... }
   }
   #pragma omp parallel sections num_threads(4)
   {
    #pragma omp section
    { ... worker C ... }
   #pragma omp section
   { ... worker D ... }
  }

在执行中,OpenMP 是分配 5 个线程还是 3 个(其中 C 和 D 重用 A 和 B 使用的线程)?

【问题讨论】:

标签: c multithreading parallel-processing openmp


【解决方案1】:

在您的示例中,将在您的第一个并行部分进入时创建/激活一个由 4 个“工作”线程组成的团队,其中 2 个将做一些工作:一个做 A,另一个做 B。另外 2 个将在本节结束时等待空闲。然后在退出该部分时销毁/停用 4 个线程。然后在进入第二个并行部分时创建/激活一个新的 4 个线程团队,同样的情况也会发生......现在我说创建/激活是因为正如您所猜测的那样,创建线程的成本很高,标准允许编译器创建线程一次,并且仅在需要时才使线程在并行部分之间休眠。但这是一个对程序员来说应该是透明的实现细节。

归根结底,没有办法知道哪个线程将处理 A、B、C 和 D...您只能确定 A 和 B 将由 2 个不同的线程处理,而 C 和D 也由两个不同的线程。

【讨论】:

  • 我还阅读了 stackoverflow.com/questions/9076472/gcc-openmp-thread-reuse,如果我们静态地知道要重用的线程总数,我们可以在顶层预先分配它们。这种方法的问题是程序总是有这么多线程处于活动状态,尽管有时它只需要一个线程。
  • 此链接 software.intel.com/en-us/articles/… 声称大多数 OpenMP impl 执行线程池。
  • GCC5 的 OpenMP 实现不会在这种简单的情况下拆除并重新创建线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多