Blame src/ftests/fmatrixlowpapi.F

Packit Service a1973e
C ****************************************************************************
Packit Service a1973e
C
Packit Service a1973e
C matrixpapi.f
Packit Service a1973e
C An example of matrix-matrix multiplication and using PAPI low level to 
Packit Service a1973e
C look at the performance. written by Kevin London
Packit Service a1973e
C March 2000
Packit Service a1973e
C ****************************************************************************
Packit Service a1973e
Packit Service a1973e
#include "fpapi_test.h"
Packit Service a1973e
Packit Service a1973e
      program fmatrixlowpapi
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,k,retval,nchr,numevents,EventSet
Packit Service a1973e
      CHARACTER*(PAPI_MAX_STR_LEN)  vstring,mstring
Packit Service a1973e
C   PAPI values of the counters
Packit Service a1973e
      INTEGER event
Packit Service a1973e
      INTEGER*8 values(2)
Packit Service a1973e
      INTEGER*8 starttime,stoptime
Packit Service a1973e
      REAL*8 finaltime
Packit Service a1973e
      INTEGER ncpu,nnodes,totalcpus,vendor,model
Packit Service a1973e
      REAL revision, mhz
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
      EventSet = PAPI_NULL
Packit Service a1973e
Packit Service a1973e
C   Setup default values
Packit Service a1973e
      numevents=0
Packit Service a1973e
      starttime=0
Packit Service a1973e
      stoptime=0
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     Create the eventset
Packit Service a1973e
      call PAPIf_create_eventset(EventSet,retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__, 
Packit Service a1973e
     *'PAPIf_create_eventset', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C   Total cycles
Packit Service a1973e
      call PAPIf_add_event(EventSet,PAPI_TOT_CYC,retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__, 
Packit Service a1973e
     *'PAPIf_add_event PAPI_TOT_CYC', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C   Total [floating point] instructions
Packit Service a1973e
        call PAPIf_query_event(PAPI_FP_INS, retval)
Packit Service a1973e
        if (retval .NE. PAPI_OK) then
Packit Service a1973e
        event = PAPI_TOT_INS 
Packit Service a1973e
        else
Packit Service a1973e
        event = PAPI_FP_INS 
Packit Service a1973e
        end if
Packit Service a1973e
Packit Service a1973e
      call PAPIf_add_event(EventSet,event,retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__, 
Packit Service a1973e
     *'PAPIf_add_event PAPI_TOT_INS', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C   Grab the hardware info
Packit Service a1973e
      call PAPIf_get_hardware_info( ncpu, nnodes, totalcpus, vendor,
Packit Service a1973e
     .   vstring, model, mstring, revision, mhz )
Packit Service a1973e
      do i=len(mstring),1,-1
Packit Service a1973e
        if(mstring(i:i).NE.' ') goto 10
Packit Service a1973e
      end do
Packit Service a1973e
 10   if(i.LT.1)then 
Packit Service a1973e
        nchr=1
Packit Service a1973e
      else
Packit Service a1973e
        nchr=i
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
      if (tests_quiet .EQ. 0) then
Packit Service a1973e
      print *
Packit Service a1973e
      print 100, totalcpus,mstring(1:nchr), mhz
Packit Service a1973e
      print *
Packit Service a1973e
      print 101,'ncpu',ncpu, 'nnodes',nnodes, 'totalcpus',totalcpus
Packit Service a1973e
      print 102,'mhz',mhz,'revision',revision
Packit Service a1973e
      print 103,'vendor',vendor,'vstring',vstring
Packit Service a1973e
      print 104,'model',model,'mstring',mstring
Packit Service a1973e
      print *
Packit Service a1973e
      end if
Packit Service a1973e
 100  format(i5,' CPU(s) ',a,' at ',f7.2,' MHz')
Packit Service a1973e
 101  format(a9,' =',i6,7x,a9,' =',i5,5x,a9,'=',i5)
Packit Service a1973e
 102  format(a9,' =',f7.2,6x,a9,' =',f15.5)
Packit Service a1973e
 103  format(a9,' =',i6,7x,a9,' =',a40)
Packit Service a1973e
 104  format(a9,' =',i6,7x,a9,' =',a40)
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
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  Grab the beginning time
Packit Service a1973e
      call PAPIf_get_real_usec( starttime )
Packit Service a1973e
 
Packit Service a1973e
C  Start the event counters
Packit Service a1973e
      call PAPIf_start( EventSet, retval )
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__,
Packit Service a1973e
     . 'PAPIf_start', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
C  Compute the matrix-matrix multiplication
Packit Service a1973e
      do i=1,nrows1 
Packit Service a1973e
       do j=1,ncols2 
Packit Service a1973e
         do k=1,ncols1 
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  Stop the counters and put the results in the array values 
Packit Service a1973e
      call PAPIf_stop(EventSet,values,retval)
Packit Service a1973e
      if ( retval .NE. PAPI_OK ) then
Packit Service a1973e
        call ftest_fail(__FILE__, __LINE__,
Packit Service a1973e
     . 'PAPIf_stop', retval)
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
      call PAPIf_get_real_usec( stoptime )
Packit Service a1973e
      finaltime=(REAL(stoptime)/1000000.0)-(REAL(starttime)/1000000.0)
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
      if (tests_quiet .EQ. 0) then
Packit Service a1973e
        print *, 'Time: ', finaltime, 'seconds'
Packit Service a1973e
        print *, 'Cycles: ', values(1)
Packit Service a1973e
Packit Service a1973e
          if (event .EQ. PAPI_TOT_INS) then
Packit Service a1973e
          print *, 'Total Instructions: ', values(2)
Packit Service a1973e
          else
Packit Service a1973e
          print *, 'FP Instructions: ', values(2)
Packit Service a1973e
          write(*,'(a,f9.6)') ' Efficiency (fp/cycle):',
Packit Service a1973e
     &                         real(values(2))/real(values(1))
Packit Service a1973e
          end if
Packit Service a1973e
      end if
Packit Service a1973e
Packit Service a1973e
      call ftests_pass(__FILE__)
Packit Service a1973e
      end
Packit Service a1973e