我是否正确使用 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_rate
和 count_max
指定一个值,但我想有默认值。此外,似乎我必须考虑 count_0
或 count_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 纳秒)。
我通过以下方式将函数 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_rate
和 count_max
指定一个值,但我想有默认值。此外,似乎我必须考虑 count_0
或 count_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 纳秒)。