Parallel processing 不使用$OMP DO的OpenMP并行循环
我在看一个使用FORTRAN版本OPENMP的程序。在那里我遇到了一个相当奇怪的构造。为了使“do”循环并行,使用了以下构造Parallel processing 不使用$OMP DO的OpenMP并行循环,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,我在看一个使用FORTRAN版本OPENMP的程序。在那里我遇到了一个相当奇怪的构造。为了使“do”循环并行,使用了以下构造 count = 0 !$OMP PARALLEL do if (count > N ) exit !$OMP CRITICAL count = count + 1 !$OMP END CRITICAL call WORK ! do some work here
count = 0
!$OMP PARALLEL
do
if (count > N ) exit
!$OMP CRITICAL
count = count + 1
!$OMP END CRITICAL
call WORK ! do some work here
end do
!$OMP END PARALLEL
我不确定上面的代码是否真的使do循环并行。我知道这样做的标准方法是使用以下工作共享结构
!$OMP PARALLEL
!$OMP DO
do count = 1,N
call WORK ! do some work here
end do
!$OMP ENDDO
!$OMP END PARALLEL
通过实现标准的工作共享结构,我已经测试了这两种可能性,并且在使用它时观察到了一些加速。我可以想象,$OMP CRITICAL
结构可能会成为一个瓶颈,导致一些速度减慢。我认为,如果线程以不同的速度执行,那么使用非标准的工作共享方法可能是有益的。然而,我并不确定我的想法有多准确
先谢谢你
Alex如果
$如果不使用omp do
,则每个线程都会执行与其他线程相同的操作。omp do
指令用于在线程之间划分循环的索引空间。这些线程不做相同的工作,而是运行编号循环的不同迭代。在您的情况下,这里没有索引,因此没有要划分的内容,所有线程都将运行相同的代码
对于仅更新计数,可以使用omp原子,但如果工作
需要足够长的时间来计算,则可以忽略不计。我担心在原始代码的条件下读取计数也有问题
count = 0
!$OMP PARALLEL
do
!$OMP ATOMIC READ
count2 = count
if (count2 > N ) exit
!$OMP ATOMIC UPDATE
count = count + 1
call WORK ! do some work here
end do
!$OMP END PARALLEL
这里的意图是调用
WORK
N次,并并行执行单个调用。可能有更优雅的方法来实现这一点。您的想法是正确的,原始代码的作用相当于:
!$OMP PARALLEL DO SCHEDULE(DYNAMIC)
do count = 0,N
call WORK ! do some work here
end do
!$OMP END PARALLEL DO
基本上,它以一种非常笨拙和低效的方式实现动态循环调度。如果
呼叫工作
花费的时间总是相同的,即不存在导致工作不平衡的条件,则计划(动态)
子句可以替换为计划(静态)
以提高性能。感谢您的回复。很高兴我谦逊的假设得到证实。我怀疑这是软肥皂。嗨,谢谢你的回复。事实证明,我最初的假设确实是正确的。