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
Float ops use
Double ops use