是否有可能“交叉崩溃”并行循环?

时间:2016-08-18 14:25:21

标签: multithreading fortran openmp

关注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循环遍历随机数生成器的变化状态,因此无法并行化。

如何只展开ij循环?我怀疑ordered子句在这里很有用,但我担心它会再次影响内部循环,但我仍然不确定语法。

3 个答案:

答案 0 :(得分:1)

我无法想象这是如何运作的。无论如何,collapse语法肯定不支持。

如果您有负载平衡问题,请考虑使用动态调度,OpenMP任务或嵌套并行性重新排序循环。没有足够的代码可以说明哪些可能适用于此。

答案 1 :(得分:1)

如果1,4是您在外部循环中使用的实际值,那么我建议仅内部循环(可以并行化),因为没有太多开销。

另一个建议是交换ki循环,如果可能的话,那么外循环将在k中循环,并且i中的两个新内循环可以使用折叠将{1}}和j并行化。

答案 2 :(得分:1)

针对此案例的轻量级统一方法是使用OpenMP任务 您可以将它们用于并行循环或仅用于内部循环。在第二种情况下,我们将结合for task结构。此解决方案利用嵌套并行性,但避免嵌套并行区域的含义。 taskloop构造是一种等效且更自动化的方法。