我有三个嵌套循环。我想像这样并行化中间循环:
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
循环。任何帮助表示赞赏。
答案 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很长一段时间,重新分配线程的代价并不高...