[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