Openmp:在并行内部有一个MASTER构造

时间:2018-12-13 21:24:32

标签: fortran openmp

我有一个像这样的fortran代码

!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(var1, var2, var3, numberOfCalculationsPerformed)
do ix = 1,nx
  ! Do parallel work
  do iy = 1,ny
    ! Do a lot of work....
    !$OMP ATOMIC
    numberOfCalculationsPerformed = numberOfCalculationsPerformed+1
    !$OMP END ATOMIC
    !$OMP MASTER
    ! Report progress
    call progressCallBack(numberOfCalculationsPerformed/totalNCalculations)
    !$OMP END MASTER
  end do
end do

当我尝试对其进行编译时,会报告

  

错误#7102:OpenMP * MASTER指令不允许在   DO,并行DO,SECTION,PARALLEL SECTION或   单一指令。

我不明白这一点。我试图修改并行do构造

!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(var1, var2, var3, numberOfCalculationsPerformed), &
!$OMP& SCHEDULE(STATIC)

(以为它与调度有关),但是并没有改变错误。 有人知道我做错了吗?在master结构中使用parallel do还是不可能的?如果是这样,还有其他选择吗?

编辑:

!$OMP SINGLE 
!$OMP END SINGLE

而不是MASTER产生相同的结果...(错误消息)

Ps。我只需要一个线程即可执行progressCallback

1 个答案:

答案 0 :(得分:1)

这个问题有点老了,但是由于我最近偶然发现同一问题,所以我想分享一个简单的解决方案。想法是制定一个if子句,该子句仅对其中一个线程求值为TRUE。这可以通过查询当前线程号轻松实现。通过要求它为零,可以确保该子句在至少一个线程中为true:

!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(var1, var2, var3, numberOfCalculationsPerformed)
do ix = 1,nx
  ! Do parallel work
  do iy = 1,ny
    ! Do a lot of work....
    !$OMP ATOMIC
    numberOfCalculationsPerformed = numberOfCalculationsPerformed+1
    !$OMP END ATOMIC

    if (OMP_GET_THREAD_NUM() == 0) then
        ! Report progress
        call progressCallBack(numberOfCalculationsPerformed/totalNCalculations)
    end if
  end do
end do