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