Blame src/ftests/fmatrixpapi2.F

Packit Service a1973e
C ****************************************************************************
Packit Service a1973e
C
Packit Service a1973e
C fmatrixpapi2.f
Packit Service a1973e
C An example of matrix-matrix multiplication and using PAPI high level to 
Packit Service a1973e
C look at the performance. The example illustrates how PAPIF_read_counters
Packit Service a1973e
C and PAPIF_accum_counters can be used to selectively measure parts of a
Packit Service a1973e
C code without having to use the low-level interface.
Packit Service a1973e
C
Packit Service a1973e
C Derived from an example written by Kevin London March 2000
Packit Service a1973e
C ****************************************************************************
Packit Service a1973e
Packit Service a1973e
#include "fpapi_test.h"
Packit Service a1973e
Packit Service a1973e
      program fmatrixpapi
Packit Service a1973e
      IMPLICIT integer (p)
Packit Service a1973e
Packit Service a1973e
      INTEGER ncols1,nrows1,ncols2,nrows2
Packit Service a1973e
      PARAMETER(nrows1=175,ncols1=225,nrows2=ncols1,ncols2=150)
Packit Service a1973e
      INTEGER i,j,num_events,retval
Packit Service a1973e
C   PAPI standardized event to be monitored
Packit Service a1973e
      INTEGER event(2)
Packit Service a1973e
C   PAPI values of the counters
Packit Service a1973e
      INTEGER*8 values(2), dummies(2)
Packit Service a1973e
      REAL*8 p(nrows1,ncols1),q(nrows2,ncols2),
Packit Service a1973e
     &                 r(nrows1,ncols2)
Packit Service a1973e
      integer tests_quiet, get_quiet
Packit Service a1973e
      external get_quiet
Packit Service a1973e
Packit Service a1973e
      tests_quiet = get_quiet()
Packit Service a1973e
Packit Service a1973e
C   Setup default values
Packit Service a1973e
      num_events=0
Packit Service a1973e
Packit Service a1973e
C   Open matrix file number 1 for reading
Packit Service a1973e
C      OPEN(UNIT=1,FILE='fmt1',STATUS='OLD')
Packit Service a1973e
C   Open matrix file number 2 for reading
Packit Service a1973e
C      OPEN(UNIT=2,FILE='fmt2',STATUS='OLD')
Packit Service a1973e
Packit Service a1973e
      retval = PAPI_VER_CURRENT
Packit Service a1973e
      call PAPIf_library_init(retval)
Packit Service a1973e
      if ( retval.NE.PAPI_VER_CURRENT) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__,
Packit Service a1973e
     .   'PAPI_library_init', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C   Total floating point operations
Packit Service a1973e
        call PAPIf_query_event(PAPI_FP_INS, retval)
Packit Service a1973e
        if (retval .NE. PAPI_OK) then
Packit Service a1973e
        event(1) = PAPI_TOT_INS
Packit Service a1973e
        else
Packit Service a1973e
C   Total floating point operations
Packit Service a1973e
        event(1) = PAPI_FP_INS
Packit Service a1973e
        end if
Packit Service a1973e
Packit Service a1973e
C  Time used
Packit Service a1973e
      event(2) = PAPI_TOT_CYC
Packit Service a1973e
Packit Service a1973e
C   See how many hardware events at one time are supported
Packit Service a1973e
      call PAPIf_num_counters( num_events )
Packit Service a1973e
      if ( num_events .LT. 2 ) then
Packit Service a1973e
          print *,'This example program requries the architecture ',
Packit Service a1973e
     .    'to support 2 simultaneous hardware events...shutting down.'
Packit Service a1973e
      stop
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
      if (tests_quiet .EQ. 0) then
Packit Service a1973e
      print *, 'Number of hardware counters supported: ', num_events
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C   matrix 1: read in the matrix values
Packit Service a1973e
      do i=1, nrows1
Packit Service a1973e
         do j=1,ncols1
Packit Service a1973e
            p(i,j) = i*j*1.0
Packit Service a1973e
         end do
Packit Service a1973e
      end do
Packit Service a1973e
Packit Service a1973e
C   matrix 2: read in the matrix values
Packit Service a1973e
      do i=1, nrows2
Packit Service a1973e
         do j=1,ncols2
Packit Service a1973e
            q(i,j) = i*j*1.0
Packit Service a1973e
         end do
Packit Service a1973e
      end do
Packit Service a1973e
Packit Service a1973e
C  Initialize the result matrix 
Packit Service a1973e
      do i=1,nrows1
Packit Service a1973e
         do j=1, ncols2
Packit Service a1973e
            r(i,j) = i*j*1.0
Packit Service a1973e
         end do
Packit Service a1973e
      end do
