使用openmp并行化内部循环

Her*_*nan 6 c++ parallel-processing loops openmp

我有三个嵌套循环但只有最里面的可并行化.外圈和中圈循环条件取决于最内圈的计算,因此我不能改变顺序.

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

有没有办法在外部循环外创建线程,但只是在最里面的循环中使用它?

提前致谢

ltj*_*jax 5

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


min*_*ang 4

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

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

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

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