【发布时间】:2013-12-12 09:48:11
【问题描述】:
我有一个伪代码是这样的:
Do while loop
if condition
call subroutinex(In)
else
do i=2,max
ln=i
call subroutinex(ln)
end do
endif
other serial work
end do
我已经成功地像这样并行化了内部循环
Do while loop
if condition
call subroutinex(In)
else
!$OMP PARALLEL DEFAULT (SHARED) PRIVATE (pr.variables)
!$OMP DO
do i=2,max
ln=i
call subroutinex(ln)
end do
!$OMP END DO
!$OMP END PARALLEL
endif
other serial work
end do
这段代码对我来说很好,可以产生正确的结果,并且运行时间大约是优化的自动并行化 NO-OMP 版本的一半(对于 max=5)。我怀疑(虽然不太确定)在“Do while 循环”中生成并行区域可能会导致一些不必要的开销,我可以避免使用不同的方法(在外部循环之外生成并行区域并使用 !$OMP CRITICAL 或 !$OMP MASTER)。不过,我似乎无法理解正确的语法是怎样的。非常欢迎任何建议。
最好的问候, 使徒
【问题讨论】:
标签: loops parallel-processing openmp