Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 用于输出子例程的OMP Single_Fortran_Openmp_Gfortran - Fatal编程技术网

Fortran 用于输出子例程的OMP Single

Fortran 用于输出子例程的OMP Single,fortran,openmp,gfortran,Fortran,Openmp,Gfortran,我有一个代码来计算一个持续时间内的动态过程,即,it=1,itlast,在这个持续时间内,我想在每个itsprint间隔内打印某些结果。代码如下: !$OMP PARALLEL DEFAULT (none) SHARED(w) & !$OMP& SHARED(itlast) & !$OMP& SHARED(itprint, itsprint) & !$OMP& PRIVATE(i,

我有一个代码来计算一个持续时间内的动态过程,即,
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
并且
子例程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
语句并进入
子例程timser
进行输出打印。这段代码在使用

  • gfortran(GNU Fortran(Ubuntu 4.8.4.-2ubuntu1~14.04)4.8.4)
    gfortran mycode.f90-fopenmp-fbounds check-o mycode.out
  • ifort(英特尔编译器16.0更新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
,所有线程都可以进入
子例程timser
,并在输出文件上写入。我不知道如何调试这个问题,请指导我解决这个问题。谢谢。

类似OpenMP 2.5的LOK从4.2版开始在gcc/gfortran中受支持,根据。也许OpenMP在gcc/gfortan 4.1.x中的支持不是很好


gomp历史记录不清楚4.2()之前的OpenMP状态。

Hi,请使用标签。如果问题仅与特定版本有关(不在此处),或者您想询问版本之间的差异,则可以添加特定版本。可能需要更多信息。显示编译器版本、如何编译、如何运行以及一个简短的完整程序,该程序将复制行为()和该程序的输出。@VladimirF感谢您的评论,我将立即更新问题。gfortran 4.1非常旧(2008!),是最早发布的版本之一,不要计划将其用于严肃的工作。谢谢您的评论。我只有ssh用户可以访问集群Rocks 5.4.3(Viper),因此我无法安装任何东西。我在互联网上做了一些挖掘,似乎有一种方法可以在我的用户文件夹中安装最新的gfortran。但是,不同的人说了不同的事情却没有解释清楚。我不敢破坏集群,有没有合适的方法?(我不确定在这里问这个问题是否合适,或者我应该在其他论坛上问。)是的,很可能您可以安装自己的gcc/gfortran/。。。主目录中的编译器。也许最烦人的事情(除了编译器及其依赖项的安装)是,每当您想要运行使用此编译器生成的二进制文件时,您都需要设置LD_LIBRARY_路径。