<p><b>dwj07@fsu.edu</b> 2011-12-20 14:05:14 -0700 (Tue, 20 Dec 2011)</p><p><br>
-- BRANCH COMMIT --<br>
<br>
Adding a basic hardware counter module to framework.<br>
<br>
Currently it tries to add L1, L2, and L3 cache misses, and mispredicted branches to the list of hardware counters.<br>
<br>
Something weird happens with the second counter added (it's always zero). And it only lets me add 3 on my laptop.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F
===================================================================
--- branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F        2011-12-20 19:38:44 UTC (rev 1266)
+++ branches/ocean_projects/performance/src/core_ocean/mpas_ocn_mpas_core.F        2011-12-20 21:05:14 UTC (rev 1267)
@@ -5,6 +5,7 @@
use mpas_timekeeping
use mpas_dmpar
use mpas_timer
+ use mpas_counter
use ocn_global_diagnostics
use ocn_test_cases
@@ -88,6 +89,8 @@
call mpas_timer_init(domain)
+ call mpas_counter_init(domain)
+
if(err.eq.1) then
call mpas_dmpar_abort(dminfo)
endif
Modified: branches/ocean_projects/performance/src/driver/mpas_subdriver.F
===================================================================
--- branches/ocean_projects/performance/src/driver/mpas_subdriver.F        2011-12-20 19:38:44 UTC (rev 1266)
+++ branches/ocean_projects/performance/src/driver/mpas_subdriver.F        2011-12-20 21:05:14 UTC (rev 1267)
@@ -59,7 +59,9 @@
implicit none
+ call mpas_counter_start()
call mpas_core_run(domain, output_obj, output_frame)
+ call mpas_counter_stop()
end subroutine mpas_run
@@ -84,6 +86,7 @@
call mpas_timer_stop("total time")
call mpas_timer_write()
+ call mpas_counter_write()
!
Modified: branches/ocean_projects/performance/src/framework/Makefile
===================================================================
--- branches/ocean_projects/performance/src/framework/Makefile        2011-12-20 19:38:44 UTC (rev 1266)
+++ branches/ocean_projects/performance/src/framework/Makefile        2011-12-20 21:05:14 UTC (rev 1267)
@@ -6,6 +6,7 @@
OBJS = mpas_framework.o \
mpas_timer.o \
+         mpas_counter.o \
mpas_timekeeping.o \
mpas_configure.o \
mpas_constants.o \
Added: branches/ocean_projects/performance/src/framework/mpas_counter.F
===================================================================
--- branches/ocean_projects/performance/src/framework/mpas_counter.F         (rev 0)
+++ branches/ocean_projects/performance/src/framework/mpas_counter.F        2011-12-20 21:05:14 UTC (rev 1267)
@@ -0,0 +1,175 @@
+ module mpas_counter
+
+ use mpas_grid_types
+ use mpas_dmpar
+
+ implicit none
+ save
+
+#ifdef _PAPI
+ include 'f90papi.h'
+#endif
+
+ integer :: event_set
+ integer :: num_counters
+ integer, dimension(:), allocatable :: counters
+ character (len=72), dimension(:), allocatable :: counter_names
+
+ type (dm_info), pointer :: domain_info
+
+ public :: mpas_counter_start, &
+ mpas_counter_stop, &
+ mpas_counter_reset, &
+ mpas_counter_write, &
+ mpas_counter_init
+
+ contains
+
+ subroutine mpas_counter_start()!{{{
+ integer :: err
+
+#ifdef _PAPI
+ call PAPIF_start(event_set, err)
+
+ if ( err .ne. PAPI_OK ) then
+ print *,'Error in mpas_counter_start'
+ call mpas_dmpar_abort(domain_info)
+ endif
+#endif
+ end subroutine mpas_counter_start!}}}
+
+ subroutine mpas_counter_stop()!{{{
+ integer :: err
+
+#ifdef _PAPI
+ call PAPIF_stop(event_set, counters, err)
+
+ if ( err .ne. PAPI_OK ) then
+ print *,'Error in mpas_counter_stop'
+ call mpas_dmpar_abort(domain_info)
+ endif
+#endif
+ end subroutine mpas_counter_stop!}}}
+
+ subroutine mpas_counter_reset()!{{{
+ integer :: err
+
+#ifdef _PAPI
+ call PAPIF_reset(event_set, err)
+
+ if ( err .ne. PAPI_OK ) then
+ print *,'Error in mpas_counter_reset'
+ call mpas_dmpar_abort(domain_info)
+ endif
+#endif
+ end subroutine mpas_counter_reset!}}}
+
+ subroutine mpas_counter_write()!{{{
+ integer :: i
+
+ write(*,*) ''
+ write(*,*) ''
+
+ do i = 1, num_counters
+ write(*,*) counter_names(i), ' ', counters(i)
+ end do
+
+ end subroutine mpas_counter_write!}}}
+
+ subroutine mpas_counter_init(domain)!{{{
+ type (domain_type), intent(in), optional :: domain
+
+ integer :: err, event_code, tmp_counters, i
+ integer, dimension(:), allocatable :: event_list
+
+ num_counters = 0
+
+ if( present(domain) ) then
+ domain_info => domain % dminfo
+ endif
+
+#ifdef _PAPI
+ err = PAPI_VER_CURRENT
+ call PAPIF_library_init(err)
+ if (err .ne. PAPI_VER_CURRENT) then
+ print *, 'Error initializing the PAPI Library', err
+ call mpas_dmpar_abort(domain % dminfo)
+ end if
+
+ ! Setup papi event set and counters
+ event_set = PAPI_NULL
+
+ call PAPIF_create_eventset(event_set, err)
+
+ if ( err .ne. PAPI_OK ) then
+ print *, 'Error in PAPIF_create_eventset', err
+ call mpas_dmpar_abort(domain % dminfo)
+ end if
+
+ ! L2 Total Cache Misses
+ event_code = PAPI_L2_TCM
+
+ call PAPIF_add_event(event_set, event_code, err)
+
+ if ( err == PAPI_OK) then
+ num_counters = num_counters + 1
+ else
+ print *,'Error in add PAPI_L2_TCM'
+ call PAPIF_remove_event(event_set, event_code, err)
+ end if
+
+
+ ! L1 Total Cache Misses
+ event_code = PAPI_L1_TCM
+
+ call PAPIF_add_event(event_set, event_code, err)
+
+ if ( err == PAPI_OK) then
+ num_counters = num_counters + 1
+ else
+ print *,'Error in add PAPI_L1_TCM'
+ call PAPIF_remove_event(event_set, event_code, err)
+ end if
+
+ ! L3 Total Cache Misses
+ event_code = PAPI_L3_TCM
+
+ call PAPIF_add_event(event_set, event_code, err)
+
+ if ( err == PAPI_OK) then
+ num_counters = num_counters + 1
+ else
+ print *,'Error in add PAPI_L3_TCM'
+ call PAPIF_remove_event(event_set, event_code, err)
+ end if
+
+ ! Stalled Cycles
+ event_code = PAPI_STL_ICY
+
+ call PAPIF_add_event(event_set, event_code, err)
+
+ if ( err == PAPI_OK) then
+ num_counters = num_counters + 1
+ else
+ print *,'Error in add PAPI_STL_ICY', err
+ call PAPIF_remove_event(event_set, event_code, err)
+ end if
+
+ allocate(counters(num_counters))
+ allocate(event_list(num_counters))
+ allocate(counter_names(num_counters))
+
+ tmp_counters = num_counters
+ call PAPIF_list_events(event_set, event_list, tmp_counters)
+
+ do i = 1, num_counters
+ call PAPIF_event_code_to_name(event_list(i), counter_names(i), err)
+ enddo
+
+#endif
+
+ end subroutine mpas_counter_init!}}}
+
+ end module mpas_counter
+
+! vim: foldmethod=marker et ts=2
</font>
</pre>