/[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.4 by cnh, Wed Oct 28 03:11:35 1998 UTC revision 1.25 by jmc, Thu Oct 12 20:27:45 2006 UTC
# Line 1  Line 1 
1  C $Header$  C $Header$
2    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 13  C--   TIMER_STOP      - Stop CPU tier fo Line 17  C--   TIMER_STOP      - Stop CPU tier fo
17  C--   Routines marked "M" contain specific machine dependent code.  C--   Routines marked "M" contain specific machine dependent code.
18  C--   Routines marked "U" contain UNIX OS calls.  C--   Routines marked "U" contain UNIX OS calls.
19    
20  CStartOfInterface  CGG   Modified following A. Biastoch for use with SP3. Is backwards
21    CGG   compatible. G. Gebbie, gebbie@mit.edu, 20 Oct 2001, Scripps.
22    
23    CBOP
24    C     !ROUTINE: TIMER_INDEX
25    
26    C     !INTERFACE:
27        INTEGER FUNCTION TIMER_INDEX (        INTEGER FUNCTION TIMER_INDEX (
28       I        name,timerNames,maxTimers,nTimers )       I        name,timerNames,maxTimers,nTimers )
29  C     /==========================================================\        IMPLICIT NONE
30  C     | FUNCTION TIMER_INDEX                                     |  
31  C     | o Timing support routine.                                |  C     !DESCRIPTION:
32  C     |==========================================================|  C     *==========================================================*
33  C     | Return index in timer data structure of timer named      |  C     | FUNCTION TIMER\_INDEX                                      
34  C     | by the function argument "name".                         |  C     | o Timing support routine.                                
35  C     \==========================================================/  C     *==========================================================*
36    C     | Return index in timer data structure of timer named      
37    C     | by the function argument "name".                          
38    C     *==========================================================*
39    
40    C     !INPUT/OUTPUT PARAMETERS:
41    C     == Routine arguements ==
42    C     maxTimers  :: Total number of timers allowed
43    C     nTimers    :: Current number of timers
44    C     name       :: Name of timer to find
45    C     timerNames :: List of valid timer names
46        INTEGER maxTimers        INTEGER maxTimers
47        INTEGER nTimers        INTEGER nTimers
48        CHARACTER*(*) name        CHARACTER*(*) name
49        CHARACTER*(*) timerNames(maxTimers)        CHARACTER*(*) timerNames(maxTimers)
50  CEndOfInterface  
51    C     !LOCAL VARIABLES:
52    C     == Local variables ==
53    C     I :: Index variable
54        INTEGER I        INTEGER I
55    CEOP
56  C  C
57        TIMER_INDEX = 0        TIMER_INDEX = 0
58        IF ( name .EQ. ' ' ) THEN        IF ( name .EQ. ' ' ) THEN
# Line 44  C Line 68  C
68        RETURN        RETURN
69        END        END
70    
71  CStartOfInterface  CBOP
72    C     !ROUTINE: TIMER_CONTROL
73    
74    C     !INTERFACE:
75        SUBROUTINE TIMER_CONTROL ( name , action , callProc , myThreadId )        SUBROUTINE TIMER_CONTROL ( name , action , callProc , myThreadId )
76  C     /==========================================================\        IMPLICIT NONE
77  C     | SUBROUTINE TIMER_CONTROL                                 |  
78    C     !DESCRIPTION:
79    C     *==========================================================*
80    C     | SUBROUTINE TIMER\_CONTROL                                 |
81  C     | o Timing routine.                                        |  C     | o Timing routine.                                        |
82  C     |==========================================================|  C     *==========================================================*
83  C     | User callable interface to timing routines. Timers are   |  C     | User callable interface to timing routines. Timers are   |
84  C     | created, stopped, started and queried only through this  |  C     | created, stopped, started and queried only through this  |
85  C     | rtouine.                                                 |  C     | rtouine.                                                 |
86  C     \==========================================================/  C     *==========================================================*
87    
88    C     !USES:
89  #include "SIZE.h"  #include "SIZE.h"
90  #include "EEPARAMS.h"  #include "EEPARAMS.h"
91  #include "EESUPPORT.h"  #include "EESUPPORT.h"
       CHARACTER*(*) name  
       CHARACTER*(*) action  
       CHARACTER*(*) callProc  
       INTEGER myThreadId  
 CEndOfInterface  
 C  
92        INTEGER  TIMER_INDEX        INTEGER  TIMER_INDEX
93        INTEGER  IFNBLNK        INTEGER  IFNBLNK
94        INTEGER  ILNBLNK        INTEGER  ILNBLNK
95        EXTERNAL TIMER_INDEX        EXTERNAL TIMER_INDEX
96        EXTERNAL IFNBLNK        EXTERNAL IFNBLNK
97        EXTERNAL ILNBLNK        EXTERNAL ILNBLNK
98    
99    C     !INPUT/OUTPUT PARAMETERS:
100    C     name       :: name of the timer
101    C     action     :: operation to perform with this timer
102    C     callProc   :: procedure calling this routine
103    C     myThreadId :: instance number of this thread
104          CHARACTER*(*) name
105          CHARACTER*(*) action
106          CHARACTER*(*) callProc
107          INTEGER myThreadId
108  C  C
109    C     !LOCAL VARIABLES:
110    C     maxTimers :: Total numer of timer allowed
111    C     maxString :: Max length of a timer name
112        INTEGER maxTimers        INTEGER maxTimers
113        INTEGER maxString        INTEGER maxString
114        PARAMETER ( maxTimers = 40 )        PARAMETER ( maxTimers = 40 )
115        PARAMETER ( maxString = 80 )        PARAMETER ( maxString = 80 )
116  C  C     timerStarts :: Timer counters for each timer and each thread
117    C     timerStops
118    C     timerUser
119    C     timerWall
120    C     timerSys
121    C     timerT0User
122    C     timerT0Wall
123    C     timerT0Sys
124    C     timerStatus  :: START/STOP/RUNNING Status of the timer
125    C     timerNameLen :: Length of timer name
126    C     timerNames   :: Table of timer names
127    C     nTimers      :: Number of active timers
128        INTEGER timerStarts( maxTimers , MAX_NO_THREADS)        INTEGER timerStarts( maxTimers , MAX_NO_THREADS)
129        SAVE    timerStarts        SAVE    timerStarts
130        INTEGER timerStops ( maxTimers , MAX_NO_THREADS)        INTEGER timerStops ( maxTimers , MAX_NO_THREADS)
# Line 91  C Line 141  C
141        SAVE timerT0Wall        SAVE timerT0Wall
142        Real*8 timerT0Sys ( maxTimers , MAX_NO_THREADS)        Real*8 timerT0Sys ( maxTimers , MAX_NO_THREADS)
143        SAVE timerT0Sys        SAVE timerT0Sys
 C     ===============================================================  
 C  
144        INTEGER timerStatus( maxTimers , MAX_NO_THREADS)        INTEGER timerStatus( maxTimers , MAX_NO_THREADS)
145        SAVE    timerStatus        SAVE    timerStatus
146        INTEGER timerNameLen( maxTimers , MAX_NO_THREADS)        INTEGER timerNameLen( maxTimers , MAX_NO_THREADS)
147        SAVE    timerNameLen        SAVE    timerNameLen
148        CHARACTER*(maxString) timerNames( maxTimers , MAX_NO_THREADS)        CHARACTER*(maxString) timerNames( maxTimers , MAX_NO_THREADS)
149        SAVE                  timerNames        SAVE                  timerNames
       CHARACTER*(maxString) timerAction  
150        INTEGER nTimers(MAX_NO_THREADS)        INTEGER nTimers(MAX_NO_THREADS)
151        CHARACTER*(maxString) tmpName        CHARACTER*(maxString) tmpName
152        CHARACTER*(maxString) tmpAction        CHARACTER*(maxString) tmpAction
# Line 118  C Line 165  C
165        PARAMETER ( PRINT = 'PRINT' )        PARAMETER ( PRINT = 'PRINT' )
166        CHARACTER*(*) PRINTALL        CHARACTER*(*) PRINTALL
167        PARAMETER ( PRINTALL = 'PRINTALL' )        PARAMETER ( PRINTALL = 'PRINTALL' )
168        INTEGER I  #if defined(USE_PAPI) || defined(USE_PCL_FLOPS_SFP) || defined(USE_PCL_FLOPS) || defined (USE_PCL)
169          CHARACTER*(*) INIT
170          PARAMETER ( INIT = 'INIT' )
171    #ifdef USE_PAPI
172          INTEGER nmaxevents
173          PARAMETER (nmaxevents = 18)
174          INTEGER neventsmax, nevents
175          SAVE neventsmax, nevents
176          INTEGER*8 values(nmaxevents, maxTimers , MAX_NO_THREADS),
177         $     values1(nmaxevents, maxTimers, MAX_NO_THREADS),
178         $     values2(nmaxevents, maxTimers, MAX_NO_THREADS)
179          COMMON /papivalues/ values, values1, values2
180    #include <fpapi.h>
181          CHARACTER(13) EventName
182          INTEGER EventCode(nmaxevents)
183          INTEGER Check, EventSet
184          INTEGER papiunit
185          SAVE EventCode, EventSet
186    #else
187    #if defined(USE_PCL_FLOPS_SFP) || defined(USE_PCL_FLOPS) || defined(USE_PCL)
188    #include <pclh.f>
189          INTEGER nmaxevents
190          PARAMETER (nmaxevents = 61)
191          INTEGER flags, res, nevents
192          INTEGER*8 descr
193          CHARACTER*22 pcl_counter_name(0:nmaxevents-1)
194    #ifdef USE_PCL
195          INTEGER pcl_counter_list(nmaxevents)
196          INTEGER*8 i_result(nmaxevents, maxTimers, MAX_NO_THREADS)
197          INTEGER*8 i_result1(nmaxevents, maxTimers, MAX_NO_THREADS)
198          INTEGER*8 i_result2(nmaxevents, maxTimers, MAX_NO_THREADS)
199          REAL*8 fp_result(nmaxevents, maxTimers, MAX_NO_THREADS)
200    #else
201          INTEGER pcl_counter_list(5), alt_counter_list(5)
202          INTEGER*8 i_result(5)
203          REAL*8 fp_result(5)
204          SAVE alt_counter_list
205          DATA alt_counter_list /PCL_MFLOPS, PCL_IPC, PCL_L1DCACHE_MISSRATE,
206         $     PCL_L2DCACHE_MISSRATE, PCL_MEM_FP_RATIO/
207    #endif
208          COMMON /pclvars/ i_result, descr, fp_result, pcl_counter_list,
209         $     flags, nevents
210          COMMON /pclnames/ pcl_counter_name
211          INTEGER pclunit
212    #endif
213    #endif
214    #endif
215          INTEGER I, J
216        Real*8 userTime        Real*8 userTime
217        Real*8 systemTime        Real*8 systemTime
218        Real*8 wallClockTime        Real*8 wallClockTime
219        CHARACTER*(MAX_LEN_MBUF) msgBuffer        CHARACTER*(MAX_LEN_MBUF) msgBuffer
 C  
220        DATA nTimers  /MAX_NO_THREADS*0/        DATA nTimers  /MAX_NO_THREADS*0/
221        SAVE nTimers        SAVE nTimers
222    CEOP
223  C  C
224        ISTART = IFNBLNK(name)        ISTART = IFNBLNK(name)
225        IEND   = ILNBLNK(name)        IEND   = ILNBLNK(name)
# Line 169  C Line 263  C
263            timerStatus(iTimer,myThreadId) = RUNNING            timerStatus(iTimer,myThreadId) = RUNNING
264            timerStarts(iTimer,myThreadId) =            timerStarts(iTimer,myThreadId) =
265       &       timerStarts(iTimer,myThreadId)+1       &       timerStarts(iTimer,myThreadId)+1
266    #ifdef USE_PAPI
267    CCE107 PAPI - Read event counts
268              call PAPIF_read(EventSet, values1(1,iTimer,myThreadId), Check)
269    #else
270    #ifdef USE_PCL
271    CCE107 PCL - Read event counts
272              res = PCLread(descr, i_result1(1,iTimer,myThreadId),
273         $         fp_result(1,iTimer,myThreadId), nevents)
274    #endif
275    #endif
276          ENDIF          ENDIF
277    #ifdef USE_LIBHPM
278            CALL f_hpmtstart((myThreadId-1)*100+iTimer,tmpName)
279    #endif
280        ELSEIF ( tmpAction .EQ. STOP ) THEN        ELSEIF ( tmpAction .EQ. STOP ) THEN
281          IF ( iTimer .EQ. 0 ) GOTO 905          IF ( iTimer .EQ. 0 ) GOTO 905
282    #ifdef USE_LIBHPM
283            CALL f_hpmtstop((myThreadId-1)*100+iTimer)
284    #endif
285          IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN          IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN
286    #ifdef USE_PAPI
287    CCE107 PAPI - Read event counts
288              call PAPIF_read(EventSet, values2(1,iTimer,myThreadId), Check)
289    #else
290    #ifdef USE_PCL
291    CCE107 PCL - Read event counts
292              res = PCLread(descr, i_result2(1,iTimer,myThreadId),
293         $         fp_result(1,iTimer,myThreadId), nevents)
294    #endif
295    #endif
296            CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )            CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
297            timerUser(iTimer,myThreadId)    =            timerUser(iTimer,myThreadId)    =
298       &       timerUser(iTimer,myThreadId) +       &       timerUser(iTimer,myThreadId) +
# Line 186  C Line 306  C
306       &       timerWall(iTimer,myThreadId) +       &       timerWall(iTimer,myThreadId) +
307       &                           wallClockTime -       &                           wallClockTime -
308       &                           timerT0Wall(iTimer,myThreadId)       &                           timerT0Wall(iTimer,myThreadId)
309    #ifdef USE_PAPI
310              do i=1,nevents
311                 values(i,iTimer,myThreadId) = values(i,iTimer,myThreadId) +
312         $       values2(i,iTimer,myThreadId) - values1(i,iTimer,myThreadId)
313              enddo
314    #else
315    #ifdef USE_PCL
316              do i=1,nevents
317                 i_result(i,iTimer,myThreadId) = i_result(i,iTimer
318         $            ,myThreadId) + i_result2(i,iTimer,myThreadId) -
319         $            i_result1(i,iTimer,myThreadId)
320              enddo
321    #endif
322    #endif
323            timerStatus(iTimer,myThreadId)  = STOPPED            timerStatus(iTimer,myThreadId)  = STOPPED
324            timerStops (iTimer,myThreadId)  =            timerStops (iTimer,myThreadId)  =
325       &    timerStops (iTimer,myThreadId)+1       &    timerStops (iTimer,myThreadId)+1
326          ENDIF          ENDIF
327    #if defined (USE_PAPI) || defined (USE_PCL_FLOPS_SFP) || defined(USE_PCL_FLOPS) || defined(USE_PCL)
328          ELSEIF ( tmpAction .EQ. INIT ) THEN
329    #ifdef USE_PAPI
330    CCE107 PAPI - Check PAPI version, find the maximum number of events and
331    C      initialize the library, read the suggested events and create
332    C      EventSet, prepare counter for use
333             Check = PAPI_VER_CURRENT
334             call PAPIF_library_init(Check)
335             if (Check .NE. PAPI_VER_CURRENT) then
336                WRITE(msgBuffer,*) "PAPI Library Version is out of Date"
337                CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
338         &           SQUEEZE_RIGHT,myThreadId)
339                CALL ABORT
340             endif
341             call PAPIF_num_counters(neventsmax)
342             if (neventsmax .GT. nmaxevents) then
343                WRITE(msgBuffer,*) "Fix the nmaxevents in the code to ",
344         $           neventsmax
345                CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
346         &           SQUEEZE_RIGHT,myThreadId)
347                CALL ABORT
348             endif
349             _BEGIN_MASTER(myThreadId)
350             CALL mdsFindUnit (papiunit, myThreadId)
351             OPEN(UNIT=papiunit,FILE='data.papi',STATUS='OLD')
352            read(papiunit,*) nevents
353    C       reset to reasonable values
354            if (nevents .gt. neventsmax) then
355               nevents = neventsmax
356               WRITE(msgBuffer,*)
357         $          "resetting the number of PAPI events to the maximum"
358               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
359         &          SQUEEZE_RIGHT,myThreadId)
360            endif
361            do i = 1,nevents
362               read(papiunit,*) EventName
363               if ((EventName .eq. 'PAPI_FLOPS') .or.
364         $          (EventName .eq. 'PAPI_IPS')) then
365                  WRITE(msgBuffer,*) "Abort! Rate events are not supported:"
366         $             ,EventName
367                  CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
368         &             SQUEEZE_RIGHT,myThreadId)
369                  CALL ABORT
370               endif
371    
372               call PAPIF_event_name_to_code(EventName, EventCode(i), Check)
373            end do
374            close(papiunit)
375            _END_MASTER(myThid)
376            EventSet = PAPI_NULL
377            call PAPIF_create_eventset(EventSet, Check)
378            do i = 1,nevents
379               call PAPIF_add_event(EventSet, EventCode(i), Check)
380               if (Check .NE. PAPI_OK) then
381                  CALL PAPIF_event_code_to_name(EventCode(i), EventName,
382         $             Check)
383                  WRITE(msgBuffer,*) "Abort After PAPIF_add_event: ",
384         $             EventName
385                  CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
386         &             SQUEEZE_RIGHT,myThreadId)
387                  CALL ABORT
388               endif
389            enddo
390    CCE107 - Start counting events
391            call PAPIF_start(EventSet, Check)
392    #else
393    #if defined(USE_PCL_FLOPS_SFP) || defined(USE_PCL_FLOPS) || defined(USE_PCL)
394    CCE107 PCL - initialize the library, read the suggested events
395    C      and check them
396            res = PCLinit(descr)
397    
398    #ifdef USE_PCL
399            _BEGIN_MASTER(myThreadId)
400            CALL mdsFindUnit (pclunit, myThreadId)
401            OPEN(UNIT=pclunit,FILE='data.pcl',STATUS='OLD')
402            read(pclunit,*) nevents
403    C     reset to reasonable values
404            if (nevents .gt. nmaxevents) then
405               nevents = nmaxevents
406               WRITE(msgBuffer,*)
407         $          "resetting the number of PCL events to the maximum"
408               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
409         &          SQUEEZE_RIGHT,myThreadId)
410            endif
411            do i = 1,nevents
412               read(pclunit,*) pcl_counter_list(i)
413               if ((pcl_counter_list(i) .ge. PCL_MFLOPS) .or.
414         $          (pcl_counter_list(i) .lt. 1)) then
415                  if ((pcl_counter_list(i) .ge. PCL_MFLOPS) .and.
416         $             (pcl_counter_list(i) .le. nmaxevents)) then
417                     WRITE(msgBuffer,*)
418         $                "Abort! Rate events are not relevant:",
419         $                pcl_counter_name(pcl_counter_list(i))
420                  else
421                     WRITE(msgBuffer,*)
422         $                "Abort! Events are not defined:",
423         $                pcl_counter_list(i)
424                  endif
425                  CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
426         &             SQUEEZE_RIGHT,myThreadId)
427                  CALL ABORT
428               endif
429            enddo
430            close(pclunit)
431            _END_MASTER(myThid)
432    
433            do i = 1,nevents
434    CCE107 check to see that event are supported in the order asked
435               res = PCLquery(descr, pcl_counter_list, i, flags)
436               IF(res .NE. PCL_SUCCESS) THEN
437                  WRITE(msgBuffer,*) "Abort! No support when adding event: "
438         $             , pcl_counter_name(pcl_counter_list(i))
439                  CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
440         &             SQUEEZE_RIGHT,myThreadId)
441                  CALL ABORT
442               endif
443            enddo
444    #else
445            do i = 1,5
446    CCE107 check to see which rate events are supported.
447               res = PCLquery(descr, pcl_counter_list, nevents+1, flags)
448               if ((res .ne. PCL_SUCCESS) .and. (i .lt. 5)) then
449                  pcl_counter_list(nevents+1) = alt_counter_list(i+1)
450               else
451                  if (i .lt. 5) then
452                     nevents = nevents + 1
453                  endif
454               endif
455            enddo
456            if (nevents .eq. 0) then
457               WRITE(msgBuffer,*)
458         $          "No PCL rate events supported: Please recompile!"
459               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
460         &          SQUEEZE_RIGHT,myThreadId)
461               CALL ABORT
462            endif
463    #endif
464    
465    CCE107 - Start counting events
466            res = PCLstart(descr, pcl_counter_list, nevents, flags)
467            IF(res .NE. PCL_SUCCESS) THEN
468               WRITE(msgBuffer,*) "PCL counting failed - please recompile!"
469               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
470         &          SQUEEZE_RIGHT,myThreadId)
471               CALL ABORT
472            ENDIF
473    #endif
474    #endif
475    #endif
476        ELSEIF ( tmpAction .EQ. PRINT ) THEN        ELSEIF ( tmpAction .EQ. PRINT ) THEN
477          IF ( iTimer .EQ. 0 ) GOTO 905          IF ( iTimer .EQ. 0 ) GOTO 905
478          WRITE(msgBuffer,*)          WRITE(msgBuffer,*)
# Line 218  C Line 501  C
501       &  timerStops(iTimer,myThreadId)       &  timerStops(iTimer,myThreadId)
502          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
503       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
504    #ifdef USE_PAPI
505            do i = 1,nevents
506               call PAPIF_event_code_to_name(EventCode(i), EventName, Check)
507               WRITE(msgBuffer,71) Eventname,
508         $          values(i,iTimer,myThreadId)/timerUser(iTimer,myThreadId)
509         $          ,values(i,iTimer,myThreadId)/timerWall(iTimer,myThreadId
510         $          ),1.D0*values(i,iTimer,myThreadId)
511               CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
512         &          SQUEEZE_RIGHT,myThreadId)
513            enddo
514    #else
515    #ifdef USE_PCL
516            do i = 1,nevents
517               WRITE(msgBuffer,71) pcl_counter_name(pcl_counter_list(i)),
518         $          i_result(i,iTimer,myThreadId)/timerUser(iTimer
519         $          ,myThreadId),i_result(i,iTimer,myThreadId)
520         $          /timerWall(iTimer,myThreadId),1.D0*i_result(i,iTimer
521         $          ,myThreadId)
522               CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
523         &          SQUEEZE_RIGHT,myThreadId)
524            enddo
525    #endif
526    #endif
527        ELSEIF ( tmpAction .EQ. PRINTALL ) THEN        ELSEIF ( tmpAction .EQ. PRINTALL ) THEN
528          DO 10 I = 1, nTimers(myThreadId)          DO 10 I = 1, nTimers(myThreadId)
529           WRITE(msgBuffer,*) ' Seconds in section "',           WRITE(msgBuffer,*) ' Seconds in section "',
# Line 245  C Line 551  C
551       &  timerStops(I,myThreadId)       &  timerStops(I,myThreadId)
552           CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,           CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
553       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
554    #ifdef USE_PAPI
555            do j = 1,nevents
556               call PAPIF_event_code_to_name(EventCode(j), EventName, Check)
557               WRITE(msgBuffer,71) Eventname,
558         $          values(j,I,myThreadId)/timerUser(I,myThreadId),
559         $          values(j,I,myThreadId)/timerWall(I,myThreadId),
560         $          1.D0*values(j,I,myThreadId)
561               CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
562         &          SQUEEZE_RIGHT,myThreadId)
563            enddo
564    #else
565    #ifdef USE_PCL
566            do j = 1,nevents
567               WRITE(msgBuffer,71) pcl_counter_name(pcl_counter_list(j)),
568         $          i_result(j,I,myThreadId)/timerUser(I,myThreadId)
569         $          ,i_result(j,I,myThreadId)/timerWall(I,myThreadId),1.D0
570         $          *i_result(j,I,myThreadId)
571               CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
572         &          SQUEEZE_RIGHT,myThreadId)
573            enddo
574    #endif
575    #endif
576     10   CONTINUE     10   CONTINUE
577        ELSE        ELSE
578          GOTO 903          GOTO 903
# Line 256  C Line 584  C
584    901 CONTINUE    901 CONTINUE
585        WRITE(msgBuffer,'(A)')        WRITE(msgBuffer,'(A)')
586       &'                                                       '       &'                                                       '
587        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
588       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
589        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
590       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
591        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
592       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
593        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
594       &'procedure: "',callProc,'".'       &'procedure: "',callProc,'".'
595        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
596       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
597        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
598       &'Timer name "',name(ISTART:IEND),'" is invalid.'       &'Timer name "',name(ISTART:IEND),'" is invalid.'
599        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
600       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
601        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
602       &' Names must have fewer than',maxString+1,' characters.'       &' Names must have fewer than',maxString+1,' characters.'
603        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
604       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
605        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
606       &'*******************************************************'       &'*******************************************************'
607        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
608       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
609        GOTO 1000        GOTO 1000
610    902 CONTINUE    902 CONTINUE
611        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
612       &'                                                       '       &'                                                       '
613        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
614       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
615        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
616       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
617        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
618       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
619        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
620       &'procedure: "',callProc,'".'       &'procedure: "',callProc,'".'
621        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
622       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
623        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
624       &' No timer action specified.'       &' No timer action specified.'
625        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
626       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
627        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
628       &' Valid actions are:'       &' Valid actions are:'
629        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
630       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
631        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
632       &' "START", "STOP", "PRINT" and "PRINTALL".'       &' "START", "STOP", "PRINT" and "PRINTALL".'
633        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
634       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
635        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
636       &'*******************************************************'       &'*******************************************************'
637        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
638       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
639        GOTO 1000        GOTO 1000
640    903 CONTINUE    903 CONTINUE
641        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
642       &'                                                       '       &'                                                       '
643        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
644       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
645        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
646       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
647        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
648       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
649        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
650       &'procedure: "',callProc,'".'       &'procedure: "',callProc,'".'
651        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
652       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
653        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
654       &'Timer action"',name(ISTART:IEND),'" is invalid.'       &'Timer action"',name(ISTART:IEND),'" is invalid.'
655        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
656       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
657        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
658       &' Valid actions are:'       &' Valid actions are:'
659        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
660       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
661        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
662       &' "START", "STOP", "PRINT" and "PRINTALL".'       &' "START", "STOP", "PRINT" and "PRINTALL".'
663        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
664       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
665        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
666       &'*******************************************************'       &'*******************************************************'
667        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
668       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
669        GOTO 1000        GOTO 1000
670    904 CONTINUE    904 CONTINUE
671        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
672       &'                                                       '       &'                                                       '
673        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
674       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
675        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
676       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
677        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
678       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
679        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
680       &'procedure: "',callProc,'".'       &'procedure: "',callProc,'".'
681        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
682       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
683        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
684       &'Timer "',name(ISTART:IEND),'" cannot be created.'       &'Timer "',name(ISTART:IEND),'" cannot be created.'
685        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
686       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
687        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
688       &' Only ',maxTimers,' timers are allowed.'       &' Only ',maxTimers,' timers are allowed.'
689        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
690       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
691        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
692       &'*******************************************************'       &'*******************************************************'
693        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
694       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
695        GOTO 1000        GOTO 1000
696    905 CONTINUE    905 CONTINUE
697        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
698       &'                                                       '       &'                                                       '
699        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
700       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
701        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
702       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'       &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
703        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
704       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
705        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
706       &'procedure: "',callProc,'".'       &'procedure: "',callProc,'".'
707        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
708       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
709        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
710       &'Timer name is blank.'       &'Timer name is blank.'
711        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
712       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
713        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
714       &' A name must be used with "START", "STOP" or  "PRINT".'       &' A name must be used with "START", "STOP" or  "PRINT".'
715        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
716       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
717        WRITE(msgBuffer,*)        WRITE(msgBuffer,*)
718       &'*******************************************************'       &'*******************************************************'
719        CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,        CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
720       &  SQUEEZE_RIGHT,myThreadId)       &  SQUEEZE_RIGHT,myThreadId)
721        GOTO 1000        GOTO 1000
722    
723     71   FORMAT(A,' per sec ',D13.7,' ',D13.7,', number ', D13.7)
724     72   FORMAT(A,D13.7)
725        END        END
726    
727  CStartOfInterface  CBOP
728        SUBROUTINE TIMER_GET_TIME(  C     !ROUTINE: TIMER_GET_TIME
729       O                           userTime,  
730       O                           systemTime,  C     !INTERFACE:
731          SUBROUTINE TIMER_GET_TIME(    
732         O                           userTime,    
733         O                           systemTime,    
734       O                           wallClockTime )       O                           wallClockTime )
735  C     /==========================================================\        IMPLICIT NONE
736  C     | SUBROUTINE TIMER_GET_TIME                                |  
737  C     | o Query system timer routines.                           |  C     !DESCRIPTION:
738  C     |==========================================================|  C     *==========================================================*
739  C     | Routine returns total elapsed time for program so far.   |  C     | SUBROUTINE TIMER\_GET\_TIME                                
740  C     | Three times are returned that conventionally are used as |  C     | o Query system timer routines.                            
741  C     | user time, system time and wall-clock time. Not all these|  C     *==========================================================*
742  C     | numbers are available on all machines.                   |  C     | Routine returns total elapsed time for program so far.    
743  C     \==========================================================/  C     | Three times are returned that conventionally are used as  
744    C     | user time, system time and wall-clock time. Not all these
745    C     | numbers are available on all machines.                    
746    C     *==========================================================*
747    
748    C     !INPUT/OUTPUT PARAMETERS:
749    C     userTime      :: User time returned
750    C     systemTime    :: System time returned
751    C     wallClockTime :: Wall clock time returned
752    
753        Real*8 userTime        Real*8 userTime
754        Real*8 systemTime        Real*8 systemTime
755        Real*8 wallClockTime        Real*8 wallClockTime
756  CEndOfInterface  
757        Real*4 ETIME, ACTUAL, TARRAY(2)  C     The following was seriously hacked around by Mark Hadfield
758        EXTERNAL ETIME  C     October 2006
759    
760    #ifdef IGNORE_TIME
761    
762          userTime = 0.
763          systemTime = 0.
764          wallClockTime = 0.
765    
766    #else
767    
768    C     Declarations follow the same preprocessor structure as the
769    C     executable code below.
770    
771    # ifdef TARGET_AIX
772          Real*4 etime_
773          Real*8 timenow
774          external etime_, timenow
775          Real*4 actual, tarray(2)
776    # elif (defined TARGET_T3E || defined TARGET_CRAY_VECTOR)
777         real second, secondr
778         external second, secondr
779    # else
780    #  ifdef HAVE_ETIME
781          Real*4 etime
782          EXTERNAL etime
783          Real*4 actual, tarray(2)
784    #  else
785          Real*8 csystemtime, cusertime
786          external csystemtime, cusertime
787    #  endif
788    #  if defined HAVE_CLOC
789        Real*8 wtime        Real*8 wtime
790  C     Real*8 MPI_Wtime  #  elif (defined (ALLOW_USE_MPI) && defined (USE_MPI_WTIME))
791  C     EXTERNAL MPI_Wtime  C     No declarations necessary
792    #  else
793          Real*8 timenow
794          external timenow
795    #  endif /* HAVE_CLOC */
796    # endif
797    CEOP
798    
799        ACTUAL = ETIME(TARRAY)  C     Executable code
       
       userTime      = TARRAY(1)  
       systemTime    = TARRAY(2)  
       CALL CLOC(wTime)  
       wallClockTime = wtime  
