Question

I need to do some timing to compare the performance of some Fortran Vs C code. In C I can get both user time and system time independently.

When using gFortran's cpu_time() what does it represent?

With in IBM's fortran compiler one can choose what to output by setting an environment variable (see CPU_TIME() ) I found no reference to something similar in gFortran's documentation.

So, does anybody know if gFortran's cpu_time() returns user time, system time, or the sum of both?

Was it helpful?

Solution

Gfortran CPU_TIME returns the sum of the user and system time.

On MINGW it uses GetProcessTimes(), on other platforms getrusage() or if getrusage() is not available, times().

See

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

and

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

FWIW, if you wish to measure the wallclock time rather than CPU time, please use the SYSTEM_CLOCK intrinsic instead of CPU_TIME.

OTHER TIPS

my guess: the total of user and system time, otherwise it would be mentioned? Probably depends on the OS anyway, maybe not all of them make the distinction. As far a s I know, CPU time is the time which the OS assigns to your process, be it in user mode or in kernel mode executed on behalf of the process.

Is it important for you to have that distinction?

For performance comparison, I would probably go for wall-time anyway, and use CPU time to guess how much I/O it is doing by subtracting it from the wall-time.

If you need wallclock time, you may use date_and_time, http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gfortran/DATE_005fAND_005fTIME.html

I'm not sure how standard it is, but in my experience it works on at least four different platforms, including exotic Cray designs.

One gotcha here is to take care of the midnight, like this:

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

@Emanual Ey - In continuation to your comment on @steabert's post - (what follows goes for Intel's; I don't know whether something differs on other compilers). User cpu time + system cpu time should equal cpu time. Elapsed, real, or "wall clock" time should be greater than total charged cpu time. To measure wallclock time, it is best to put the time command, before and after the tricky part. Ugh, I'm gonna make this more complicated than it should be. Could you read the part on Timing your application on Intel's manual page (you'll have to find the "Timing your application" in the index). Should clear up a few things.

As I said before, that goes for Intel's. I don't have access to gfortran's compiler.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top