Using papi, PAPI_SP_OPS remains 0

62 views Asked by At

using c++

After init Papi, I want to know the FLOPS, but I found PAPI_SP_OPS remaining 0

Exec. time (ms): 53.282 PAPI_FP_OPS: 0 PAPI_TOT_CYC: 158771364 MFLOPS: 0.000

I'm sure I have linked the papi library.

Maybe there is something wrong with my cmakelist.txt

find_program(PAPI_FOUND papi_avail)
if(PAPI_FOUND)
  message(STATUS "PAPI found")
  link_libraries(papi)
  add_compile_definitions(PAPI)
endif()



if(OpenMP_FOUND)
  target_link_libraries(kernel_main m OpenMP::OpenMP_CXX ${PAPI_LIBRARIES})
  target_link_libraries(kernel_opt m OpenMP::OpenMP_CXX ${PAPI_LIBRARIES})
  
else()
  target_link_libraries(kernel_main m ${PAPI_LIBRARIES})
  target_link_libraries(kernel_opt m ${PAPI_LIBRARIES})
 
endif()

This is my main.cpp

#ifdef PAPI
// init counters
  long long StartTime;
  long long StopTime;
  InitPapi();
  StartTime = PapiStartCounters();    
#endif

...do some stuff

#ifdef PAPI
    StopTime  = PapiStopCounters ();
    PrintPapiResults( "Kernel main", StartTime, StopTime);
#endif

This is the papi.cpp

static const int NUM_EVENTS = 2;
static int       EVENTS[NUM_EVENTS] = {PAPI_SP_OPS, PAPI_TOT_CYC};
static long long VALUES[NUM_EVENTS];



/*
 * Init PAPI
 */
void InitPapi(){
    
   //int retval = 0;
    
   /* Start Init library */
   if(PAPI_library_init(PAPI_VER_CURRENT) != PAPI_VER_CURRENT )
     {
     fprintf(stderr,"PAPI Library initialization error! %d\n",  __LINE__);
     exit(1);
   }    
  
}// end InitPapi
//-----------------------------------------------------------------------------


/*
 * Start papi counters and return time
 */
long long PapiStartCounters(){

   int retval = 0;
    
/* Start counting events */
   if ((retval = PAPI_start_counters(EVENTS, NUM_EVENTS)) != PAPI_OK)
   {
    fprintf(stderr,"PAPI Start counter error! %d, %d\n",  retval, __LINE__);
    exit(1);
   }    

   return(PAPI_get_real_usec());  
}// end of Papi_Start_Counters
//------------------------------------------------------------------------------

/*
 * Stop Papi counters
 */
long long PapiStopCounters(){

   long long StopTime = PAPI_get_real_usec();  
   int retval = 0;
   
    /* Stop counting events */
    if ((retval = PAPI_stop_counters(VALUES, NUM_EVENTS)) != PAPI_OK){    
       fprintf(stderr,"PAPI stop counters error! %d, %d\n", retval, __LINE__);
       exit(1);
    }

   return (StopTime);
}// end of PapiStopCounters
//------------------------------------------------------------------------------

/*
 * Print Papi results
 */
void PrintPapiResults( const char * RoutineName, 
                       long long StartTime, long long StopTime){
    
    fprintf(stderr,"_____Routine: %s_______\n", RoutineName); 
    fprintf(stderr,"Exec. time (ms): %20.3f\n", (StopTime - StartTime)/ (double)1000);
    fprintf(stderr,"PAPI_FP_OPS:     %20lld\n", VALUES[0]);
    fprintf(stderr,"PAPI_TOT_CYC:    %20lld\n", VALUES[1]);
    fprintf(stderr,"MFLOPS:          %20.3f\n",  (double) VALUES[0] / (double) (StopTime - StartTime));
    
}// end of PrintPapiResults
//------------------------------------------------------------------------------

I'm sure I have linked PAPI

1

There are 1 answers

0
Beute On

Float ops use

PAPI_SP_OPS

Double ops use

PAPI_DP_OPS