<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(&quot;total time&quot;)
       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, &amp;
+                  mpas_counter_stop, &amp;
+                  mpas_counter_reset, &amp;
+                  mpas_counter_write, &amp;
+                  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 =&gt; 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>