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实现get_walltime_Time_Fortran - Fatal编程技术网

用Fortran实现get_walltime

用Fortran实现get_walltime,time,fortran,Time,Fortran,我正在根据书中的第一个练习(第34页)编写一个Fortran程序。本书旨在介绍高性能计算。第一个练习要求用户编写代码来估计pi。根据作者提供的内容,我已经成功地完成了这项工作 program compute_pi double precision :: x, delta_x, sum !double precision :: S,E,MFLOPS integer, parameter :: SLICES=10000000 sum = 0.d0 ; delta_x =

我正在根据书中的第一个练习(第34页)编写一个Fortran程序。本书旨在介绍高性能计算。第一个练习要求用户编写代码来估计pi。根据作者提供的内容,我已经成功地完成了这项工作

program compute_pi
   double precision :: x, delta_x, sum
   !double precision :: S,E,MFLOPS
    integer, parameter :: SLICES=10000000
    sum = 0.d0 ; delta_x = 1.d0/SLICES
    !call get_walltime(S)
    do i=0,SLICES-1
        x = (i+0.5)*delta_x
        sum = sum + 4.d0 / (1.d0 + x*x)
    enddo
    pi = sum*delta_x 
    print *, pi
    !call get_walltime(E)
    !MFLOPS = R*N*2.d0/((E-S)*1.d6)
end program compute_pi
接下来,我尝试以MFlops/sec为单位计算性能。为了做到这一点,我按照作者在第5页的例子写了

program compute_pi
   double precision :: x, delta_x, sum
   double precision :: S,E,MFLOPS
    integer, parameter :: SLICES=10000000
    sum = 0.d0 ; delta_x = 1.d0/SLICES
    call get_walltime(S)
    do i=0,SLICES-1
        x = (i+0.5)*delta_x
        sum = sum + 4.d0 / (1.d0 + x*x)
    enddo
    pi = sum*delta_x 
    print *, pi
    call get_walltime(E)
    MFLOPS = R*N*2.d0/((E-S)*1.d6)
end program compute_pi
当我在Netbeans(我用于Fortran的IDE)中运行上述代码时,它返回

undefined reference to `get_walltime_'

我不确定为什么引用没有定义。

这里是get_walltime的纯Fortran实现(仅经过编译测试):


更好的是,把它放进一个模块中,免费进行接口检查。或者甚至比这更好,直接调用系统时钟。

该练习中的
get\u wallcock()
是对C代码的调用,该C代码使用
gettimeofday()
中计算出墙上的时钟时间。翻到同一本书的第6页,查看如何实现该功能的示例。然后,使用
-C
标志编译C代码以获取目标文件,例如get_wallclock.o。然后将主Fortran程序链接到目标文件。通过这种方式,链接器可以解析
get_walltime()

您认为子例程
get_walltime
是在哪里定义的,以及您如何告诉链接器有关它的信息?无论这本书是什么,它都未能教会您一个重要的、非常基本的教训-在Fortran程序中始终包含行
implicit none
。对于示例,请将该行紧跟在
程序
行之后。缺少
implicit none
不是您报告的错误的原因,但它是您尚未发现的细微语义错误的原因。如果你没有注意到我可怕的警告,这将是你将来遇到许多错误的原因。我可能不得不为
get_walltime
创建我自己的方法,类似于
void get_walltime(double*wcTime){struct timeval tp;gettimeofday(&tp,NULL);*wcTime=(double)(tp.tv\u sec+tp.tv\u usec/1000000.0)}
如果我没记错的话(我读那本书已经有一段时间了),Hager和Wellein用C实现了
get_walltime
。源代码应该在书中。啊,刚刚找到它-这是你上面给出的片段。请给出正确的属性。我看不出有任何理由不使用
system\u clock()
。可能这本书太旧了。如果您真的愿意,您可以使用
system\u clock
在内部编写
get\u walltime
。请注意,在Windows上,system\u clock的精度非常低(至少在英特尔fortran上是如此)。一个可靠的替代方法是使用OPENMP编译并使用!$OMP_GET_WTIME()。[或者如果使用MPI链接,请使用MPI_WTime()]。这不会提供问题的答案。一旦你有足够的声誉,你将能够评论任何帖子;相反,提供不需要提问者澄清的答案。我没有尝试评论任何帖子,我只是写了一个答案,我认为它确实回答了这个问题。Axion004询问编译器为什么返回“undefined reference”错误,我的答案只是因为get_walltime()函数尚未实现。但我同意,在我之前的帖子中,这并不是100%清楚。
subroutine get_walltime(wctime)
  use iso_fortran_env, only: int64
  implicit none
  integer, parameter :: dp = kind(1.0d0)
  real(dp) :: wctime
  integer(int64) :: r, c
  call system_clock(c, r)
  wctime = real(c, dp) / r
end subroutine get_walltime