我需要做一些时间来比较一些Fortran Vs C代码的性能。 在C中,我可以独立地获得用户时间和系统时间。
使用gFortran的cpu_time()
时代表什么?
在IBM的fortran编译器中,可以通过设置环境变量来选择输出内容(参见CPU_TIME()) 我在gFortran's documentation中找不到类似的内容。
那么,是否有人知道gFortran的cpu_time()是否返回用户时间,系统时间或两者的总和?
答案 0 :(得分:2)
Gfortran CPU_TIME返回用户和系统时间的总和。
在MINGW上它使用GetProcessTimes(),在其他平台上使用getrusage()或者getrusage()不可用,times()。
见
和
FWIW,如果你想测量挂钟时间而不是CPU时间,请使用SYSTEM_CLOCK内在而不是CPU_TIME。
答案 1 :(得分:1)
我的猜测:用户和系统时间的总和,否则会提到?无论如何可能取决于操作系统,也许并非所有操作系统都有所区别。据我所知,CPU时间是操作系统分配给您的进程的时间,无论是用户模式还是代表进程执行的内核模式。
你有这种区别对你很重要吗?
为了进行性能比较,无论如何我都可能会花一些时间,并使用CPU时间通过从壁挂时间中减去它来猜测它正在做多少I / O.
答案 2 :(得分: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
答案 3 :(得分:0)
@Emanual Ey - 继续评论@ steabert的帖子(以下是英特尔的;我不知道其他编译器是否有不同之处)。用户cpu时间+系统cpu时间应该等于cpu时间。经过时间,真实时间或“挂钟”时间应该大于总的充电时间。要测量挂钟时间,最好在棘手部分之前和之后放置时间命令。呃,我会让它变得比它应该更复杂。你能阅读 Timing your application on Intel's manual page 上的部分(你必须在索引中找到“定时你的应用程序”)。应该清理一些事情。
正如我之前所说,这适用于英特尔。我无法访问gfortran的编译器。