[MITgcm-support] A small patch in timers.F and genmake2 to fix a slight problem about etime

Jinxuan Zhu zhujinxuan at gmail.com
Sun Nov 22 21:17:37 EST 2015


Is there something about the ifort version on that node?

Then I can check whether the etime usage is a little different on that
version of intel compiler.


On Fri, Nov 20, 2015 at 1:04 PM, Jean-Michel Campin <jmc at ocean.mit.edu>
wrote:

> Hi Jinxuan,
>
> It looks like it's going to take more time since it's causing problems
> on some 32 bits machine with some ifort compiler:
> Tried yesterday causing this one to fail:
> http://mitgcm.org/testing/results/2015_11/tr_octopus_20151119_0/summary.txt
>
> Cheers,
> Jean-Michel
>
> On Thu, Nov 19, 2015 at 07:03:29PM -0500, Jean-Michel Campin wrote:
> > Hi Jinxuan,
> >
> > Thanks for providing this patch, and yes, you are welcome to send
> > to this list this type of information.
> > In the next few days, we will add your changes into the CVS repository.
> >
> > Cheers,
> > Jean-Michel
> >
> > On Thu, Nov 19, 2015 at 12:53:18AM -0500, Jinxuan Zhu wrote:
> > > I have just noticed that etime is not used in MITgcm because of a
> old-style
> > > fortran writing.  So I make a small change in genmake2 and timers.F to
> fix
> > > it.
> > > The fixed file is attached below.  I guess you may be interested about
> this
> > > small fix.  (fix tested on ifort and gfortran)
> > >
> > > Fixes are based on
> > > https://gcc.gnu.org/onlinedocs/gfortran/ETIME.html
> > > https://gcc.gnu.org/ml/fortran/2007-03/msg00305.html
> > >
> > > I am not sure whether I shall post this email here. Please forgive me
> if I
> > > email it at the wrong place.
> > >
> > >
> > > By the way, if for some reason the 'External' keyword must be kept, it
> can
> > > be also written as `Real*4 External etime` to declare the etime
> > >
> > >
> > > Thank you,
> > > Jinxuan Zhu (zhujinxuan at gmail.com, jinxuan_zhu at brown.edu)
> >
> > > C $Header: /u/gcmpack/MITgcm/eesupp/src/timers.F,v 1.30 2014/01/19
> 14:33:43 jmc Exp $
> > > C $Name:  $
> > >
> > > #include "CPP_EEOPTIONS.h"
> > > #ifdef USE_LIBHPM
> > > # include "f_hpm.h"
> > > #endif
> > >
> > > C--   File utils.F: General purpose support routines
> > > C--    Contents
> > > C--   TIMER_INDEX     - Returns index associated with timer name.
> > > C-- M TIMER_CONTROL   - Implements timer functions for given machine.
> > > C--   TIMER_PRINT     - Print CPU timer statitics.
> > > C--   TIMER_PRINTALL  - Prints all CPU timers statistics.
> > > C--   TIMER_START     - Starts CPU timer for code section.
> > > C--   TIMER_STOP      - Stop CPU tier for code section.
> > > C--   Routines marked "M" contain specific machine dependent code.
> > > C--   Routines marked "U" contain UNIX OS calls.
> > >
> > > CGG   Modified following A. Biastoch for use with SP3. Is backwards
> > > CGG   compatible. G. Gebbie, gebbie at mit.edu, 20 Oct 2001, Scripps.
> > >
> > >
> C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
> > > CBOP
> > > C     !ROUTINE: TIMER_INDEX
> > >
> > > C     !INTERFACE:
> > >       INTEGER FUNCTION TIMER_INDEX (
> > >      I        name,timerNames,maxTimers,nTimers )
> > >       IMPLICIT NONE
> > >
> > > C     !DESCRIPTION:
> > > C     *==========================================================*
> > > C     | FUNCTION TIMER\_INDEX
> > > C     | o Timing support routine.
> > > C     *==========================================================*
> > > C     | Return index in timer data structure of timer named
> > > C     | by the function argument "name".
> > > C     *==========================================================*
> > >
> > > C     !INPUT/OUTPUT PARAMETERS:
> > > C     == Routine arguements ==
> > > C     maxTimers  :: Total number of timers allowed
> > > C     nTimers    :: Current number of timers
> > > C     name       :: Name of timer to find
> > > C     timerNames :: List of valid timer names
> > >       INTEGER maxTimers
> > >       INTEGER nTimers
> > >       CHARACTER*(*) name
> > >       CHARACTER*(*) timerNames(maxTimers)
> > >
> > > C     !LOCAL VARIABLES:
> > > C     == Local variables ==
> > > C     I :: Index variable
> > >       INTEGER I
> > > CEOP
> > > C
> > >       TIMER_INDEX = 0
> > >       IF ( name .EQ. ' ' ) THEN
> > >         TIMER_INDEX = -1
> > >       ELSE
> > >         DO 10 I = 1, nTimers
> > >           IF ( name .NE. timerNames(I) ) GOTO 10
> > >             TIMER_INDEX = I
> > >             GOTO 11
> > >    10   CONTINUE
> > >    11   CONTINUE
> > >       ENDIF
> > >       RETURN
> > >       END
> > >
> > >
> C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
> > > CBOP
> > > C     !ROUTINE: TIMER_CONTROL
> > >
> > > C     !INTERFACE:
> > >       SUBROUTINE TIMER_CONTROL ( name , action , callProc , myThreadId
> )
> > >       IMPLICIT NONE
> > >
> > > C     !DESCRIPTION:
> > > C     *==========================================================*
> > > C     | SUBROUTINE TIMER\_CONTROL                                 |
> > > C     | o Timing routine.                                        |
> > > C     *==========================================================*
> > > C     | User callable interface to timing routines. Timers are   |
> > > C     | created, stopped, started and queried only through this  |
> > > C     | rtouine.                                                 |
> > > C     *==========================================================*
> > >
> > > C     !USES:
> > > #include "SIZE.h"
> > > #include "EEPARAMS.h"
> > > #include "EESUPPORT.h"
> > >       INTEGER  TIMER_INDEX
> > >       INTEGER  IFNBLNK
> > >       INTEGER  ILNBLNK
> > >       EXTERNAL TIMER_INDEX
> > >       EXTERNAL IFNBLNK
> > >       EXTERNAL ILNBLNK
> > >
> > > C     !INPUT/OUTPUT PARAMETERS:
> > > C     name       :: name of the timer
> > > C     action     :: operation to perform with this timer
> > > C     callProc   :: procedure calling this routine
> > > C     myThreadId :: instance number of this thread
> > >       CHARACTER*(*) name
> > >       CHARACTER*(*) action
> > >       CHARACTER*(*) callProc
> > >       INTEGER myThreadId
> > > C
> > > C     !LOCAL VARIABLES:
> > > C     maxTimers :: Total numer of timer allowed
> > > C     maxString :: Max length of a timer name
> > >       INTEGER maxTimers
> > >       INTEGER maxString
> > >       PARAMETER ( maxTimers = 50 )
> > >       PARAMETER ( maxString = 80 )
> > > C     timerStarts :: Timer counters for each timer and each thread
> > > C     timerStops
> > > C     timerUser
> > > C     timerWall
> > > C     timerSys
> > > C     timerT0User
> > > C     timerT0Wall
> > > C     timerT0Sys
> > > C     timerStatus  :: START/STOP/RUNNING Status of the timer
> > > C     timerNameLen :: Length of timer name
> > > C     timerNames   :: Table of timer names
> > > C     nTimers      :: Number of active timers
> > >       INTEGER timerStarts( maxTimers , MAX_NO_THREADS)
> > >       SAVE    timerStarts
> > >       INTEGER timerStops ( maxTimers , MAX_NO_THREADS)
> > >       SAVE    timerStops
> > >       Real*8 timerUser  ( maxTimers , MAX_NO_THREADS)
> > >       SAVE timerUser
> > >       Real*8 timerWall  ( maxTimers , MAX_NO_THREADS)
> > >       SAVE timerWall
> > >       Real*8 timerSys   ( maxTimers , MAX_NO_THREADS)
> > >       SAVE timerSys
> > >       Real*8 timerT0User( maxTimers , MAX_NO_THREADS)
> > >       SAVE timerT0User
> > >       Real*8 timerT0Wall( maxTimers , MAX_NO_THREADS)
> > >       SAVE timerT0Wall
> > >       Real*8 timerT0Sys ( maxTimers , MAX_NO_THREADS)
> > >       SAVE timerT0Sys
> > >       INTEGER timerStatus( maxTimers , MAX_NO_THREADS)
> > >       SAVE    timerStatus
> > >       INTEGER timerNameLen( maxTimers , MAX_NO_THREADS)
> > >       SAVE    timerNameLen
> > >       CHARACTER*(maxString) timerNames( maxTimers , MAX_NO_THREADS)
> > >       SAVE                  timerNames
> > >       INTEGER nTimers(MAX_NO_THREADS)
> > >       CHARACTER*(maxString) tmpName
> > >       CHARACTER*(maxString) tmpAction
> > >       INTEGER iTimer
> > >       INTEGER ISTART
> > >       INTEGER IEND
> > >       INTEGER STOPPED
> > >       PARAMETER ( STOPPED = 0 )
> > >       INTEGER RUNNING
> > >       PARAMETER ( RUNNING = 1 )
> > >       CHARACTER*(*) STOP
> > >       PARAMETER ( STOP = 'STOP' )
> > >       CHARACTER*(*) START
> > >       PARAMETER ( START = 'START' )
> > >       CHARACTER*(*) PRINT
> > >       PARAMETER ( PRINT = 'PRINT' )
> > >       CHARACTER*(*) PRINTALL
> > >       PARAMETER ( PRINTALL = 'PRINTALL' )
> > > #if defined(USE_PAPI) || defined(USE_PCL_FLOPS_SFP) ||
> defined(USE_PCL_FLOPS) || defined (USE_PCL)
> > >       CHARACTER*(*) INIT
> > >       PARAMETER ( INIT = 'INIT' )
> > > #ifdef USE_PAPI
> > >       INTEGER nmaxevents
> > >       PARAMETER (nmaxevents = 18)
> > >       INTEGER neventsmax, nevents
> > >       SAVE neventsmax, nevents
> > >       INTEGER*8 values(nmaxevents, maxTimers , MAX_NO_THREADS),
> > >      $     values1(nmaxevents, maxTimers, MAX_NO_THREADS),
> > >      $     values2(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       COMMON /papivalues/ values, values1, values2
> > > #include <fpapi.h>
> > >       CHARACTER(13) EventName
> > >       INTEGER EventCode(nmaxevents)
> > >       INTEGER Check, EventSet
> > >       INTEGER papiunit
> > >       SAVE EventCode, EventSet
> > >       INTEGER j
> > > #else
> > > #if defined(USE_PCL_FLOPS_SFP) || defined(USE_PCL_FLOPS) ||
> defined(USE_PCL)
> > > #include <pclh.f>
> > >       INTEGER nmaxevents
> > >       PARAMETER (nmaxevents = 61)
> > >       INTEGER flags, res, nevents
> > >       INTEGER*8 descr
> > >       CHARACTER*22 pcl_counter_name(0:nmaxevents-1)
> > > #ifdef USE_PCL
> > >       INTEGER pcl_counter_list(nmaxevents)
> > >       INTEGER*8 i_result(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       INTEGER*8 i_result1(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       INTEGER*8 i_result2(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       REAL*8 fp_result(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       INTEGER j
> > > #else
> > >       INTEGER pcl_counter_list(5), alt_counter_list(5)
> > >       INTEGER*8 i_result(5)
> > >       REAL*8 fp_result(5)
> > >       SAVE alt_counter_list
> > >       DATA alt_counter_list /PCL_MFLOPS, PCL_IPC,
> PCL_L1DCACHE_MISSRATE,
> > >      $     PCL_L2DCACHE_MISSRATE, PCL_MEM_FP_RATIO/
> > > #endif
> > >       COMMON /pclvars/ i_result, descr, fp_result, pcl_counter_list,
> > >      $     flags, nevents
> > >       COMMON /pclnames/ pcl_counter_name
> > >       INTEGER pclunit
> > > #endif
> > > #endif
> > > #endif
> > >       INTEGER I
> > >       Real*8 userTime
> > >       Real*8 systemTime
> > >       Real*8 wallClockTime
> > >       CHARACTER*(MAX_LEN_MBUF) msgBuffer
> > >       DATA nTimers  /MAX_NO_THREADS*0/
> > >       SAVE nTimers
> > > CEOP
> > > C
> > >       ISTART = IFNBLNK(name)
> > >       IEND   = ILNBLNK(name)
> > >       IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 901
> > >       IF ( ISTART .NE. 0 ) THEN
> > >         tmpName = name(ISTART:IEND)
> > >         CALL UCASE( tmpName )
> > >       ELSE
> > >         tmpName = ' '
> > >       ENDIF
> > >       ISTART = IFNBLNK(action)
> > >       IEND   = ILNBLNK(action)
> > >       IF ( ISTART            .EQ. 0         ) GOTO 902
> > >       IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 903
> > >       tmpAction = action(ISTART:IEND)
> > >       CALL UCASE( tmpAction )
> > > C
> > >       iTimer=TIMER_INDEX(tmpName,timerNames(1,myThreadId),
> > >      &       maxTimers,nTimers(myThreadId))
> > > C
> > >       IF     ( tmpAction .EQ. START ) THEN
> > >         IF ( iTimer .EQ. 0 ) THEN
> > >           IF ( nTimers(myThreadId) .EQ. maxTimers ) GOTO 904
> > >             nTimers(myThreadId) = nTimers(myThreadId) + 1
> > >             iTimer  = nTimers(myThreadId)
> > >             timerNames(iTimer,myThreadId)    = tmpName
> > >             timerNameLen(iTimer,myThreadId)  =
> > >      &       ILNBLNK(tmpName)-IFNBLNK(tmpName)+1
> > >             timerUser(iTimer,myThreadId)     = 0.
> > >             timerSys (iTimer,myThreadId)     = 0.
> > >             timerWall(iTimer,myThreadId)     = 0.
> > >             timerStarts(iTimer,myThreadId)   = 0
> > >             timerStops (iTimer,myThreadId)   = 0
> > >             timerStatus(iTimer,myThreadId)   = STOPPED
> > >         ENDIF
> > >         IF ( timerStatus(iTimer,myThreadId) .NE. RUNNING ) THEN
> > >           CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
> > >           timerT0User(iTimer,myThreadId) = userTime
> > >           timerT0Sys(iTimer,myThreadId)  = systemTime
> > >           timerT0Wall(iTimer,myThreadId) = wallClockTime
> > >           timerStatus(iTimer,myThreadId) = RUNNING
> > >           timerStarts(iTimer,myThreadId) =
> > >      &       timerStarts(iTimer,myThreadId)+1
> > > #ifdef USE_PAPI
> > > CCE107 PAPI - Read event counts
> > >           call PAPIF_read(EventSet, values1(1,iTimer,myThreadId),
> Check)
> > > #else
> > > #ifdef USE_PCL
> > > CCE107 PCL - Read event counts
> > >           res = PCLread(descr, i_result1(1,iTimer,myThreadId),
> > >      $         fp_result(1,iTimer,myThreadId), nevents)
> > > #endif
> > > #endif
> > >         ENDIF
> > > #ifdef USE_LIBHPM
> > > #ifdef TARGET_BGL
> > >         CALL f_hpmstart((myThreadId-1)*100+iTimer,tmpName)
> > > #else
> > >         CALL f_hpmtstart((myThreadId-1)*100+iTimer,tmpName)
> > > #endif
> > > #endif
> > >       ELSEIF ( tmpAction .EQ. STOP ) THEN
> > >         IF ( iTimer .EQ. 0 ) GOTO 905
> > > #ifdef USE_LIBHPM
> > > #ifdef TARGET_BGL
> > >         CALL f_hpmstop((myThreadId-1)*100+iTimer)
> > > #else
> > >         CALL f_hpmtstop((myThreadId-1)*100+iTimer)
> > > #endif
> > > #endif
> > >         IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN
> > > #ifdef USE_PAPI
> > > CCE107 PAPI - Read event counts
> > >           call PAPIF_read(EventSet, values2(1,iTimer,myThreadId),
> Check)
> > > #else
> > > #ifdef USE_PCL
> > > CCE107 PCL - Read event counts
> > >           res = PCLread(descr, i_result2(1,iTimer,myThreadId),
> > >      $         fp_result(1,iTimer,myThreadId), nevents)
> > > #endif
> > > #endif
> > >           CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
> > >           timerUser(iTimer,myThreadId)    =
> > >      &       timerUser(iTimer,myThreadId) +
> > >      &                           userTime          -
> > >      &                           timerT0User(iTimer,myThreadId)
> > >           timerSys (iTimer,myThreadId)    =
> > >      &       timerSys(iTimer,myThreadId) +
> > >      &                           systemTime -
> > >      &                           timerT0Sys(iTimer,myThreadId)
> > >           timerWall(iTimer,myThreadId)    =
> > >      &       timerWall(iTimer,myThreadId) +
> > >      &                           wallClockTime -
> > >      &                           timerT0Wall(iTimer,myThreadId)
> > > #ifdef USE_PAPI
> > >           do i=1,nevents
> > >              values(i,iTimer,myThreadId) = values(i,iTimer,myThreadId)
> +
> > >      $       values2(i,iTimer,myThreadId) -
> values1(i,iTimer,myThreadId)
> > >           enddo
> > > #else
> > > #ifdef USE_PCL
> > >           do i=1,nevents
> > >              i_result(i,iTimer,myThreadId) = i_result(i,iTimer
> > >      $            ,myThreadId) + i_result2(i,iTimer,myThreadId) -
> > >      $            i_result1(i,iTimer,myThreadId)
> > >           enddo
> > > #endif
> > > #endif
> > >           timerStatus(iTimer,myThreadId)  = STOPPED
> > >           timerStops (iTimer,myThreadId)  =
> > >      &    timerStops (iTimer,myThreadId)+1
> > >         ENDIF
> > > #if defined (USE_PAPI) || defined (USE_PCL_FLOPS_SFP) ||
> defined(USE_PCL_FLOPS) || defined(USE_PCL)
> > >       ELSEIF ( tmpAction .EQ. INIT ) THEN
> > > #ifdef USE_PAPI
> > > CCE107 PAPI - Check PAPI version, find the maximum number of events and
> > > C      initialize the library, read the suggested events and create
> > > C      EventSet, prepare counter for use
> > >          Check = PAPI_VER_CURRENT
> > >          call PAPIF_library_init(Check)
> > >          if (Check .NE. PAPI_VER_CURRENT) then
> > >             WRITE(msgBuffer,*) "PAPI Library Version is out of Date"
> > >             CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &           SQUEEZE_RIGHT,myThreadId)
> > >             CALL ABORT
> > >          endif
> > >          call PAPIF_num_counters(neventsmax)
> > >          if (neventsmax .GT. nmaxevents) then
> > >             WRITE(msgBuffer,*) "Fix the nmaxevents in the code to ",
> > >      $           neventsmax
> > >             CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &           SQUEEZE_RIGHT,myThreadId)
> > >             CALL ABORT
> > >          endif
> > >          _BEGIN_MASTER(myThreadId)
> > >          CALL mdsFindUnit (papiunit, myThreadId)
> > >          OPEN(UNIT=papiunit,FILE='data.papi',STATUS='OLD')
> > >         read(papiunit,*) nevents
> > > C       reset to reasonable values
> > >         if (nevents .gt. neventsmax) then
> > >            nevents = neventsmax
> > >            WRITE(msgBuffer,*)
> > >      $          "resetting the number of PAPI events to the maximum"
> > >            CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &          SQUEEZE_RIGHT,myThreadId)
> > >         endif
> > >         do i = 1,nevents
> > >            read(papiunit,*) EventName
> > >            if ((EventName .eq. 'PAPI_FLOPS') .or.
> > >      $          (EventName .eq. 'PAPI_IPS')) then
> > >               WRITE(msgBuffer,*) "Abort! Rate events are not
> supported:"
> > >      $             ,EventName
> > >               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &             SQUEEZE_RIGHT,myThreadId)
> > >               CALL ABORT
> > >            endif
> > >
> > >            call PAPIF_event_name_to_code(EventName, EventCode(i),
> Check)
> > >         end do
> > >         close(papiunit)
> > >         _END_MASTER(myThid)
> > >         EventSet = PAPI_NULL
> > >         call PAPIF_create_eventset(EventSet, Check)
> > >         do i = 1,nevents
> > >            call PAPIF_add_event(EventSet, EventCode(i), Check)
> > >            if (Check .NE. PAPI_OK) then
> > >               CALL PAPIF_event_code_to_name(EventCode(i), EventName,
> > >      $             Check)
> > >               WRITE(msgBuffer,*) "Abort After PAPIF_add_event: ",
> > >      $             EventName
> > >               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &             SQUEEZE_RIGHT,myThreadId)
> > >               CALL ABORT
> > >            endif
> > >         enddo
> > > CCE107 - Start counting events
> > >         call PAPIF_start(EventSet, Check)
> > > #else
> > > #if defined(USE_PCL_FLOPS_SFP) || defined(USE_PCL_FLOPS) ||
> defined(USE_PCL)
> > > CCE107 PCL - initialize the library, read the suggested events
> > > C      and check them
> > >         res = PCLinit(descr)
> > >
> > > #ifdef USE_PCL
> > >         _BEGIN_MASTER(myThreadId)
> > >         CALL mdsFindUnit (pclunit, myThreadId)
> > >         OPEN(UNIT=pclunit,FILE='data.pcl',STATUS='OLD')
> > >         read(pclunit,*) nevents
> > > C     reset to reasonable values
> > >         if (nevents .gt. nmaxevents) then
> > >            nevents = nmaxevents
> > >            WRITE(msgBuffer,*)
> > >      $          "resetting the number of PCL events to the maximum"
> > >            CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &          SQUEEZE_RIGHT,myThreadId)
> > >         endif
> > >         do i = 1,nevents
> > >            read(pclunit,*) pcl_counter_list(i)
> > >            if ((pcl_counter_list(i) .ge. PCL_MFLOPS) .or.
> > >      $          (pcl_counter_list(i) .lt. 1)) then
> > >               if ((pcl_counter_list(i) .ge. PCL_MFLOPS) .and.
> > >      $             (pcl_counter_list(i) .le. nmaxevents)) then
> > >                  WRITE(msgBuffer,*)
> > >      $                "Abort! Rate events are not relevant:",
> > >      $                pcl_counter_name(pcl_counter_list(i))
> > >               else
> > >                  WRITE(msgBuffer,*)
> > >      $                "Abort! Events are not defined:",
> > >      $                pcl_counter_list(i)
> > >               endif
> > >               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &             SQUEEZE_RIGHT,myThreadId)
> > >               CALL ABORT
> > >            endif
> > >         enddo
> > >         close(pclunit)
> > >         _END_MASTER(myThid)
> > >
> > >         do i = 1,nevents
> > > CCE107 check to see that event are supported in the order asked
> > >            res = PCLquery(descr, pcl_counter_list, i, flags)
> > >            IF(res .NE. PCL_SUCCESS) THEN
> > >               WRITE(msgBuffer,*) "Abort! No support when adding event:
> "
> > >      $             , pcl_counter_name(pcl_counter_list(i))
> > >               CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &             SQUEEZE_RIGHT,myThreadId)
> > >               CALL ABORT
> > >            endif
> > >         enddo
> > > #else
> > >         do i = 1,5
> > > CCE107 check to see which rate events are supported.
> > >            res = PCLquery(descr, pcl_counter_list, nevents+1, flags)
> > >            if ((res .ne. PCL_SUCCESS) .and. (i .lt. 5)) then
> > >               pcl_counter_list(nevents+1) = alt_counter_list(i+1)
> > >            else
> > >               if (i .lt. 5) then
> > >                  nevents = nevents + 1
> > >               endif
> > >            endif
> > >         enddo
> > >         if (nevents .eq. 0) then
> > >            WRITE(msgBuffer,*)
> > >      $          "No PCL rate events supported: Please recompile!"
> > >            CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &          SQUEEZE_RIGHT,myThreadId)
> > >            CALL ABORT
> > >         endif
> > > #endif
> > >
> > > CCE107 - Start counting events
> > >         res = PCLstart(descr, pcl_counter_list, nevents, flags)
> > >         IF(res .NE. PCL_SUCCESS) THEN
> > >            WRITE(msgBuffer,*) "PCL counting failed - please recompile!"
> > >            CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &          SQUEEZE_RIGHT,myThreadId)
> > >            CALL ABORT
> > >         ENDIF
> > > #endif
> > > #endif
> > > #endif
> > >       ELSEIF ( tmpAction .EQ. PRINT ) THEN
> > >         IF ( iTimer .EQ. 0 ) GOTO 905
> > >         WRITE(msgBuffer,*)
> > >      &  ' Seconds in section "',
> > >      &
> timerNames(iTimer,myThreadId)(1:timerNameLen(iTimer,myThreadId))
> > >      &  ,'":'
> > >         CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >         WRITE(msgBuffer,*) '         User time:',
> > >      &  timerUser(iTimer,myThreadId)
> > >         CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >         WRITE(msgBuffer,*) '       System time:',
> > >      &  timerSys(iTimer,myThreadId)
> > >         CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >         WRITE(msgBuffer,*) '   Wall clock time:',
> > >      &  timerWall(iTimer,myThreadId)
> > >         CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >         WRITE(msgBuffer,*) '        No. starts:',
> > >      &  timerStarts(iTimer,myThreadId)
> > >         CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >         WRITE(msgBuffer,*) '         No. stops:',
> > >      &  timerStops(iTimer,myThreadId)
> > >         CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > > #ifdef USE_PAPI
> > >         do i = 1,nevents
> > >            call PAPIF_event_code_to_name(EventCode(i), EventName,
> Check)
> > >            WRITE(msgBuffer,71) Eventname,
> > >      $
> values(i,iTimer,myThreadId)/timerUser(iTimer,myThreadId)
> > >      $
> ,values(i,iTimer,myThreadId)/timerWall(iTimer,myThreadId
> > >      $          ),1.D0*values(i,iTimer,myThreadId)
> > >            CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &          SQUEEZE_RIGHT,myThreadId)
> > >         enddo
> > > #else
> > > #ifdef USE_PCL
> > >         do i = 1,nevents
> > >            WRITE(msgBuffer,71) pcl_counter_name(pcl_counter_list(i)),
> > >      $          i_result(i,iTimer,myThreadId)/timerUser(iTimer
> > >      $          ,myThreadId),i_result(i,iTimer,myThreadId)
> > >      $          /timerWall(iTimer,myThreadId),1.D0*i_result(i,iTimer
> > >      $          ,myThreadId)
> > >            CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &          SQUEEZE_RIGHT,myThreadId)
> > >         enddo
> > > #endif
> > > #endif
> > >       ELSEIF ( tmpAction .EQ. PRINTALL ) THEN
> > >         DO 10 I = 1, nTimers(myThreadId)
> > >          WRITE(msgBuffer,*) ' Seconds in section "',
> > >      &
> timerNames(I,myThreadId)(1:timerNameLen(I,myThreadId))
> > >      &  ,'":'
> > >          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >          WRITE(msgBuffer,*) '         User time:',
> > >      &  timerUser(I,myThreadId)
> > >          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >          WRITE(msgBuffer,*) '       System time:',
> > >      &  timerSys(I,myThreadId)
> > >          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >          WRITE(msgBuffer,*) '   Wall clock time:',
> > >      &  timerWall(I,myThreadId)
> > >          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >          WRITE(msgBuffer,*) '        No. starts:',
> > >      &  timerStarts(I,myThreadId)
> > >          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >          WRITE(msgBuffer,*) '         No. stops:',
> > >      &  timerStops(I,myThreadId)
> > >          CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > > #ifdef USE_PAPI
> > >         do j = 1,nevents
> > >            call PAPIF_event_code_to_name(EventCode(j), EventName,
> Check)
> > >            WRITE(msgBuffer,71) Eventname,
> > >      $          values(j,I,myThreadId)/timerUser(I,myThreadId),
> > >      $          values(j,I,myThreadId)/timerWall(I,myThreadId),
> > >      $          1.D0*values(j,I,myThreadId)
> > >            CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &          SQUEEZE_RIGHT,myThreadId)
> > >         enddo
> > > #else
> > > #ifdef USE_PCL
> > >         do j = 1,nevents
> > >            WRITE(msgBuffer,71) pcl_counter_name(pcl_counter_list(j)),
> > >      $          i_result(j,I,myThreadId)/timerUser(I,myThreadId)
> > >      $          ,i_result(j,I,myThreadId)/timerWall(I,myThreadId),1.D0
> > >      $          *i_result(j,I,myThreadId)
> > >            CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
> > >      &          SQUEEZE_RIGHT,myThreadId)
> > >         enddo
> > > #endif
> > > #endif
> > >    10   CONTINUE
> > >       ELSE
> > >         GOTO 903
> > >       ENDIF
> > > C
> > >  1000 CONTINUE
> > > C
> > >       RETURN
> > >   901 CONTINUE
> > >       WRITE(msgBuffer,'(A)')
> > >      &'                                                       '
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'procedure: "',callProc,'".'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'Timer name "',name(ISTART:IEND),'" is invalid.'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &' Names must have fewer than',maxString+1,' characters.'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*******************************************************'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       GOTO 1000
> > >   902 CONTINUE
> > >       WRITE(msgBuffer,*)
> > >      &'                                                       '
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'procedure: "',callProc,'".'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &' No timer action specified.'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &' Valid actions are:'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &' "START", "STOP", "PRINT" and "PRINTALL".'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*******************************************************'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       GOTO 1000
> > >   903 CONTINUE
> > >       WRITE(msgBuffer,*)
> > >      &'                                                       '
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'procedure: "',callProc,'".'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'Timer action"',name(ISTART:IEND),'" is invalid.'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &' Valid actions are:'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &' "START", "STOP", "PRINT" and "PRINTALL".'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*******************************************************'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       GOTO 1000
> > >   904 CONTINUE
> > >       WRITE(msgBuffer,*)
> > >      &'                                                       '
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'procedure: "',callProc,'".'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'Timer "',name(ISTART:IEND),'" cannot be created.'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &' Only ',maxTimers,' timers are allowed.'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*******************************************************'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       GOTO 1000
> > >   905 CONTINUE
> > >       WRITE(msgBuffer,*)
> > >      &'                                                       '
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'procedure: "',callProc,'".'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'Timer name is blank.'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &' A name must be used with "START", "STOP" or  "PRINT".'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       WRITE(msgBuffer,*)
> > >      &'*******************************************************'
> > >       CALL PRINT_MESSAGE(msgBuffer,errorMessageUnit,
> > >      &  SQUEEZE_RIGHT,myThreadId)
> > >       GOTO 1000
> > >
> > > #if (defined USE_PAPI) || (defined USE_PCL)
> > >  71   FORMAT(A,' per sec ',D13.7,' ',D13.7,', number ', D13.7)
> > > #endif
> > > c72   FORMAT(A,D13.7)
> > >       END
> > >
> > >
> C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
> > > CBOP
> > > C     !ROUTINE: TIMER_GET_TIME
> > >
> > > C     !INTERFACE:
> > >       SUBROUTINE TIMER_GET_TIME(
> > >      O                           userTime,
> > >      O                           systemTime,
> > >      O                           wallClockTime )
> > >       IMPLICIT NONE
> > >
> > > C     !DESCRIPTION:
> > > C     *==========================================================*
> > > C     | SUBROUTINE TIMER\_GET\_TIME
> > > C     | o Query system timer routines.
> > > C     *==========================================================*
> > > C     | Routine returns total elapsed time for program so far.
> > > C     | Three times are returned that conventionally are used as
> > > C     | user time, system time and wall-clock time. Not all these
> > > C     | numbers are available on all machines.
> > > C     *==========================================================*
> > >
> > > C     !INPUT/OUTPUT PARAMETERS:
> > > C     userTime      :: User time returned
> > > C     systemTime    :: System time returned
> > > C     wallClockTime :: Wall clock time returned
> > >
> > >       Real*8 userTime
> > >       Real*8 systemTime
> > >       Real*8 wallClockTime
> > >
> > > C     The following was seriously hacked around by Mark Hadfield
> > > C     October 2006
> > >
> > > #ifdef IGNORE_TIME
> > >
> > >       userTime = 0.
> > >       systemTime = 0.
> > >       wallClockTime = 0.
> > >
> > > #else
> > >
> > > C     Declarations follow the same preprocessor structure as the
> > > C     executable code below.
> > >
> > > # if defined (TARGET_AIX) || defined (TARGET_BGL)
> > > C     Real*4 etime_
> > > C     Real*8 timenow
> > > C     external etime_, timenow
> > >       Real*4 External etime_
> > >       Real*8 External timenow
> > >       Real*4 actual, tarray(2)
> > > # elif (defined TARGET_T3E || defined TARGET_CRAY_VECTOR)
> > >       real second, secondr
> > >       external second, secondr
> > > # else
> > > #  ifdef HAVE_ETIME
> > > C     Real*4 etime
> > > C     EXTERNAL etime
> > >       Real*4 actual, tarray(2)
> > > #  else
> > >       Real*8 csystemtime, cusertime
> > >       external csystemtime, cusertime
> > > #  endif
> > > #  if defined HAVE_CLOC
> > >       Real*8 wtime
> > > #  elif (defined (ALLOW_USE_MPI) && defined (USE_MPI_WTIME))
> > > C     No declarations necessary
> > > #  else
> > >       Real*8 timenow
> > >       external timenow
> > > #  endif /* HAVE_CLOC */
> > > # endif
> > > CEOP
> > >
> > > C     Executable code
> > >
> > > CCE107 Fixed for AIX and UNICOS
> > > # if defined(TARGET_AIX) || defined(TARGET_BGL)
> > >       ACTUAL = ETIME_(TARRAY)
> > >       userTime      = TARRAY(1)
> > >       systemTime    = TARRAY(2)
> > >       wallClockTime = timenow()
> > > # elif (defined (TARGET_T3E) || defined (TARGET_CRAY_VECTOR))
> > >       userTime      = SECOND()
> > >       systemTime    = 0.
> > >       wallClockTime = SECONDR()
> > > # else
> > > #  ifdef HAVE_ETIME
> > > C     actual = etime(tarray)
> > >       call etime(tarray,actual)
> > >       userTime = tarray(1)
> > >       systemTime = tarray(2)
> > > #  else
> > >       userTime   = cusertime()
> > >       systemTime = csystemtime()
> > > #  endif
> > > #  if defined HAVE_CLOC
> > >       CALL cloc(wTime)
> > >       wallClockTime = wtime
> > > #  elif (defined (ALLOW_USE_MPI) && defined (USE_MPI_WTIME))
> > >       wallClockTime = MPI_Wtime()
> > > #  else
> > >       wallClockTime = timenow()
> > > #  endif
> > > # endif
> > > #endif
> > >
> > >       RETURN
> > >       END
> > >
> > >
> C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
> > > CBOP
> > > C     !ROUTINE: TIMER_PRINTALL
> > >
> > > C     !INTERFACE:
> > >       SUBROUTINE TIMER_PRINTALL( myThreadId )
> > >       IMPLICIT NONE
> > >
> > > C     !DESCRIPTION:
> > > C     *==========================================================*
> > > C     | SUBROUTINE TIMER\_PRINTALL
> > > C     | o Print timer information
> > > C     *==========================================================*
> > > C     | Request print out of table of timing from all timers.
> > > C     *==========================================================*
> > >
> > > C     !INPUT PARAMETERS:
> > > C     myThreadId :: This threads number
> > >       INTEGER myThreadId
> > > CEOP
> > >
> > >       CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,
> > >      &                   myThreadId )
> > > C
> > >       RETURN
> > >       END
> > >
> > >
> C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
> > > CBOP
> > > C     !ROUTINE: TIMER_START
> > >
> > > C     !INTERFACE:
> > >       SUBROUTINE TIMER_START ( string , myThreadId )
> > >       IMPLICIT NONE
> > >
> > > C     !DESCRIPTION:
> > > C     Start timer named "string".
> > >
> > > C     !INPUT PARAMETERS:
> > > C     string     :: Name of timer
> > > C     myThreadId :: My thread number
> > >       CHARACTER*(*) string
> > >       INTEGER myThreadId
> > > CEOP
> > > C
> > >       CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)
> > > C
> > >       RETURN
> > >       END
> > >
> > >
> C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
> > > CBOP
> > > C     !ROUTINE: TIMER_STOP
> > >
> > > C     !INTERFACE:
> > >       SUBROUTINE TIMER_STOP  ( string , myThreadId )
> > >       IMPLICIT NONE
> > >
> > > C     !DESCRIPTION:
> > > C     Stop timer named "string".
> > >
> > > C     !INPUT PARAMETERS:
> > > C     string     :: Name of timer
> > > C     myThreadId :: My thread number
> > >       CHARACTER*(*) string
> > >       INTEGER myThreadId
> > > CEOP
> > > C
> > >       CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )
> > > C
> > >       RETURN
> > >       END
> > >
> > >
> C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
> > >
> > > #ifdef USE_PAPI
> > > CCE107 Initialization of common block for PAPI timers
> > >       BLOCK DATA setpapivalues
> > > #include "EEPARAMS.h"
> > >       INTEGER maxTimers
> > >       PARAMETER (maxTimers = 50)
> > >       INTEGER nmaxevents
> > >       PARAMETER (nmaxevents = 18)
> > >       INTEGER size
> > >       PARAMETER (size = 3*nmaxevents*maxTimers*MAX_NO_THREADS)
> > >       INTEGER*8 values(nmaxevents, maxTimers , MAX_NO_THREADS),
> > >      $     values1(nmaxevents, maxTimers, MAX_NO_THREADS),
> > >      $     values2(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       COMMON /papivalues/ values, values1, values2
> > >       DATA values, values1, values2 /size*0/
> > >       END
> > > #endif
> > > #if defined(USE_PCL_FLOPS_SFP) || defined(USE_PCL_FLOPS) ||
> defined(USE_PCL)
> > > CCE107 Initialization of common block for PCL event names
> > >       BLOCK DATA setpclnames
> > >       INTEGER nmaxevents
> > >       PARAMETER (nmaxevents = 61)
> > >       CHARACTER*22 pcl_counter_name(0:nmaxevents-1)
> > >       COMMON /pclnames/ pcl_counter_name
> > >       DATA pcl_counter_name(0) /'PCL_L1CACHE_READ'/
> > >       DATA pcl_counter_name(1) /'PCL_L1CACHE_WRITE'/
> > >       DATA pcl_counter_name(2) /'PCL_L1CACHE_READWRITE'/
> > >       DATA pcl_counter_name(3) /'PCL_L1CACHE_HIT'/
> > >       DATA pcl_counter_name(4) /'PCL_L1CACHE_MISS'/
> > >       DATA pcl_counter_name(5) /'PCL_L1DCACHE_READ'/
> > >       DATA pcl_counter_name(6) /'PCL_L1DCACHE_WRITE'/
> > >       DATA pcl_counter_name(7) /'PCL_L1DCACHE_READWRITE'/
> > >       DATA pcl_counter_name(8) /'PCL_L1DCACHE_HIT'/
> > >       DATA pcl_counter_name(9) /'PCL_L1DCACHE_MISS'/
> > >       DATA pcl_counter_name(10) /'PCL_L1ICACHE_READ'/
> > >       DATA pcl_counter_name(11) /'PCL_L1ICACHE_WRITE'/
> > >       DATA pcl_counter_name(12) /'PCL_L1ICACHE_READWRITE'/
> > >       DATA pcl_counter_name(13) /'PCL_L1ICACHE_HIT'/
> > >       DATA pcl_counter_name(14) /'PCL_L1ICACHE_MISS'/
> > >       DATA pcl_counter_name(15) /'PCL_L2CACHE_READ'/
> > >       DATA pcl_counter_name(16) /'PCL_L2CACHE_WRITE'/
> > >       DATA pcl_counter_name(17) /'PCL_L2CACHE_READWRITE'/
> > >       DATA pcl_counter_name(18) /'PCL_L2CACHE_HIT'/
> > >       DATA pcl_counter_name(19) /'PCL_L2CACHE_MISS'/
> > >       DATA pcl_counter_name(20) /'PCL_L2DCACHE_READ'/
> > >       DATA pcl_counter_name(21) /'PCL_L2DCACHE_WRITE'/
> > >       DATA pcl_counter_name(22) /'PCL_L2DCACHE_READWRITE'/
> > >       DATA pcl_counter_name(23) /'PCL_L2DCACHE_HIT'/
> > >       DATA pcl_counter_name(24) /'PCL_L2DCACHE_MISS'/
> > >       DATA pcl_counter_name(25) /'PCL_L2ICACHE_READ'/
> > >       DATA pcl_counter_name(26) /'PCL_L2ICACHE_WRITE'/
> > >       DATA pcl_counter_name(27) /'PCL_L2ICACHE_READWRITE'/
> > >       DATA pcl_counter_name(28) /'PCL_L2ICACHE_HIT'/
> > >       DATA pcl_counter_name(29) /'PCL_L2ICACHE_MISS'/
> > >       DATA pcl_counter_name(30) /'PCL_TLB_HIT'/
> > >       DATA pcl_counter_name(31) /'PCL_TLB_MISS'/
> > >       DATA pcl_counter_name(32) /'PCL_ITLB_HIT'/
> > >       DATA pcl_counter_name(33) /'PCL_ITLB_MISS'/
> > >       DATA pcl_counter_name(34) /'PCL_DTLB_HIT'/
> > >       DATA pcl_counter_name(35) /'PCL_DTLB_MISS'/
> > >       DATA pcl_counter_name(36) /'PCL_CYCLES'/
> > >       DATA pcl_counter_name(37) /'PCL_ELAPSED_CYCLES'/
> > >       DATA pcl_counter_name(38) /'PCL_INTEGER_INSTR'/
> > >       DATA pcl_counter_name(39) /'PCL_FP_INSTR'/
> > >       DATA pcl_counter_name(40) /'PCL_LOAD_INSTR'/
> > >       DATA pcl_counter_name(41) /'PCL_STORE_INSTR'/
> > >       DATA pcl_counter_name(42) /'PCL_LOADSTORE_INSTR'/
> > >       DATA pcl_counter_name(43) /'PCL_INSTR'/
> > >       DATA pcl_counter_name(44) /'PCL_JUMP_SUCCESS'/
> > >       DATA pcl_counter_name(45) /'PCL_JUMP_UNSUCCESS'/
> > >       DATA pcl_counter_name(46) /'PCL_JUMP'/
> > >       DATA pcl_counter_name(47) /'PCL_ATOMIC_SUCCESS'/
> > >       DATA pcl_counter_name(48) /'PCL_ATOMIC_UNSUCCESS'/
> > >       DATA pcl_counter_name(49) /'PCL_ATOMIC'/
> > >       DATA pcl_counter_name(50) /'PCL_STALL_INTEGER'/
> > >       DATA pcl_counter_name(51) /'PCL_STALL_FP'/
> > >       DATA pcl_counter_name(52) /'PCL_STALL_JUMP'/
> > >       DATA pcl_counter_name(53) /'PCL_STALL_LOAD'/
> > >       DATA pcl_counter_name(54) /'PCL_STALL_STORE'/
> > >       DATA pcl_counter_name(55) /'PCL_STALL'/
> > >       DATA pcl_counter_name(56) /'PCL_MFLOPS'/
> > >       DATA pcl_counter_name(57) /'PCL_IPC'/
> > >       DATA pcl_counter_name(58) /'PCL_L1DCACHE_MISSRATE'/
> > >       DATA pcl_counter_name(59) /'PCL_L2DCACHE_MISSRATE'/
> > >       DATA pcl_counter_name(60) /'PCL_MEM_FP_RATIO'/
> > >       END
> > >
> > > #ifdef USE_PCL
> > > CCE107 Initialization of common block for PCL summary performance
> > >       BLOCK DATA setpcls
> > > #include "EEPARAMS.h"
> > >       INTEGER maxTimers
> > >       PARAMETER (maxTimers = 50)
> > >       INTEGER nmaxevents
> > >       PARAMETER (nmaxevents = 61)
> > >       INTEGER size
> > >       PARAMETER (size = nmaxevents*maxTimers*MAX_NO_THREADS)
> > >       INTEGER PCL_CYCLES, PCL_MODE_USER_SYSTEM
> > >       PARAMETER (PCL_CYCLES=36, PCL_MODE_USER_SYSTEM=3)
> > >       INTEGER pcl_counter_list(nmaxevents)
> > >       INTEGER flags, nevents
> > >       INTEGER*8 i_result(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       INTEGER*8 i_result1(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       INTEGER*8 i_result2(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       INTEGER*8 descr
> > >       REAL*8 fp_result(nmaxevents, maxTimers, MAX_NO_THREADS)
> > >       COMMON /pclvars/ i_result, descr, fp_result, pcl_counter_list,
> > >      $     flags, nevents
> > >       DATA fp_result /size*0.0D0/
> > >       DATA i_result /size*0/
> > >       DATA i_result1 /size*0/
> > >       DATA i_result2 /size*0/
> > >       DATA descr /0/
> > >       DATA nevents /nmaxevents/
> > >       DATA pcl_counter_list /nmaxevents*PCL_CYCLES/
> > >       DATA flags /PCL_MODE_USER_SYSTEM/
> > >       END
> > > #else
> > > CCE107 Initialization of common block for PCL summary performance
> > >       BLOCK DATA setpcls
> > >       INTEGER PCL_MFLOPS, PCL_IPC, PCL_L1DCACHE_MISSRATE,
> > >      $     PCL_L2DCACHE_MISSRATE, PCL_MEM_FP_RATIO
> > >       PARAMETER (PCL_MFLOPS=56, PCL_IPC=57, PCL_L1DCACHE_MISSRATE=58,
> > >      $     PCL_L2DCACHE_MISSRATE=59, PCL_MEM_FP_RATIO=60)
> > >       INTEGER PCL_MODE_USER_SYSTEM
> > >       PARAMETER (PCL_MODE_USER_SYSTEM=3)
> > >       INTEGER pcl_counter_list(5), flags, nevents
> > >       INTEGER*8 i_result(5), descr
> > >       REAL*8 fp_result(5)
> > >       COMMON /pclvars/ i_result, descr, fp_result, pcl_counter_list,
> > >      $     flags, nevents
> > >       DATA fp_result /5*0.0D0/
> > >       DATA i_result /5*0/
> > >       DATA descr /0/
> > >       DATA nevents /0/
> > >       DATA pcl_counter_list /PCL_MFLOPS, PCL_IPC,
> PCL_L1DCACHE_MISSRATE,
> > >      $     PCL_L2DCACHE_MISSRATE, PCL_MEM_FP_RATIO/
> > >       DATA flags /PCL_MODE_USER_SYSTEM/
> > >       END
> > > #endif
> > > #endif
> >
> >
> > > _______________________________________________
> > > MITgcm-support mailing list
> > > MITgcm-support at mitgcm.org
> > > http://mitgcm.org/mailman/listinfo/mitgcm-support
> >
> >
> > _______________________________________________
> > MITgcm-support mailing list
> > MITgcm-support at mitgcm.org
> > http://mitgcm.org/mailman/listinfo/mitgcm-support
>
> _______________________________________________
> MITgcm-support mailing list
> MITgcm-support at mitgcm.org
> http://mitgcm.org/mailman/listinfo/mitgcm-support
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mitgcm.org/pipermail/mitgcm-support/attachments/20151122/5c19ea7c/attachment-0001.htm>


More information about the MITgcm-support mailing list