我是否正确使用Fortran的system_clock函数?

3

我正在使用Fortran90(使用gfortran编译)中的system_clock函数,用如下方式:

   ! Variables for clock
   integer count_0, count_1
   integer count_rate, count_max
   double precision time_init, time_final, elapsed_time

   ! Starting time
   call system_clock(count_0, count_rate, count_max)
   time_init = count_0*1.0/count_rate

   .... Main code

   ! Ending time
   call system_clock(count_1, count_rate, count_max)
   time_final = count_1*1.0/count_rate
   ! Elapsed time
   elapsed_time = time_final - time_init

   ! Write elapsed time
   write(*,1003) int(elapsed_time),elapsed_time-int(elapsed_time)

1003 format('  Wall Clock = ',i0,f0.9)

请问我是否正确使用了这个函数。实际上,我没有为count_ratecount_max指定一个值,但我猜想它们有默认值。此外,似乎我必须考虑count_0count_1超过count_max的情况,对吗?正如您所看到的,为了美化格式,我已经将流逝时间的秒数和小数部分拆分开来。


请在所有Fortran问题中使用标签[tag:fortran]。您遇到了任何问题吗?是否有错误信息?结果是错误的还是正确的? - Vladimir F Героям слава
count_0count_1永远不会大于count_max - francescalus
有关SYSTEM_CLOCK的GFortran特定信息,请参见https://gcc.gnu.org/onlinedocs/gfortran/SYSTEM_005fCLOCK.html。 - janneb
1
还要注意,SYSTEM_CLOCK的所有参数都是INTENT(OUT)。这意味着该内置函数永远不会从参数中读取任何内容,只会覆盖之前存在的内容。 - janneb
1个回答

3

从代码本身看起来是正确的。但是没有看到输出结果很难确定代码的正确性。

我建议使用更大的整数(integer(int64))。在Fortran 90中,int64是在模块iso_fortran_env中定义的,你可以使用selected_int_kind。它是与编译器相关的,但是使用更大的整数通常会得到更高的count_max和更精细的count_rate。至少对于像gfortran和Intel这样的常见编译器是这样的。

我认为你无法有用地监视count并将其与count_max进行比较。当我使用如上所示的更大整数时,我从未有过这种需求。我可以想象一些方法(例如与count_max/2进行比较),但这将是笨拙的。无论如何,你都无法重新启动计数器。

你可以编写一个小程序,用于打印最大次数。

use iso_fortran_env, only: int32, int64, real64

integer(int32) :: count_max, count_rate

call system_clock(count_max=count_max, count_rate=count_rate)

write(*,*) "Maximum time:", real(count_max, real64) / count_rate

end

尝试使用整数(int32)整数(int64)整数,并观察这些选项在编译器中可能的最大时间。
对于我来说,在Linux x86_64上使用gfortran,32位整数可以提供近25天的最大时间,而64位整数可以提供292年。64位整数的时钟分辨率也要精细得多(1毫秒对比1纳秒)。

@Vladimir F:代码似乎给出了正确的运行时间,我只是想确认一下这个函数的正确使用。我的最大运行时间相当于几个小时(大约在1到2小时之间)。我将使用int32和int64查看`count_max'值。谢谢。 - user1773603
通常来说,保证任何非平凡代码的正确性几乎是不可能的。但这个调用看起来是正确的。 - Vladimir F Героям слава

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接