【问题标题】:parallelize inner loop using openmp使用 openmp 并行化内部循环
【发布时间】:2011-02-05 13:04:23
【问题描述】:

我有三个嵌套循环,但只有最里面的循环是可并行的。外部和中间循环停止条件取决于最内部循环完成的计算,因此我无法更改顺序。

我在最内层循环之前使用了一个 OPENMP pragma 指令,但是两个线程的性能比一个线程差。我想这是因为每次外部循环迭代都会创建线程。

有没有办法在外循环之外创建线程,但只在最内循环中使用它?

提前致谢

【问题讨论】:

  • 请向我们展示代码,或者更好的是显示问题的简化示例。

标签: c++ loops openmp parallel-processing


【解决方案1】:

OpenMP 应该使用线程池,因此您不会在每次执行循环时都重新创建线程。然而,严格来说,这可能取决于您使用的 OpenMP 实现(我知道 GNU 编译器使用池)。建议您寻找其他常见问题,例如虚假分享。

【讨论】:

  • 感谢所有 cmets。我将再次查看我的代码。任何人都可以为多线程代码推荐一个好的免费分析器/代码分析器吗?
【解决方案2】:

不幸的是,当前的多核计算机系统不适合这种细粒度的内循环并行性。这不是因为线程创建/分叉问题。正如 Itjax 指出的那样,几乎所有 OpenMP 实现都利用线程池,即它们预先创建了许多线程,并且线程被停放。因此,实际上没有创建线程的开销。

但是,这种并行化内循环的问题在于以下两个开销:

  • 将作业/任务分派给线程:即使我们不需要物理创建线程,至少我们必须将作业(= 创建逻辑任务)分配给主要需要同步的线程。
  • 加入线程:在一个团队中的所有线程之后,应该加入这些线程(除非使用了 nowait OpenMP 指令)。这通常作为屏障操作实现,这也是非常密集的同步。

因此,应该尽量减少线程分配/加入的实际数量。您可以通过增加每次调用的内部循环的工作量来减少此类开销。这可以通过一些代码更改来完成,例如循环展开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    相关资源
    最近更新 更多