Advertisement
angel_devicente

timing.f90

Jul 10th, 2014
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ! timing.f90 --
  2. !     Module for timing operations:
  3. !     - create a timer
  4. !     - start the timer, run some operation
  5. !     - stop the timer
  6. !     This will automatically register how much
  7. !     "real" time was spent and how much CPU time
  8. !     Notes:
  9. !     - Routines are available for a simple report
  10. !     - To keep the code simple, there is a fixed
  11. !       number of timers (MAX_TIMERS). This way
  12. !       writing the report is very simple
  13. !     - The following items are recorded:
  14. !       - total "real" time
  15. !       - total CPU time
  16. !       - total number of iterations
  17. !       - minimum and maximum "real" time intervals
  18. !         for a single iteration
  19. !
  20. !     $Id: timing.f90,v 1.3 2007/01/26 09:56:43 arjenmarkus Exp $
  21. !
  22. module timing
  23.     implicit none
  24.  
  25.     type TIMER
  26.         integer           :: start_clock
  27.         real              :: start_cpu
  28.         real              :: total_sys_time
  29.         real              :: total_cpu_time
  30.         real              :: min_sys_time
  31.         real              :: max_sys_time
  32.         integer           :: number_iterations
  33.         character(len=40) :: name
  34.     end type
  35.  
  36.     private :: TIMER
  37.     integer, parameter, private                       :: max_timers = 100
  38.     logical, private, save                            :: init_timers = .true.
  39.     type(TIMER), dimension(max_timers), save, private :: timers
  40.  
  41. contains
  42.  
  43. ! timer_create
  44. !     Create a new timer
  45. !
  46. ! Arguments:
  47. !     name          Name of the timer (for the report)
  48. !     timerid       ID of the timer (-1: no more timers)
  49. !
  50. subroutine timer_create( name, timerid )
  51.     character(len=*), intent(in)    :: name
  52.     integer, intent(out)            :: timerid
  53.  
  54.     integer                         :: i
  55.  
  56.     if ( init_timers ) then
  57.         init_timers = .false.
  58.         timers(1:max_timers)%number_iterations = -1
  59.     endif
  60.  
  61.     timerid = -1
  62.     do i = 1,max_timers
  63.         if ( timers(i)%number_iterations .eq. -1 ) then
  64.             timerid = i
  65.             timers(i)%name = name
  66.             call timer_reset( timerid )
  67.  
  68.             exit
  69.         endif
  70.     enddo
  71. end subroutine timer_create
  72.  
  73. ! timer_destroy
  74. !     Destroy a timer (make the entry available for a new name)
  75. !
  76. ! Arguments:
  77. !     timerid       ID of the timer
  78. !
  79. subroutine timer_destroy( timerid )
  80.     integer, intent(in)             :: timerid
  81.  
  82.     if ( timerid .ge. 1 .and. timerid .le. max_timers ) then
  83.         timers(timerid)%number_iterations = -1
  84.     endif
  85. end subroutine timer_destroy
  86.  
  87. ! timer_reset
  88. !     Reset a timer
  89. !
  90. ! Arguments:
  91. !     timerid       ID of the timer
  92. !
  93. subroutine timer_reset( timerid )
  94.     integer, intent(in)             :: timerid
  95.  
  96.     if ( timerid .ge. 1 .and. timerid .le. max_timers ) then
  97.         timers(timerid)%number_iterations = 0
  98.         timers(timerid)%start_clock       = 0
  99.         timers(timerid)%start_cpu         = 0
  100.         timers(timerid)%total_sys_time    = 0.0
  101.         timers(timerid)%total_cpu_time    = 0.0
  102.         timers(timerid)%min_sys_time      = huge(1.0)
  103.         timers(timerid)%max_sys_time      = 0.0
  104.     endif
  105. end subroutine timer_reset
  106.  
  107. ! timer_report
  108. !     Write a report on the timers
  109. !
  110. ! Arguments:
  111. !     lun           LU-number to write to (-1: to screen)
  112. !
  113. subroutine timer_report( lun )
  114.     integer, intent(in)             :: lun
  115.  
  116.     integer                         :: i
  117.  
  118.     if ( lun .gt. 0 ) then
  119.         write( lun, '(1x,a)' ) 'Timing report:'
  120.         write( lun, '(1x,a)' ) &
  121.         'Timer                                    Number Iterations Mean real time  Mean CPU time        Minimum        Maximum',&
  122.         '----------------------------------------                              (s)            (s)            (s)            (s)'
  123.         do i = 1,max_timers
  124.             if ( timers(i)%number_iterations .gt. 0 ) then
  125.                 write( lun, '(1x,a,i17,4e15.4)' ) &
  126.                     timers(i)%name, timers(i)%number_iterations, &
  127.                     timers(i)%total_sys_time / timers(i)%number_iterations, &
  128.                     timers(i)%total_cpu_time / timers(i)%number_iterations, &
  129.                     timers(i)%min_sys_time, timers(i)%max_sys_time
  130.             endif
  131.         enddo
  132.         write( lun, '(/)' )
  133.     else
  134.         write( *, '(1x,a)' ) 'Timing report:'
  135.         write( *, '(1x,a)' ) &
  136.         'Timer                                   Number Iterations Mean real time  Mean CPU time        Minimum        Maximum',&
  137.         '----------------------------------------                             (s)            (s)            (s)            (s)'
  138.         do i = 1,max_timers
  139.             if ( timers(i)%number_iterations .gt. 0 ) then
  140.                 write( *, '(1x,a,i17,4e15.4)' ) &
  141.                     timers(i)%name, timers(i)%number_iterations, &
  142.                     timers(i)%total_sys_time / timers(i)%number_iterations, &
  143.                     timers(i)%total_cpu_time / timers(i)%number_iterations, &
  144.                     timers(i)%min_sys_time, timers(i)%max_sys_time
  145.             endif
  146.         enddo
  147.         write( *, '(/)' )
  148.     endif
  149. end subroutine timer_report
  150.  
  151. ! timer_start
  152. !     Register the start time
  153. !
  154. ! Arguments:
  155. !     timerid       ID of the timer
  156. !
  157. subroutine timer_start( timerid )
  158.     integer, intent(in)             :: timerid
  159.  
  160.     integer                         :: count
  161.     integer                         :: count_scale
  162.     integer                         :: count_max
  163.  
  164.     if ( timerid .ge. 1 .and. timerid .le. max_timers ) then
  165.         call cpu_time( timers(timerid)%start_cpu )
  166.         call system_clock( count, count_scale, count_max )
  167.         timers(timerid)%start_clock = count
  168.     endif
  169. end subroutine timer_start
  170.  
  171. ! timer_stop
  172. !     Register the stop time
  173. !
  174. ! Arguments:
  175. !     timerid       ID of the timer
  176. !     noiter        Number of iterations (defaults to 1)
  177. !                   the elapsed period represents
  178. !
  179. subroutine timer_stop( timerid, noiter )
  180.     integer, intent(in)             :: timerid
  181.     integer, intent(in), optional   :: noiter
  182.  
  183.     integer                         :: noiter_
  184.     integer                         :: count
  185.     integer                         :: count_scale
  186.     integer                         :: count_max
  187.     real                            :: stop_time
  188.     real                            :: period
  189.  
  190.     if ( timerid .ge. 1 .and. timerid .le. max_timers ) then
  191.         call cpu_time( stop_time )
  192.         call system_clock( count, count_scale, count_max )
  193.  
  194.         noiter_ = 1
  195.         if ( present(noiter) ) noiter_ = noiter
  196.  
  197.         period = (real(count-timers(timerid)%start_clock))/real(count_scale)
  198.         timers(timerid)%total_sys_time = timers(timerid)%total_sys_time + period
  199.         timers(timerid)%total_cpu_time = timers(timerid)%total_cpu_time + &
  200.             stop_time - timers(timerid)%start_cpu
  201.         timers(timerid)%number_iterations = timers(timerid)%number_iterations + noiter_
  202.  
  203.         period = period / noiter_
  204.         timers(timerid)%min_sys_time = min( timers(timerid)%min_sys_time, period )
  205.         timers(timerid)%max_sys_time = max( timers(timerid)%max_sys_time, period )
  206.     endif
  207. end subroutine timer_stop
  208.  
  209. end module timing
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement