[英]parallelize inner loop using openmp
我有三个嵌套循环但只有最里面的可并行化。 外圈和中圈循环条件取决于最内圈的计算,因此我不能改变顺序。
我在最里面的循环之前使用了一个OPENMP pragma指令,但是两个线程的性能比一个线程的性能差。 我想这是因为在外循环的每次迭代中都会创建线程。
有没有办法在外部循环外创建线程,但只是在最里面的循环中使用它?
提前致谢
OpenMP 应该使用线程池,因此每次执行循环时都不会重新创建线程。 但是,严格来说,这可能取决于您正在使用的OpenMP实现(我知道GNU编译器使用池)。 我建议你寻找其他常见问题,比如虚假分享。
不幸的是,当前的多核计算机系统对于这种细粒度的内环并行性并不好。 这不是因为线程创建/分叉问题。 正如Itjax所指出的,几乎所有OpenMP实现都利用线程池,即它们预先创建了许多线程,并且线程被停放。 因此,实际上没有创建线程的开销。
但是,这种并行化内部循环的问题是以下两个开销:
因此,应该最小化线程分配/加入的实际数量。 您可以通过增加每次调用的内部循环的工作量来减少此类开销。 这可以通过一些代码更改来完成,例如循环展开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.