800    
801  #ifdef ALLOW_USE_MPI  # ifdef TARGET_AIX
802  C     wtime         = MPI_Wtime()        actual = ETIME_(tarray)
803  C     wallClockTime = wtime        userTime      = tarray(1)
804  #endif /* ALLOW_USE_MPI */        systemTime    = tarray(2)
805  #ifndef ALLOW_USE_MPI        wallClockTime = timenow()
806  C     wallClockTime = 0.  # elif (defined (TARGET_T3E) || defined (TARGET_CRAY_VECTOR))
807          userTime      = SECOND()
808          systemTime    = 0.
809          wallClockTime = SECONDR()
810    # else
811    #  ifdef HAVE_ETIME
812          actual = etime(tarray)
813          userTime = tarray(1)
814          systemTime = tarray(2)
815    #  else
816          userTime   = cusertime()
817          systemTime = csystemtime()
818    #  endif
819    #  if defined HAVE_CLOC
820          CALL cloc(wTime)
821          wallClockTime = wtime
822    #  elif (defined (ALLOW_USE_MPI) && defined (USE_MPI_WTIME))
823          wallClockTime = MPI_Wtime()
824    #  else      
825          wallClockTime = timenow()
826    #  endif
827    # endif
828  #endif  #endif
829          
830        RETURN        RETURN
831        END        END
832        
833    
834    
835    
836    CBOP
837    
838  CStartOfInterface  C     !ROUTINE: TIMER_PRINTALL
839    
840    C     !INTERFACE:
841        SUBROUTINE TIMER_PRINTALL( myThreadId )        SUBROUTINE TIMER_PRINTALL( myThreadId )
842  C     /==========================================================\        IMPLICIT NONE
843  C     | SUBROUTINE TIMER_PRINTALL                                |  
844  C     | o Print timer information                                |  C     !DESCRIPTION:
845  C     |==========================================================|  C     *==========================================================*
846  C     | Request print out of table of timing from all timers.    |  C     | SUBROUTINE TIMER\_PRINTALL                                
847  C     \==========================================================/  C     | o Print timer information                                
848    C     *==========================================================*
849    C     | Request print out of table of timing from all timers.    
850    C     *==========================================================*
851    
852    C     !INPUT PARAMETERS:
853    C     myThreadId :: This threads number
854        INTEGER myThreadId        INTEGER myThreadId
855  CEndOfInterface  CEOP
856  C     Print out value for every timer.  
 C  
