我是否正确使用Fortran系统时钟?

我是否正确使用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_

我使用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\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通常几乎不可能保证任何非平凡代码的正确性。但是这个电话看起来是正确的。