使用c++
init Papi之后,我想知道FLOPS,但是我发现PAPI_SP_OPS剩余0
执行。时间(毫秒):53.282 PAPI_FP_OPS:0 PAPI_TOT_CYC:158771364 MFLOPS:0.000
我确定我已经链接了 papi 库。
也许我的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()
这是我的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
这是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
//------------------------------------------------------------------------------
我确定我已经链接了 PAPI
浮动操作的使用
PAPI_DP_OPS
双重操作使用
PAPI_DP_OPS