Blame src/ftests/fmatrixpapi.F

Packit 577717
C****************************************************************************
Packit 577717
C     
Packit 577717
C     fmatrixpapi.f
Packit 577717
C     An example of matrix-matrix multiplication and using PAPI high level to 
Packit 577717
C     look at the performance. written by Kevin London
Packit 577717
C     March 2000
Packit 577717
C****************************************************************************
Packit 577717
Packit 577717
#include "fpapi_test.h"
Packit 577717
Packit 577717
      program fmatrixpapi
Packit 577717
      IMPLICIT integer (p)
Packit 577717
Packit 577717
      INTEGER ncols1,nrows1,ncols2,nrows2
Packit 577717
      PARAMETER(nrows1=175,ncols1=225,nrows2=ncols1,ncols2=150)
Packit 577717
      INTEGER i,j,k,num_events,retval
Packit 577717
C     PAPI standardized event to be monitored
Packit 577717
      INTEGER event(2)
Packit 577717
C     PAPI values of the counters
Packit 577717
      INTEGER*8 values(2)
Packit 577717
      REAL*8 p(nrows1,ncols1),q(nrows2,ncols2),
Packit 577717
     &     r(nrows1,ncols2),tmp
Packit 577717
      integer tests_quiet, get_quiet
Packit 577717
      external get_quiet
Packit 577717
Packit 577717
      tests_quiet = get_quiet()
Packit 577717
Packit 577717
C     Setup default values
Packit 577717
      num_events=0
Packit 577717
Packit 577717
C     Open matrix file number 1 for reading
Packit 577717
C     OPEN(UNIT=1,FILE='fmt1',STATUS='OLD')
Packit 577717
C     Open matrix file number 2 for reading
Packit 577717
C     OPEN(UNIT=2,FILE='fmt2',STATUS='OLD')
Packit 577717
Packit 577717
C     See how many hardware events at one time are supported
Packit 577717
C     This also initializes the PAPI library
Packit 577717
      call PAPIf_num_counters( num_events )
Packit 577717
      if ( num_events .LT. 2 ) then
Packit 577717
        print *,'This example program requries the architecture to ',
Packit 577717
     .       'support 2 simultaneous hardware events...shutting down.'
Packit 577717
        call ftest_skip(__FILE__, __LINE__,
Packit 577717
     *       'too few counters', num_events)
Packit 577717
      end if
Packit 577717
Packit 577717
      if (tests_quiet .EQ. 0) then
Packit 577717
        print *, 'Number of hardware counters supported: ', num_events
Packit 577717
      end if
Packit 577717
Packit 577717
      call PAPIf_query_event(PAPI_FP_INS, retval)
Packit 577717
      if (retval .NE. PAPI_OK) then
Packit 577717
        event(1) = PAPI_TOT_INS
Packit 577717
      else
Packit 577717
C     Total floating point operations
Packit 577717
        event(1) = PAPI_FP_INS
Packit 577717
      end if
Packit 577717
Packit 577717
C     Time used
Packit 577717
      event(2) = PAPI_TOT_CYC
Packit 577717
Packit 577717
C     matrix 1: read in the matrix values
Packit 577717
      do i=1, nrows1
Packit 577717
        do j=1,ncols1
Packit 577717
          p(i,j) = i*j*1.0
Packit 577717
        end do
Packit 577717
      end do
Packit 577717
Packit 577717
C     matrix 2: read in the matrix values
Packit 577717
      do i=1, nrows2
Packit 577717
        do j=1,ncols2
Packit 577717
          q(i,j) = i*j*1.0
Packit 577717
        end do
Packit 577717
      end do
Packit 577717
Packit 577717
C     Initialize the result matrix 
Packit 577717
      do i=1,nrows1
Packit 577717
        do j=1, ncols2
Packit 577717
          r(i,j) = i*j*1.0
Packit 577717
        end do
Packit 577717
      end do
Packit 577717
      
Packit 577717
C     Set up the counters
Packit 577717
      num_events = 2
Packit 577717
      call PAPIf_start_counters( event, num_events, retval)
Packit 577717
      if ( retval .NE. PAPI_OK ) then
Packit 577717
        call ftest_fail(__FILE__, __LINE__, 
Packit 577717
     *       'PAPIf_start_counters', retval)
Packit 577717
      end if
Packit 577717
Packit 577717
C     Clear the counter values
Packit 577717
      call PAPIf_read_counters(values, num_events,retval)
Packit 577717
      if ( retval .NE. PAPI_OK ) then
Packit 577717
        call ftest_fail(__FILE__, __LINE__, 
Packit 577717
     *       'PAPIf_read_counters', retval)
Packit 577717
      end if
Packit 577717
Packit 577717
C     Compute the matrix-matrix multiplication
Packit 577717
      do i=1,nrows1
Packit 577717
        do j=1,ncols2
Packit 577717
          do k=1,ncols1
Packit 577717
            r(i,j)=r(i,j) + p(i,k)*q(k,j)
Packit 577717
          end do
Packit 577717
        end do
Packit 577717
      end do
Packit 577717
Packit 577717
C     Stop the counters and put the results in the array values 
Packit 577717
      call PAPIf_stop_counters(values,num_events,retval)
Packit 577717
      if ( retval .NE. PAPI_OK ) then
Packit 577717
        call ftest_fail(__FILE__, __LINE__, 
Packit 577717
     *       'PAPIf_stop_counters', retval)
Packit 577717
      end if
Packit 577717
Packit 577717
C     Make sure the compiler does not optimize away the multiplication
Packit 577717
      call dummy(r)
Packit 577717
Packit 577717
      if (tests_quiet .EQ. 0) then
Packit 577717
Packit 577717
        if (event(1) .EQ. PAPI_TOT_INS) then
Packit 577717
          print *, 'TOT Instructions:  ',values(1)
Packit 577717
        else
Packit 577717
          print *, 'FP Instructions:  ',values(1)
Packit 577717
        end if
Packit 577717
Packit 577717
        print *, 'Cycles: ',values(2)
Packit 577717
Packit 577717
        if (event(1) .EQ. PAPI_FP_INS) then
Packit 577717
          write(*,'(a,f9.6)') ' Efficiency (flops/cycles):',
Packit 577717
     &         real(values(1))/real(values(2))
Packit 577717
C     Compare measured FLOPS to expected value
Packit 577717
          tmp=2.0*real(nrows1)*real(ncols2)*real(ncols1)
Packit 577717
          if(abs(values(1)-tmp).gt.tmp*0.05)then
Packit 577717
C     Maybe we are counting FMAs?
Packit 577717
            tmp=tmp/2.0
Packit 577717
            if(abs(values(1)-tmp).gt.tmp*0.05)then
Packit 577717
              print *,'Expected operation count:',2.0*tmp
Packit 577717
              print *,'Or possibly (using FMA): ',tmp
Packit 577717
              print *,'Instead I got:           ',values(1)
Packit 577717
              call ftest_fail(__FILE__, __LINE__, 
Packit 577717
     *             'Unexpected FLOP count (check vector operations)', 1)
Packit 577717
            end if
Packit 577717
          end if
Packit 577717
        end if
Packit 577717
      end if
Packit 577717
Packit 577717
      call ftests_pass(__FILE__)
Packit 577717
      end