我有一个像这样的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
。
答案 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