我是否正确使用 Fortran system_clock?

Do I use Fortran system_clock correctly?

我通过以下方式将函数 system_clock 与 Fortran90(使用 gfortran 编译)一起使用:

   ! 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 值的情况,不是吗?如您所见,为了漂亮的格式,我将经过的时间的秒数和小数部分分开。

阅读看来是正确的。然而,如果不看输出就很难找出任何代码的正确性。

我建议使用更大的整数 (integer(int64))。 int64 在模块 iso_fortran_env 中定义,在 Fortran 90 中您可以使用 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

尝试 integer(int32)integer(int64) 以及上面的 integer 并观察编译器选择这些选项的最大次数。

对于 Linux x86_64 上的 gfortran,32 位整数为我提供了将近 25 天的最长时间,而 64 位整数允许 292 年。 64 位整数的时钟分辨率也更精细(1 毫秒对 1 纳秒)。