关注this answer,我实际上有更复杂的代码,有三个循环:
!$omp parallel
!$omp do
do i=1,4 ! can be parallelized
...
do k=1,1000 !to be executed sequentially
...
do j=1,4 ! can be parallelized
call job(i,j)
除i=4
外,外循环快速完成。所以我想在最里面的循环上启动线程,但在每个k
迭代中依次保留i
- 循环。实际上,k
循环遍历随机数生成器的变化状态,因此无法并行化。
如何只展开i
和j
循环?我怀疑ordered
子句在这里很有用,但我担心它会再次影响内部循环,但我仍然不确定语法。
答案 0 :(得分:1)
我无法想象这是如何运作的。无论如何,collapse
语法肯定不支持。
如果您有负载平衡问题,请考虑使用动态调度,OpenMP任务或嵌套并行性重新排序循环。没有足够的代码可以说明哪些可能适用于此。
答案 1 :(得分:1)
如果1,4
是您在外部循环中使用的实际值,那么我建议仅内部循环(可以并行化),因为没有太多开销。
另一个建议是交换k
和i
循环,如果可能的话,那么外循环将在k
中循环,并且i
中的两个新内循环可以使用折叠将{1}}和j
并行化。
答案 2 :(得分:1)
针对此案例的轻量级统一方法是使用OpenMP任务
您可以将它们用于并行循环或仅用于内部循环。在第二种情况下,我们将结合for
和 task
结构。此解决方案利用嵌套并行性,但避免嵌套并行区域的含义。 taskloop
构造是一种等效且更自动化的方法。