我有一个代码来计算持续时间的动态过程,即it = 1, itlast
,并且在此持续时间内,我想在每itsprint
个时间间隔内打印一定的结果。以下是代码:
!$OMP PARALLEL DEFAULT (none) SHARED(w) &
!$OMP& SHARED(itlast) &
!$OMP& SHARED(itprint, itsprint) &
!$OMP& PRIVATE(i, j, it) &
!$OMP& PRIVATE(ntprint, mtprint)
do it = 1, itlast
!..... ALL COMPUTATIONS .....!
!$OMP SINGLE
mtprint = it/itsprint
if (itsprint*mtprint .ne. it) goto 20
call timser(it)
20 continue
!$OMP END SINGLE
end do
!$OMP PARALLEL END
subroutine timser
显示如下。
subroutine timser(it)
use tuna_params
implicit none
integer :: it, k
real :: time_s, hour
time_s = it*delt
hour = time_s/3600.0
write(16,89) hour, (w(nxwtser(k),nywtser(k),2), k = 1, ntser, 1)
89 format(f10.4, 999f10.4)
end subroutine timser
这样做,我允许所有线程处理计算。对于每个it
,在计算结束时,只有一个线程将检查if
语句并进入subroutine timser
进行输出打印。使用
gfortran (GNU Fortran (Ubuntu 4.8.4.-2ubuntu1~14.04) 4.8.4)
:gfortran mycode.f90 -fopenmp -fbounds-check -o mycode.out
ifort (Intel Compiler 16.0 Update 1)
:ifort mycode.f90 -openmp -CB -o mycode.exe
但是,如果我使用gfortran (GNU Fortran (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50))
:gfortran mycode.f90 -fopenmp -fbounds-check -o mycode.out
在集群中编译和运行此代码,则所有线程都可以进入subroutine timser
并在输出文件上写入。我不知道调试这个问题,请指导我解决这个问题。感谢。
答案 0 :(得分:3)
根据http://openmp.org/wp/openmp-compilers,自4.2版以来,gcc / gfortran支持类似OpenMP 2.5的Loks。也许OpenMP支持在gcc / gfortan 4.1.x中没那么好。
关于4.2(https://gcc.gnu.org/projects/gomp)之前的OpenMP状态,gomp历史记录并不清楚。