#include "fpapi_test.h"

      program cost
      implicit integer (p)
      
      integer es
      integer*8 values(10)
      integer*8 ototcyc, ntotcyc
      integer*4 i
      integer retval

      Integer last_char
      External last_char
      integer tests_quiet, get_quiet
      external get_quiet

      tests_quiet = get_quiet()
      es = PAPI_NULL

      if (tests_quiet .EQ. 0) then
      print *, "Cost of execution for PAPI start/stop",
     *" and PAPI read."
      print *, "This test takes a while. Please be patient..."
      end if

      retval = PAPI_VER_CURRENT
      call PAPIf_library_init(retval)
      if ( retval.NE.PAPI_VER_CURRENT) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPI_library_init', retval)
      end if

      call PAPIf_query_event(PAPI_TOT_CYC, retval)
      if ( retval.NE.PAPI_OK) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_query_event', retval)
      end if

      call PAPIf_query_event(PAPI_TOT_INS, retval)
      if ( retval.NE.PAPI_OK) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_query_event', retval)
      end if

      call PAPIf_create_eventset(es, retval)
      if ( retval.NE.PAPI_OK) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_create_eventset', 
     *retval)
      end if

      call PAPIf_add_event( es, PAPI_TOT_CYC, retval )
      if ( retval .NE. PAPI_OK ) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_add_event', retval)
      end if

      call PAPIf_add_event( es, PAPI_TOT_INS, retval )
      if ( retval .NE. PAPI_OK ) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_add_event', retval)
      end if

      if (tests_quiet .EQ. 0) then
      print *, "Performing start/stop test..."
      end if

      call PAPIf_start(es, retval)
      if ( retval .NE. PAPI_OK ) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_start', retval)
      end if

      call PAPIf_stop(es, values(1), retval)
      if ( retval .NE. PAPI_OK ) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_stop', retval)
      end if

      call PAPIf_get_real_cyc(ototcyc)
      
      do i=0, 50000
         call PAPIf_start(es, retval)
         call PAPIf_stop(es, values(1), retval)
      end do
      
      call PAPIf_get_real_cyc(ntotcyc)
      ntotcyc=ntotcyc-ototcyc

      if (tests_quiet .EQ. 0) then
      print *
      print *
      print *, "Total cost for PAPI_start/stop(2 counters) over",
     *" 50000 iterations:"
      write (*, 100) ntotcyc, "total cyc"
      write (*, 200) REAL(ntotcyc)/50001.0, "cyc/call pair"
      print *
      print *
      
C     Start the read val
      
      print *, "Performing read test..."
      end if

      call PAPIf_start(es, retval)
      if ( retval .NE. PAPI_OK ) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_start', retval)
      end if

      call PAPIf_get_real_cyc(ototcyc)

      do i=0, 50000
         call PAPIf_read(es, values(1), retval)
      end do
      
      call PAPIf_stop(es, values(1), retval)
      if ( retval .NE. PAPI_OK ) then
        call ftest_fail(__FILE__, __LINE__,
     . 'PAPIf_stop', retval)
      end if

      call PAPIf_get_real_cyc(ntotcyc)


      ntotcyc=ntotcyc-ototcyc

      if (tests_quiet .EQ. 0) then
      print *
      print *, "User level cost for PAPI_read(2 counters) over",
     *" 50000 iterations:"
      print *
      print *, "Total cost for PAPI_read(2 counters) over ",
     *"50000 iterations:"
      write (*, 100) ntotcyc, "total cyc"
      write (*, 200) REAL(ntotcyc)/50001.0, "cyc/call"
      end if

 100  format (I15, A15)
 200  format (F15.6, A15)
      call ftests_pass(__FILE__)
      end

