OMP Single用于输出子程序

时间:2016-01-17 13:58:23

标签: fortran openmp gfortran

我有一个代码来计算持续时间的动态过程,即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并在输出文件上写入。我不知道调试这个问题,请指导我解决这个问题。感谢。

1 个答案:

答案 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历史记录并不清楚。