/[MITgcm]/MITgcm/eesupp/src/timers.F
ViewVC logotype

Diff of /MITgcm/eesupp/src/timers.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.19 by edhill, Tue Jun 7 20:52:42 2005 UTC revision 1.20 by ce107, Thu Dec 22 01:03:29 2005 UTC
# Line 2  C $Header$ Line 2  C $Header$
2  C $Name$  C $Name$
3    
4  #include "CPP_EEOPTIONS.h"  #include "CPP_EEOPTIONS.h"
5    #ifdef USE_LIBHPM
6    # include "f_hpm.h"
7    #endif
8    
9  C--   File utils.F: General purpose support routines  C--   File utils.F: General purpose support routines
10  C--    Contents  C--    Contents
# Line 162  C     nTimers      :: Number of active t Line 165  C     nTimers      :: Number of active t
165        PARAMETER ( PRINT = 'PRINT' )        PARAMETER ( PRINT = 'PRINT' )
166        CHARACTER*(*) PRINTALL        CHARACTER*(*) PRINTALL
167        PARAMETER ( PRINTALL = 'PRINTALL' )        PARAMETER ( PRINTALL = 'PRINTALL' )
168        INTEGER I  #ifdef USE_PAPI
169    #include <fpapi.h>
170          INTEGER PAPIF_num_counters
171          EXTERNAL PAPIF_num_counters
172          CHARACTER*(*) INIT
173          CHARACTER(13) EventName
174          PARAMETER ( INIT = 'INIT' )
175          INTEGER nmaxevents
176          PARAMETER (nmaxevents = 18)
177          INTEGER EventCode(nmaxevents)
178          INTEGER*8 values(nmaxevents, maxTimers , MAX_NO_THREADS),
179         $     values1(nmaxevents, maxTimers, MAX_NO_THREADS),
180         $     values2(nmaxevents, maxTimers, MAX_NO_THREADS)
181          COMMON /papivalues/ values, values1, values2
182          INTEGER neventsmax, nevents, Check, EventSet
183          INTEGER papiunit
184          SAVE EventCode, neventsmax, nevents, EventSet
185    #endif
186          INTEGER I, J
187        Real*8 userTime        Real*8 userTime
188        Real*8 systemTime        Real*8 systemTime
189        Real*8 wallClockTime        Real*8 wallClockTime
# Line 213  C Line 234  C
234            timerStatus(iTimer,myThreadId) = RUNNING            timerStatus(iTimer,myThreadId) = RUNNING
235            timerStarts(iTimer,myThreadId) =            timerStarts(iTimer,myThreadId) =
236       &       timerStarts(iTimer,myThreadId)+1       &       timerStarts(iTimer,myThreadId)+1
237    #ifdef USE_PAPI
238    CCE107 - Read event counts
239              call PAPIF_read(EventSet, values1(1,iTimer,myThreadId), Check)
240    #endif
241          ENDIF          ENDIF
242    #ifdef USE_LIBHPM
243            CALL f_hpmtstart((myThreadId-1)*100+iTimer,tmpName)
244    #endif
245        ELSEIF ( tmpAction .EQ. STOP ) THEN        ELSEIF ( tmpAction .EQ. STOP ) THEN
246          IF ( iTimer .EQ. 0 ) GOTO 905          IF ( iTimer .EQ. 0 ) GOTO 905
247    #ifdef USE_LIBHPM
248            CALL f_hpmtstop((myThreadId-1)*100+iTimer)
249    #endif
250          IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN          IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN
251    #ifdef USE_PAPI
252    CCE107 PAPI - Read event counts
253              call PAPIF_read(EventSet, values2(1,iTimer,myThreadId), Check)
254    #endif
255            CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )            CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
256            timerUser(iTimer,myThreadId)    =            timerUser(iTimer,myThreadId)    =
257       &       timerUser(iTimer,myThreadId) +       &       timerUser(iTimer,myThreadId) +
# Line 230  C Line 265  C
265       &       timerWall(iTimer,myThreadId) +       &       timerWall(iTimer,myThreadId) +
266       &                           wallClockTime -       &                           wallClockTime -
267       &                           timerT0Wall(iTimer,myThreadId)       &                           timerT0Wall(iTimer,myThreadId)
268    #ifdef USE_PAPI
269              do i=1,nevents
270                 values(i,iTimer,myThreadId) = values(i,iTimer,myThreadId) +
271         $       values2(i,iTimer,myThreadId) - values1(i,iTimer,myThreadId)
272              enddo
273    #endif
274            timerStatus(iTimer,myThreadId)  = STOPPED            timerStatus(iTimer,myThreadId)  = STOPPED
275            timerStops (iTimer,myThreadId)  =            timerStops (iTimer,myThreadId)  =
276       &    timerStops (iTimer,myThreadId)+1       &    timerStops (iTimer,myThreadId)+1
277          ENDIF          ENDIF
278    #ifdef USE_PAPI
279          ELSEIF ( tmpAction .EQ. INIT ) THEN
280    CCE107 PAPI - Check PAPI version, find the maximum number of events and
281    C      initialize the library, read the suggested events and create
282    C      EventSet, prepare counter for use
283             Check = PAPI_VER_CURRENT
284             call PAPIF_library_init(Check)
285             if (Check .NE. PAPI_VER_CURRENT) then
286                WRITE(msgBuffer,*) "PAPI Library Version is out of Date"
287                CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
288         &           SQUEEZE_RIGHT,myThreadId)
289                CALL ABORT
290             endif
291             neventsmax = PAPIF_num_counters(check)
292             if (neventsmax .GT. nmaxevents) then
293                WRITE(msgBuffer,*) "Fix the nmaxevents in the code to ",
294         $           neventsmax
295                CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
296         &           SQUEEZE_RIGHT,myThreadId)
297                CALL ABORT
298             endif
299             _BEGIN_MASTER(myThreadId)
300             CALL mdsFindUnit (papiunit, myThreadId)
301             OPEN(UNIT=papiunit,FILE='data.papi',STATUS='OLD')
302            read(papiunit,*) nevents
303    C       reset to reasonable values
304            if (nevents .gt. neventsmax) then
305               nevents = neventsmax
306               WRITE(msgBuffer,*)
307         $          "resetting the number of PAPI events to the maximum"
308               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
309         &           SQUEEZE_RIGHT,myThreadId)
310            endif
311            do i = 1,nevents
312              read(papiunit,*) EventName
313              call PAPIF_event_name_to_code(EventName, EventCode(i), Check)
314            end do
315            close(papiunit)
316            _END_MASTER(myThid)
317            EventSet = PAPI_NULL
318            call PAPIF_create_eventset(EventSet, Check)
319            do i = 1,nevents
320               call PAPIF_add_event(EventSet, EventCode(i), Check)
321               if (Check .NE. PAPI_OK) then
322                  CALL PAPIF_event_code_to_name(EventCode(i), EventName,
323         $             Check)
324                  WRITE(msgBuffer,*) "Abort After PAPIF_add_event: ",
325         $             EventName
326                  CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
327         &             SQUEEZE_RIGHT,myThreadId)
328                  CALL ABORT
329               endif
330            enddo
331    CCE107 - Start counting events
332            call PAPIF_start(EventSet, Check)
333    #endif
334        ELSEIF ( tmpAction .EQ. PRINT ) THEN        ELSEIF ( tmpAction .EQ. PRINT ) THEN
335          IF ( iTimer .EQ. 0 ) GOTO 905          IF ( iTimer .EQ. 0 ) GOTO 905
336          WRITE(msgBuffer,*)          WRITE(msgBuffer,*)
# Line 262  C Line 359  C
359       &  timerStops(iTimer,myThreadId)       &  timerStops(iTimer,myThreadId)
360          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
361       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
362    #ifdef USE_PAPI
363            do i = 1,nevents
364               call PAPIF_event_code_to_name(EventCode(i), EventName, Check)
365               if ((EventName .ne. 'PAPI_FLOPS   ') .and.
366         $         (EventName .ne. 'PAPI_IPS     ')) then
367                   WRITE(msgBuffer,71) Eventname,
368         $         values(i,iTimer,myThreadId)/timerUser(iTimer,myThreadId),
369         $         values(i,iTimer,myThreadId)/timerWall(iTimer,myThreadId),
370         $         1.D0*values(i,iTimer,myThreadId)
371               else
372                   WRITE(msgBuffer,72) Eventname,1.D0*values(j,I,myThreadId)
373               endif
374               CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
375         &          SQUEEZE_RIGHT,myThreadId)
376            enddo
377    #endif
378        ELSEIF ( tmpAction .EQ. PRINTALL ) THEN        ELSEIF ( tmpAction .EQ. PRINTALL ) THEN
379          DO 10 I = 1, nTimers(myThreadId)          DO 10 I = 1, nTimers(myThreadId)
380           WRITE(msgBuffer,*) ' Seconds in section "',           WRITE(msgBuffer,*) ' Seconds in section "',
# Line 289  C Line 402  C
402       &  timerStops(I,myThreadId)       &  timerStops(I,myThreadId)
403           CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,           CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
404       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
405    #ifdef USE_PAPI
406            do j = 1,nevents
407               call PAPIF_event_code_to_name(EventCode(j), EventName, Check)
408               if ((EventName .ne. 'PAPI_FLOPS   ') .and.
409         $         (EventName .ne. 'PAPI_IPS     ')) then
410                   WRITE(msgBuffer,71) Eventname,
411         $             values(j,I,myThreadId)/timerUser(I,myThreadId),
412         $             values(j,I,myThreadId)/timerWall(I,myThreadId),
413         $             1.D0*values(j,I,myThreadId)
414               else
415                   WRITE(msgBuffer,72) Eventname,1.D0*values(j,I,myThreadId)
416               endif
417               CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
418         &          SQUEEZE_RIGHT,myThreadId)
419            enddo
420    #endif
421     10   CONTINUE     10   CONTINUE
422        ELSE        ELSE
423          GOTO 903          GOTO 903
# Line 435  C Line 564  C
564        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
565       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
566        GOTO 1000        GOTO 1000
567    
568     71   FORMAT(A,' per sec ',D13.7,' ',D13.7,', number ', D13.7)
569     72   FORMAT(A,D13.7)
570        END        END
571    
572  CBOP  CBOP
# Line 585  CBOP Line 717  CBOP
717  C     !ROUTINE: TIMER_STOP  C     !ROUTINE: TIMER_STOP
718    
719  C     !INTERFACE:  C     !INTERFACE:
720        SUBROUTINE TIMER_STOP  ( string , myThreadId)        SUBROUTINE TIMER_STOP  ( string , myThreadId )
721        IMPLICIT NONE        IMPLICIT NONE
722    
723  C     !DESCRIPTION:  C     !DESCRIPTION:
# Line 603  C Line 735  C
735        RETURN        RETURN
736        END        END
737  C***********************************************************************  C***********************************************************************
738    
739    #ifdef USE_PAPI
740    CCE107 Initialization of common block for PAPI timers
741          BLOCK DATA setpapivalues
742    #include "EEPARAMS.h"
743          INTEGER maxTimers
744          PARAMETER (maxTimers = 40)
745          INTEGER nmaxevents
746          PARAMETER (nmaxevents = 18)
747          INTEGER EventCode(nmaxevents)
748          INTEGER size
749          PARAMETER (size = 3*nmaxevents*maxTimers*MAX_NO_THREADS)
750          INTEGER*8 values(nmaxevents, maxTimers , MAX_NO_THREADS),
751         $     values1(nmaxevents, maxTimers, MAX_NO_THREADS),
752         $     values2(nmaxevents, maxTimers, MAX_NO_THREADS)
753          COMMON /papivalues/ values, values1, values2
754          DATA values, values1, values2 /size*0/
755          END
756    #endif

Legend:
Removed from v.1.19  
changed lines
  Added in v.1.20

  ViewVC Help
Powered by ViewVC 1.1.22