1

我需要做一些时间来比较一些 Fortran Vs C 代码的性能。在 CI 中可以独立获取用户时间和系统时间。

使用 gFortran 时cpu_time()它代表什么?

在 IBM 的 fortran 编译器中,可以通过设置环境变量来选择要输出的内容(请参阅 CPU_TIME()),我在gFortran 的文档中没有找到类似的参考。

那么,有人知道 gFortran 的 cpu_time() 是返回用户时间、系统时间还是两者的总和?

4

4 回答 4

2

Gfortran CPU_TIME 返回用户和系统时间的总和。

在 MINGW 上,它使用 GetProcessTimes(),在其他平台上使用 getrusage(),或者如果 getrusage() 不可用,则使用 times()。

http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgfortran/intrinsics/cpu_time.c;h=619f8d25246409e0f32c96299db724213aa62b45;hb=refs/heads/master

http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgfortran/intrinsics/time_1.h;h=12d79ebc12fecf52baa0895c7ab8accc41dab500;hb=refs/heads/master

FWIW,如果您想测量挂钟时间而不是 CPU 时间,请使用 SYSTEM_CLOCK 内在函数而不是 CPU_TIME。

于 2011-03-15T20:24:19.040 回答
1

我的猜测:用户和系统时间的总和,否则会被提及?无论如何,可能取决于操作系统,也许并非所有人都能做出区分。据我所知,CPU时间是操作系统分配给您的进程的时间,无论是在用户模式下还是在内核模式下代表进程执行。

拥有这种区别对你来说很重要吗?

为了进行性能比较,无论如何我可能会选择 wall-time,并使用 CPU time 通过从 wall-time 中减去它来猜测它正在执行多少 I/O。

于 2011-03-15T16:09:27.890 回答
1

如果您需要挂钟时间,您可以date_and_time使用http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gfortran/DATE_005fAND_005fTIME.html

我不确定它有多标准,但根据我的经验,它至少可以在四个不同的平台上运行,包括异国情调的 Cray 设计。

这里的一个问题是照顾午夜,像这样:

character*8  :: date            
character*10 :: time
character*5  :: zone
integer :: tvalues(8)
real*8 :: time_prev, time_curr, time_elapsed, time_limit

integer :: hr_curr, hr_prev

! set the clock
call date_and_time(date, time, zone, tvalues)

time_curr = tvalues(5)*3600.d0 + tvalues(6)*60.d0 + tvalues(7)  ! seconds 
hr_curr = tvalues(5)
time_prev=0.d0; time_elapsed = 0.d0; hr_prev = 0

!... do something...

time_prev = time_curr; hr_prev = hr_curr
call date_and_time(date, time, zone, tvalues)
time_curr = tvalues(5)*3600.d0 + tvalues(6)*60.d0 + tvalues(7)  ! seconds 
hr_curr = tvalues(5)
dt = time_curr - time_prev
if( hr_curr < hr_prev )dt = dt + 24*3600.d0   ! across the midnight

time_elapsed = time_elapsed + dt
于 2011-03-15T18:40:24.253 回答
0

@Emanual Ey -继续您对@steabert 帖子的评论 -(接下来是英特尔的;我不知道其他编译器是否有所不同)。用户 cpu 时间 + 系统 cpu 时间应该等于 cpu 时间。经过时间、实际时间或“挂钟”时间应大于总充电 CPU 时间。要测量挂钟时间,最好将时间命令放在棘手的部分之前和之后。呃,我会让这变得比它应该的更复杂。您能否阅读英特尔手册页上有关为应用程序计时的部分(您必须在索引中找到“为您的应用程序计时”)。应该弄清楚一些事情。

正如我之前所说,这适用于英特尔。我无权访问 gfortran 的编译器。

于 2011-03-15T18:38:56.433 回答