使用OpenMP在并行区域内进行顺序循环

时间:2018-09-01 06:12:53

标签: parallel-processing fortran openmp intel-fortran

我有三个嵌套循环。我想像这样并行化中间循环:

  do a = 1,amax
    !$omp parallel do private(c)
    do b = 1,bmax
      do c = 1,cmax
        call mysubroutine(b,c)
      end do
    end do
    !$omp end parallel do
  end do

但这会带来一个问题,即对于a循环的每次迭代,都会生成线程,依次遍历内部循环,然后终止。我认为这会导致过多的开销,因为内部循环执行所需的时间并不长(〜10^-4 s)。所以我只想产生一次线程。如何在启动a循环的同时在 之前生成线程,同时仍按顺序执行a循环?由于代码的性质,a循环的每个迭代必须先完成,然后才能执行下一个。例如,显然这是行不通的:

  !$omp parallel private(c)
  do a = 1,amax
    !$omp do 
    do b = 1,bmax
      do c = 1,cmax
        call mysubroutine(b,c)
      end do
    end do
    !$omp end do
  end do
  !$omp end parallel

因为所有线程都将尝试执行a循环。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

“例如,显然这不起作用”

那不仅不清楚,那是完全不正确的。您显示的代码正是您应该做的(最好使用<form class="form-horizontal" method="POST" action="{{ route('member.add-single-trade.import-excel.import_fields') }}" enctype="multipart/form-data"> )。

“因为所有线程都会尝试执行循环”

他们当然会而且必须这样做!如果他们都应该参与private(a)内部循环中的工作共享,那么所有人都必须执行它!如果他们不执行它,他们将根本不会在那里帮助进行内循环。

另一句话:omp do嵌套循环的collapse(2)子句可能会受益。

答案 1 :(得分:0)

断言“这导致过多的开销”的一种好方法是使用不同数量的线程来评估扩展。

1s很长一段时间,重新分配线程的代价并不高...