857        CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,        CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,
858       &                   myThreadId )       &                   myThreadId )
859  C  C
860        RETURN        RETURN
861        END        END
862  C***********************************************************************  
863    CBOP
864    C     !ROUTINE: TIMER_START
865    
866    C     !INTERFACE:
867        SUBROUTINE TIMER_START ( string , myThreadId )        SUBROUTINE TIMER_START ( string , myThreadId )
868  C     Return start timer named "string".        IMPLICIT NONE
869    
870    C     !DESCRIPTION:
871    C     Start timer named "string".
872    
873    C     !INPUT PARAMETERS:
874    C     string     :: Name of timer
875    C     myThreadId :: My thread number
876        CHARACTER*(*) string        CHARACTER*(*) string
877        INTEGER myThreadId        INTEGER myThreadId
878    CEOP
879  C  C
880        CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)        CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)
881  C  C
882        RETURN        RETURN
883        END        END
884  C***********************************************************************  CBOP
885        SUBROUTINE TIMER_STOP  ( string , myThreadId)  C     !ROUTINE: TIMER_STOP
886  C     Return start timer named "string".  
887    C     !INTERFACE:
888          SUBROUTINE TIMER_STOP  ( string , myThreadId )
889          IMPLICIT NONE
890    
891    C     !DESCRIPTION:
892    C     Stop timer named "string".
893    
894    C     !INPUT PARAMETERS:
895    C     string     :: Name of timer
896    C     myThreadId :: My thread number
897        CHARACTER*(*) string        CHARACTER*(*) string
898        INTEGER myThreadId        INTEGER myThreadId
899    CEOP
900  C  C
901        CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )        CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )
902  C  C
903        RETURN        RETURN
904        END        END
905  C***********************************************************************  C***********************************************************************
906    
907    #ifdef USE_PAPI
908    CCE107 Initialization of common block for PAPI timers
909          BLOCK DATA setpapivalues
910    #include "EEPARAMS.h"
911          INTEGER maxTimers
912          PARAMETER (maxTimers = 40)
913          INTEGER nmaxevents
914          PARAMETER (nmaxevents = 18)
915          INTEGER size
916          PARAMETER (size = 3*nmaxevents*maxTimers*MAX_NO_THREADS)
917          INTEGER*8 values(nmaxevents, maxTimers , MAX_NO_THREADS),
918         $     values1(nmaxevents, maxTimers, MAX_NO_THREADS),
919         $     values2(nmaxevents, maxTimers, MAX_NO_THREADS)
920          COMMON /papivalues/ values, values1, values2
921          DATA values, values1, values2 /size*0/
922          END
923    #endif
924    #if defined(USE_PCL_FLOPS_SFP) || defined(USE_PCL_FLOPS) || defined(USE_PCL)
925    CCE107 Initialization of common block for PCL event names
926          BLOCK DATA setpclnames
927          INTEGER nmaxevents
928          PARAMETER (nmaxevents = 61)
929          CHARACTER*22 pcl_counter_name(0:nmaxevents-1)
930          COMMON /pclnames/ pcl_counter_name
931          DATA pcl_counter_name(0) /'PCL_L1CACHE_READ'/
932          DATA pcl_counter_name(1) /'PCL_L1CACHE_WRITE'/
933          DATA pcl_counter_name(2) /'PCL_L1CACHE_READWRITE'/
934          DATA pcl_counter_name(3) /'PCL_L1CACHE_HIT'/
935          DATA pcl_counter_name(4) /'PCL_L1CACHE_MISS'/
936          DATA pcl_counter_name(5) /'PCL_L1DCACHE_READ'/
937          DATA pcl_counter_name(6) /'PCL_L1DCACHE_WRITE'/
938          DATA pcl_counter_name(7) /'PCL_L1DCACHE_READWRITE'/
939          DATA pcl_counter_name(8) /'PCL_L1DCACHE_HIT'/
940          DATA pcl_counter_name(9) /'PCL_L1DCACHE_MISS'/
941          DATA pcl_counter_name(10) /'PCL_L1ICACHE_READ'/
942          DATA pcl_counter_name(11) /'PCL_L1ICACHE_WRITE'/
943          DATA pcl_counter_name(12) /'PCL_L1ICACHE_READWRITE'/
944          DATA pcl_counter_name(13) /'PCL_L1ICACHE_HIT'/
945          DATA pcl_counter_name(14) /'PCL_L1ICACHE_MISS'/
946          DATA pcl_counter_name(15) /'PCL_L2CACHE_READ'/
947          DATA pcl_counter_name(16) /'PCL_L2CACHE_WRITE'/
948          DATA pcl_counter_name(17) /'PCL_L2CACHE_READWRITE'/
949          DATA pcl_counter_name(18) /'PCL_L2CACHE_HIT'/
950          DATA pcl_counter_name(19) /'PCL_L2CACHE_MISS'/
951          DATA pcl_counter_name(20) /'PCL_L2DCACHE_READ'/
952          DATA pcl_counter_name(21) /'PCL_L2DCACHE_WRITE'/
953          DATA pcl_counter_name(22) /'PCL_L2DCACHE_READWRITE'/
954          DATA pcl_counter_name(23) /'PCL_L2DCACHE_HIT'/
955          DATA pcl_counter_name(24) /'PCL_L2DCACHE_MISS'/
956          DATA pcl_counter_name(25) /'PCL_L2ICACHE_READ'/
957          DATA pcl_counter_name(26) /'PCL_L2ICACHE_WRITE'/
958          DATA pcl_counter_name(27) /'PCL_L2ICACHE_READWRITE'/
959          DATA pcl_counter_name(28) /'PCL_L2ICACHE_HIT'/
960          DATA pcl_counter_name(29) /'PCL_L2ICACHE_MISS'/
961          DATA pcl_counter_name(30) /'PCL_TLB_HIT'/
962          DATA pcl_counter_name(31) /'PCL_TLB_MISS'/
963          DATA pcl_counter_name(32) /'PCL_ITLB_HIT'/
964          DATA pcl_counter_name(33) /'PCL_ITLB_MISS'/
965          DATA pcl_counter_name(34) /'PCL_DTLB_HIT'/
966          DATA pcl_counter_name(35) /'PCL_DTLB_MISS'/
967          DATA pcl_counter_name(36) /'PCL_CYCLES'/
968          DATA pcl_counter_name(37) /'PCL_ELAPSED_CYCLES'/
969          DATA pcl_counter_name(38) /'PCL_INTEGER_INSTR'/
970          DATA pcl_counter_name(39) /'PCL_FP_INSTR'/
971          DATA pcl_counter_name(40) /'PCL_LOAD_INSTR'/
972          DATA pcl_counter_name(41) /'PCL_STORE_INSTR'/
973          DATA pcl_counter_name(42) /'PCL_LOADSTORE_INSTR'/
974          DATA pcl_counter_name(43) /'PCL_INSTR'/
975          DATA pcl_counter_name(44) /'PCL_JUMP_SUCCESS'/
976          DATA pcl_counter_name(45) /'PCL_JUMP_UNSUCCESS'/
977          DATA pcl_counter_name(46) /'PCL_JUMP'/
978          DATA pcl_counter_name(47) /'PCL_ATOMIC_SUCCESS'/
979          DATA pcl_counter_name(48) /'PCL_ATOMIC_UNSUCCESS'/
980          DATA pcl_counter_name(49) /'PCL_ATOMIC'/
981          DATA pcl_counter_name(50) /'PCL_STALL_INTEGER'/
982          DATA pcl_counter_name(51) /'PCL_STALL_FP'/
983          DATA pcl_counter_name(52) /'PCL_STALL_JUMP'/
984          DATA pcl_counter_name(53) /'PCL_STALL_LOAD'/
985          DATA pcl_counter_name(54) /'PCL_STALL_STORE'/
986          DATA pcl_counter_name(55) /'PCL_STALL'/
987          DATA pcl_counter_name(56) /'PCL_MFLOPS'/
988          DATA pcl_counter_name(57) /'PCL_IPC'/
989          DATA pcl_counter_name(58) /'PCL_L1DCACHE_MISSRATE'/
990          DATA pcl_counter_name(59) /'PCL_L2DCACHE_MISSRATE'/
991          DATA pcl_counter_name(60) /'PCL_MEM_FP_RATIO'/
992          END
993    
994    
995    #ifdef USE_PCL
996    CCE107 Initialization of common block for PCL summary performance
997          BLOCK DATA setpcls
998    #include "EEPARAMS.h"
999          INTEGER maxTimers
1000          PARAMETER (maxTimers = 40)
1001          INTEGER nmaxevents
1002          PARAMETER (nmaxevents = 61)
1003          INTEGER size
1004          PARAMETER (size = nmaxevents*maxTimers*MAX_NO_THREADS)
1005          INTEGER PCL_CYCLES, PCL_MODE_USER_SYSTEM
1006          PARAMETER (PCL_CYCLES=36, PCL_MODE_USER_SYSTEM=3)
1007          INTEGER pcl_counter_list(nmaxevents)
1008          INTEGER flags, nevents
1009          INTEGER*8 i_result(nmaxevents, maxTimers, MAX_NO_THREADS)
1010          INTEGER*8 i_result1(nmaxevents, maxTimers, MAX_NO_THREADS)
1011          INTEGER*8 i_result2(nmaxevents, maxTimers, MAX_NO_THREADS)
1012          INTEGER*8 descr
1013          REAL*8 fp_result(nmaxevents, maxTimers, MAX_NO_THREADS)
1014          COMMON /pclvars/ i_result, descr, fp_result, pcl_counter_list,
1015         $     flags, nevents
1016          DATA fp_result /size*0.0D0/
1017          DATA i_result /size*0/
1018          DATA i_result1 /size*0/
1019          DATA i_result2 /size*0/
1020          DATA descr /0/
1021          DATA nevents /nmaxevents/
1022          DATA pcl_counter_list /nmaxevents*PCL_CYCLES/
1023          DATA flags /PCL_MODE_USER_SYSTEM/
1024          END
1025    #else
1026    CCE107 Initialization of common block for PCL summary performance
1027          BLOCK DATA setpcls
1028          INTEGER PCL_MFLOPS, PCL_IPC, PCL_L1DCACHE_MISSRATE,
1029         $     PCL_L2DCACHE_MISSRATE, PCL_MEM_FP_RATIO
1030          PARAMETER (PCL_MFLOPS=56, PCL_IPC=57, PCL_L1DCACHE_MISSRATE=58,
1031         $     PCL_L2DCACHE_MISSRATE=59, PCL_MEM_FP_RATIO=60)
1032          INTEGER PCL_MODE_USER_SYSTEM
1033          PARAMETER (PCL_MODE_USER_SYSTEM=3)
1034          INTEGER pcl_counter_list(5), flags, nevents
1035          INTEGER*8 i_result(5), descr
1036          REAL*8 fp_result(5)
1037          COMMON /pclvars/ i_result, descr, fp_result, pcl_counter_list,
1038         $     flags, nevents
1039          DATA fp_result /5*0.0D0/
1040          DATA i_result /5*0/
1041          DATA descr /0/
1042          DATA nevents /0/
1043          DATA pcl_counter_list /PCL_MFLOPS, PCL_IPC, PCL_L1DCACHE_MISSRATE,
1044         $     PCL_L2DCACHE_MISSRATE, PCL_MEM_FP_RATIO/
1045          DATA flags /PCL_MODE_USER_SYSTEM/
1046          END
1047    #endif
1048    #endif

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.25

  ViewVC Help
Powered by ViewVC 1.1.22