timer_test FORTRAN90 codes which examine methods for computing the elapsed CPU time of a part of a calculation.
The idea is that you want to determine the amount of CPU time taken by a piece of your code, so you write lines like this:
call timer ( t1 ) do i = 1, n ...some big calculation... end do call timer ( t2 ) write ( *, * ) 'Elapsed CPU time = ', t2 - t1
Early versions of FORTRAN did not specify a standard way to access a system timer. Users on UNIX systems could access a system library routine called ETIME for this purpose, but ETIME was not part of the FORTRAN language, and was not to be found on other operating systems.
FORTRAN90 added the SYSTEM_CLOCK function which can measure real time:
call system_clock ( t1, clock_rate, clock_max ) do i = 1, n ...some big calculation... end do call system_clock ( t2, clock_rate, clock_max ) write ( *, * ) 'Elapsed real time = ', real ( t2 - t1 ) / real ( clock_rate )
FORTRAN95 added the CPU_TIME function which measures CPU time:
call cpu_time ( t1 ) do i = 1, n ...some big calculation... end do call cpu_time ( t2 ) write ( *, * ) 'Elapsed CPU time = ', t2 - t1
On various computers, there are often vendor-supplied routines to do this chore. You will often find that the timer is inaccurate; some operations will be reported as taking zero time; other operations will be reported with times that differ by 5 or 10 percent. Moreover, two timers that profess to measure the same thing may produce results that are consistently different by a factor of 40 percent.
Another problem is "wrap around". Many timers reach a maximum value, and then reset themselves to zero. If this happens to you, (it's happened to me many times!) you may find that a certain procedure seems to take negative time!
Some timers return CPU time, that is, the amount of elapsed computer time that was used by your program; other routines return "real" time or "wall clock" time, which will not account for situations in which your program started, and then was paused for some reason (swapped out, waiting for I/O, or other system functions), and then finished.
For parallel programming, the important thing to measure is the elapsed wallclock time. This can be found by subtracting an initial reading of the wallclock time from a final one.
The OpenMP system provides a function used as follows:
seconds = omp_get_wtime ( ) operations to time; seconds = omp_get_wtime ( ) - seconds;while the MPI system provides a similar function used as:
seconds = MPI_Wtime ( ); operations; seconds = MPI_Wtime ( ) - seconds;and in MATLAB, wallclock time can be taken with "tic" and "toc":
tic; operation; seconds = toc;
timer_test is available in a C version and a C++ version and a FORTRAN90 version and a MATLAB version and a Python version.
LINPACK_BENCH, a FORTRAN90 code which measures the time needed to factor and solve a linear system.
MATMUL, a FORTRAN90 code which is an interactive matrix multiplication benchmark program.
MDBNCH, a FORTRAN77 program which is a benchmark code for a molecular dynamics calculation.
MEMORY_TEST, a FORTRAN90 code which declares and uses a sequence of larger and larger vectors, to see how big a vector can be used on a given machine and compiler.
MPI, FORTRAN90 codes which illustrate the use of the MPI application program interface for carrying out parallel computations in a distributed memory environment.
MXV, a FORTRAN90 code which compares the performance of (DO I, DO J) loops, (DO J, DO I ) loops, and MATMUL for computing the product of an MxN matrix A and an N vector X.
OPENMP, FORTRAN90 codes which illustrate the use of the OpenMP application program interface for carrying out parallel computations in a shared memory environment.
SUM_MILLION, a FORTRAN90 code which sums the integers from 1 to 1,000,000, as a demonstration of how to rate a computer's speed;
TIMESTAMP, a FORTRAN90 code which displays the current wall clock time.
WTIME, a FORTRAN90 code which returns a reading of the wall clock time in seconds.
TIMER_CPU_TIME uses the very convenient FORTRAN95 CPU_TIME routine:
TIMER_ETIME uses the ETIME routine, which is only available on UNIX systems:
TIMER_OMP_GET_WTIME uses the OpenMP wall clock function omp_get_wtime():
TIMER_SYSTEM_CLOCK uses the FORTRAN90 SYSTEM_CLOCK routine: