Interfacing with PAPI : Low level interface for Fortran

           PROGRAM testpapi
           
           include 'f77papi.h'
           integer check, evntst
           integer*8 t0, t1, c0, c1, value
     
           check = PAPI_NULL
     C
     C     PAPI Initialization
     C
           check = PAPI_VER_CURRENT
           call PAPIF_library_init(check)
           if (check.ne.PAPI_VER_CURRENT) then
              write(6,*) 'PAPI init error'
              write(6,*) '00 check:', check, PAPI_VER_CURRENT
              stop
           endif
     C
     C     PAPI Event Set Creation
     C
           evntst = PAPI_NULL
           call PAPIF_create_eventset(evntst, check)
           if (check.ne.PAPI_OK) then
              write(6,*) 'PAPI event set creation error'
              write(6,*) '01 check:', check, PAPI_OK
              stop
           endif
     C
     C     PAPI Specify a Particular Target Event to Analyze
     C       PAPI_TOT_CYC         Total cycles executed         
     C       PAPI_FP_OPS          Floating point operations executed
     C       PAPI_L1_DCM          Level 1 data cache misses          
     C       PAPI_L2_DCM          Level 2 data cache misses          
     C       for other events see /opt/sw/x86_64/glibc-2.12/ivybridge-ep/papi/5.4.3/gnu-4.4.7/include/papiStdEventDefs.h
     C
           call PAPIF_add_event(evntst, PAPI_FP_OPS, check)
           if (check.ne.PAPI_OK) then
              write(6,*) 'PAPI event set adding error'
              write(6,*) '02 check:', check, PAPI_OK
              stop
           endif
     C
     C     PAPI Time Estimators Initialization                
     C        
           call PAPIF_get_real_usec(t0)
           call PAPIF_get_real_cyc(c0)
     C
     C     PAPI Counting Start                                
     C        
           call PAPIF_start(evntst, check)
           if (check.ne.PAPI_OK) then
              write(6,*) 'PAPI start error !'
              write(6,*) '03 check:', check, PAPI_OK
              stop
           endif
     
     C
     C     *** Here follows the original code section to be analyzed ***
     C
     
     C      
     C     PAPI Counting Stop                                 
     C        
           call PAPIF_stop(evntst, value, check)
           if (check.ne.PAPI_OK) then
              write(6,*) 'PAPI stop error !'
              write(6,*) '04 check:', check, PAPI_OK
              stop
           endif
     C      
     C     PAPI Time Estimators Stop                          
     C        
           call PAPIF_get_real_usec(t1)
           call PAPIF_get_real_cyc(c1)
     C      
     C     PAPI Results                                       
     C        
           write(6,'(a17,8x,i20)') 'PAPI event count ', value
           write(6,'(a25,i20)') 'PAPI time passed in usec ', t1 - t0
           write(6,'(a19,6x,i20)') 'PAPI cycles passed ', c1 - c0
     C      
     C     PAPI Free Event Set                                
     C        
           call PAPIF_cleanup_eventset(evntst, check)
           if (check.ne.PAPI_OK) then
              write(6,*) 'PAPI event set cleanup error !'
              write(6,*) '05 check:', check, PAPI_OK
              stop
           endif
           call PAPIF_destroy_eventset(evntst, check)
           if (check.ne.PAPI_OK) then
              write(6,*) 'PAPI event set destruction error !'
              write(6,*) '06 check:', check, PAPI_OK
              stop
           endif
     C      
     C     PAPI Finalize                                      
     C        
           call PAPIF_shutdown(check)
           if (check.ne.PAPI_OK) then
              write(6,*) 'PAPI finalize failed !'
              write(6,*) '07 check:', check, PAPI_OK
              stop
           endif
           
           END PROGRAM