我是否正确使用Fortran系统时钟?
我使用Fortran90(使用gfortran编译)的函数我是否正确使用Fortran系统时钟?,fortran,gfortran,system-clock,Fortran,Gfortran,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_
系统时钟
,方法如下:
! 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\u rate
和count\u max
指定一个值,但我猜有默认值。此外,我似乎必须考虑count\u 0
或count\u 1
超过count\u max
值的情况,不是吗。正如您所看到的,为了获得良好的格式,我将秒数和所用时间的小数部分进行了拆分。从阅读结果来看,这看起来是正确的。然而,在没有看到输出的情况下,很难找出任何代码的正确性
我建议使用较大的整数(integer(int64)
)int64
是在模块iso_fortran_env
中定义的,在fortran 90中,您可以使用selected_int_kind
。它是特定于编译器的,但是您可能会得到更高的count\u max
和更精细的count\u rate
,并使用更大的整数。至少对于像gfortran和Intel这样的普通编译器来说是这样
我认为你无法有效地监控count
并将其与count\u max
进行比较。当我使用如上图所示的较大整数时,我从来没有这种需要。我可以想象某种方式(与count\u 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位整数的时钟分辨率也更高(1ms vs.1ns)。从读数上看,它看起来是正确的。然而,在没有看到输出的情况下,很难找出任何代码的正确性 我建议使用较大的整数(
integer(int64)
)int64
是在模块iso_fortran_env
中定义的,在fortran 90中,您可以使用selected_int_kind
。它是特定于编译器的,但是您可能会得到更高的count\u max
和更精细的count\u rate
,并使用更大的整数。至少对于像gfortran和Intel这样的普通编译器来说是这样
我认为你无法有效地监控count
并将其与count\u max
进行比较。当我使用如上图所示的较大整数时,我从来没有这种需要。我可以想象某种方式(与count\u 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毫秒vs.1纳秒)。请在所有Fortran问题中使用tag。你遇到什么问题了吗?有任何错误信息吗?结果是错误的还是正确的?
count\u 0
和count\u 1
将永远不会大于count\u max
。有关系统时钟的GFortran特定信息,请参阅并注意,系统时钟的所有参数都是INTENT(OUT)。这意味着内在函数永远不会从参数中读取,只会覆盖以前存在的内容。请对所有Fortran问题使用标记。你遇到什么问题了吗?有任何错误信息吗?结果是错误的还是正确的?count\u 0
和count\u 1
将永远不会大于count\u max
。有关系统时钟的GFortran特定信息,请参阅并注意,系统时钟的所有参数都是INTENT(OUT)。这意味着内在函数永远不会从参数中读取,只会覆盖以前存在的任何内容。-@Vladimir F:代码似乎给出了正确的运行时,我只是想验证这个函数的正确使用。我的最大运行时间等于几个小时(大约在1到2小时之间)。我将看到具有int32和int64的“count_max”值。RegardsIt通常几乎不可能保证任何非平凡代码的正确性。但是调用看起来是正确的。-@Vladimir F:代码似乎给出了正确的运行时,我只是想验证这个函数的正确使用。我的最大运行时间等于几个小时(大约在1到2小时之间)。我将看到具有int32和int64的“count_max”值。RegardsIt通常几乎不可能保证任何非平凡代码的正确性。但是这个电话看起来是正确的。