Packit Service a1973e
      
Packit Service a1973e
C  Set up the counters
Packit Service a1973e
      num_events = 2
Packit Service a1973e
      call PAPIf_start_counters( event, num_events, retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__, 
Packit Service a1973e
     *'PAPIf_start_counters', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C  We wish to count the events for this call
Packit Service a1973e
      call Adding_MatMult(p,q,r,nrows1,ncols1,ncols2)
Packit Service a1973e
Packit Service a1973e
C  Read and clear the counter values
Packit Service a1973e
      call PAPIf_read_counters(values, num_events,retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__, 
Packit Service a1973e
     *'PAPIf_read_counters', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
      if (tests_quiet .EQ. 0) then
Packit Service a1973e
        print *
Packit Service a1973e
         if (event(1) .EQ. PAPI_TOT_INS) then
Packit Service a1973e
          print *, 'TOT Instructions:  ',values(1)
Packit Service a1973e
         else
Packit Service a1973e
            print *, 'FP Instructions:  ',values(1)
Packit Service a1973e
         end if
Packit Service a1973e
Packit Service a1973e
        print *, 'Cycles: ',values(2)
Packit Service a1973e
Packit Service a1973e
           if (event(1) .EQ. PAPI_FP_INS) then
Packit Service a1973e
             write(*,'(a,f9.6)') ' Efficiency (flops/cycles):',
Packit Service a1973e
     &                         real(values(1))/real(values(2))
Packit Service a1973e
           end if
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C  We don't wish to count the events for this call
Packit Service a1973e
      call Adding_MatMult(p,q,r,nrows1,ncols1,ncols2)
Packit Service a1973e
Packit Service a1973e
C  Clear the counter values
Packit Service a1973e
      call PAPIf_read_counters(dummies, num_events,retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__, 
Packit Service a1973e
     *'PAPIf_read_counters', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C  We wish to count the events for this call
Packit Service a1973e
      call Adding_MatMult(p,q,r,nrows1,ncols1,ncols2)
Packit Service a1973e
Packit Service a1973e
C  Read the counter values
Packit Service a1973e
      call PAPIf_accum_counters(values, num_events,retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__, 
Packit Service a1973e
     *'PAPIf_accum_counters', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C  Stop the counters and put the results in the array values 
Packit Service a1973e
      call PAPIf_stop_counters(dummies,num_events,retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__, 
Packit Service a1973e
     *'PAPIf_stop_counters', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
      if (tests_quiet .EQ. 0) then
Packit Service a1973e
        print *
Packit Service a1973e
          if (event(1) .EQ. PAPI_TOT_INS) then
Packit Service a1973e
                print *, 'TOT Instructions:  ',values(1)
Packit Service a1973e
          else
Packit Service a1973e
                print *, 'FP Instructions:  ',values(1)
Packit Service a1973e
          end if
Packit Service a1973e
Packit Service a1973e
        print *, 'Cycles: ',values(2)
Packit Service a1973e
Packit Service a1973e
          if (event(1) .EQ. PAPI_FP_INS) then
Packit Service a1973e
               write(*,'(a,f9.6)') ' Efficiency (flops/cycles):',
Packit Service a1973e
     &                         real(values(1))/real(values(2))
Packit Service a1973e
          end if
Packit Service a1973e
Packit Service a1973e
        print *
Packit Service a1973e
        print *,'----------------------------------------------------'
Packit Service a1973e
        print *,'The second instruction and cycle counts should be'
Packit Service a1973e
        print *,'approximately twice the first ones. The efficiency'
Packit Service a1973e
        print *,'metric should be fairly equal between the cases.'
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
      call ftests_pass(__FILE__)
Packit Service a1973e
      end
Packit Service a1973e
Packit Service a1973e
      subroutine Adding_MatMult(p,q,r,ni,nk,nj)
Packit Service a1973e
      implicit integer (p)
Packit Service a1973e
      integer ni,nk,nj
Packit Service a1973e
      real*8 p(ni,*),q(nk,*),r(ni,nj)
Packit Service a1973e
Packit Service a1973e
      integer i,j,k
Packit Service a1973e
C  Compute the matrix-matrix multiplication
Packit Service a1973e
      do i=1,ni
Packit Service a1973e
       do j=1,nj
Packit Service a1973e
         do k=1,nk
Packit Service a1973e
           r(i,j)=r(i,j) + p(i,k)*q(k,j)
Packit Service a1973e
         end do
Packit Service a1973e
       end do
Packit Service a1973e
      end do
Packit Service a1973e
Packit Service a1973e
C  Make sure the compiler does not optimize away the multiplication
Packit Service a1973e
      call dummy(r)
Packit Service a1973e
Packit Service a1973e
      end