The Gaudi Framework  v33r0 (d5ea422b)
PerfMonAuditor Class Reference

Performance Monitoring Auditor that uses Perfmon2 library to monitor algorithms. More...

Inheritance diagram for PerfMonAuditor:
Collaboration diagram for PerfMonAuditor:

Public Member Functions

void before (StandardEventType evt, INamedInterface *alg) override
 
void after (StandardEventType evt, INamedInterface *alg, const StatusCode &sc) override
 
StatusCode initialize () override
 
StatusCode finalize () override
 
int is_nehalem ()
 
 PerfMonAuditor (const std::string &name, ISvcLocator *pSvc)
 
virtual ~PerfMonAuditor ()
 
void after (StandardEventType, INamedInterface *, const StatusCode &) override
 
void after (StandardEventType, const std::string &, const StatusCode &) override
 
void after (CustomEventTypeRef, INamedInterface *, const StatusCode &) override
 
void after (CustomEventTypeRef, const std::string &, const StatusCode &) override
 
void before (StandardEventType, INamedInterface *) override
 The following methods are meant to be implemented by the child class... More...
 
void before (StandardEventType, const std::string &) override
 
void before (CustomEventTypeRef, INamedInterface *) override
 
void before (CustomEventTypeRef, const std::string &) override
 
- Public Member Functions inherited from Auditor
 Auditor (const std::string &name, ISvcLocator *svcloc)
 Constructor. More...
 
 Auditor (const Auditor &a)=delete
 
Auditoroperator= (const Auditor &rhs)=delete
 
StatusCode sysInitialize () override
 Initialization method invoked by the framework. More...
 
StatusCode sysFinalize () override
 Finalization method invoked by the framework. More...
 
void before (StandardEventType, INamedInterface *) override
 The following methods are meant to be implemented by the child class... More...
 
void before (StandardEventType, const std::string &) override
 
void before (CustomEventTypeRef, INamedInterface *) override
 
void before (CustomEventTypeRef, const std::string &) override
 
void after (StandardEventType, INamedInterface *, const StatusCode &) override
 
void after (StandardEventType, const std::string &, const StatusCode &) override
 
void after (CustomEventTypeRef, INamedInterface *, const StatusCode &) override
 
void after (CustomEventTypeRef, const std::string &, const StatusCode &) override
 
void beforeInitialize (INamedInterface *) override
 
void afterInitialize (INamedInterface *) override
 
void beforeReinitialize (INamedInterface *) override
 
void afterReinitialize (INamedInterface *) override
 
void beforeExecute (INamedInterface *) override
 
void afterExecute (INamedInterface *, const StatusCode &) override
 
void beforeFinalize (INamedInterface *) override
 
void afterFinalize (INamedInterface *) override
 
const std::stringname () const override
 
bool isEnabled () const override
 
SmartIF< ISvcLocator > & serviceLocator () const override
 The standard service locator. More...
 
template<class T >
StatusCode service (const std::string &name, T *&svc, bool createIf=false) const
 Access a service by name, creating it if it doesn't already exist. More...
 
template<class T = IService>
SmartIF< T > service (const std::string &name, bool createIf=false) const
 
StatusCode setProperties ()
 Set the auditor's properties. More...
 
- Public Member Functions inherited from PropertyHolder< CommonMessaging< implements< IAuditor, IProperty > > >
 PropertyHolder ()=default
 
Gaudi::Details::PropertyBasedeclareProperty (Gaudi::Details::PropertyBase &prop)
 Declare a property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none")
 Helper to wrap a regular data member and use it as a regular property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, Gaudi::Property< TYPE, VERIFIER, HANDLERS > &prop, const std::string &doc="none")
 Declare a PropertyBase instance setting name and documentation. More...
 
Gaudi::Details::PropertyBasedeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="")
 Declare a remote property. More...
 
StatusCode setProperty (const Gaudi::Details::PropertyBase &p) override
 set the property form another property More...
 
StatusCode setProperty (const std::string &s) override
 set the property from the formatted string More...
 
StatusCode setProperty (const std::string &n, const std::string &v) override
 set the property from name and the value More...
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value More...
 
StatusCode getProperty (Gaudi::Details::PropertyBase *p) const override
 get the property More...
 
const Gaudi::Details::PropertyBasegetProperty (const std::string &name) const override
 get the property by name More...
 
StatusCode getProperty (const std::string &n, std::string &v) const override
 convert the property to the string More...
 
const std::vector< Gaudi::Details::PropertyBase * > & getProperties () const override
 get all properties More...
 
bool hasProperty (const std::string &name) const override
 Return true if we have a property with the given name. More...
 
 PropertyHolder (const PropertyHolder &)=delete
 
PropertyHolderoperator= (const PropertyHolder &)=delete
 
- Public Member Functions inherited from CommonMessaging< implements< IAuditor, IProperty > >
MSG::Level msgLevel () const
 get the cached level (originally extracted from the embedded MsgStream) More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
MSG::Level outputLevel () const
 Backward compatibility function for getting the output level. More...
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor. More...
 
const SmartIF< IMessageSvc > & msgSvc () const
 The standard message service. More...
 
MsgStreammsgStream () const
 Return an uninitialized MsgStream. More...
 
MsgStreammsgStream (const MSG::Level level) const
 Predefined configurable message stream for the efficient printouts. More...
 
MsgStreamalways () const
 shortcut for the method msgStream(MSG::ALWAYS) More...
 
MsgStreamfatal () const
 shortcut for the method msgStream(MSG::FATAL) More...
 
MsgStreamerr () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamerror () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamwarning () const
 shortcut for the method msgStream(MSG::WARNING) More...
 
MsgStreaminfo () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MsgStreamdebug () const
 shortcut for the method msgStream(MSG::DEBUG) More...
 
MsgStreamverbose () const
 shortcut for the method msgStream(MSG::VERBOSE) More...
 
MsgStreammsg () const
 shortcut for the method msgStream(MSG::INFO) More...
 

Private Types

typedef GaudiUtils::VectorMap< const INamedInterface *, int > Map
 

Private Member Functions

void i_beforeInitialize (INamedInterface *alg)
 
void i_afterInitialize (INamedInterface *alg)
 
void i_beforeExecute (INamedInterface *alg)
 
void i_afterExecute (INamedInterface *alg)
 
 PerfMonAuditor ()
 
 PerfMonAuditor (const PerfMonAuditor &)
 
PerfMonAuditoroperator= (const PerfMonAuditor &)
 
void startpm ()
 
void pausepm ()
 
void stoppm ()
 
void finalizepm ()
 
int detect_unavail_pmu_regs (int fd, pfmlib_regmask_t *r_pmcs, pfmlib_regmask_t *r_pmds)
 
int detect_unavail_pmcs (int fd, pfmlib_regmask_t *r_pmcs)
 
void pfm_bv_set (uint64_t *bv, uint16_t rnum)
 
int pfm_bv_isset (uint64_t *bv, uint16_t rnum)
 
void pfm_bv_copy (uint64_t *d, uint64_t *j, uint16_t n)
 
void start_smpl ()
 
void stop_smpl ()
 
void finalize_smpl ()
 

Static Private Member Functions

static void process_smpl_buf (pfm_dfl_smpl_hdr_t *hdr, size_t entry_size)
 
static void sigio_handler (int, siginfo_t *, void *)
 

Private Attributes

PFMon & m_pfm
 
Map m_map
 
int m_indent
 
bool m_inEvent
 
int is_nehalem_ret
 
pfmlib_input_param_t inp
 
pfmlib_output_param_t outp
 
pfarg_ctx_t ctx
 
pfarg_pmd_t pd [NUM_PMDS]
 
pfarg_pmc_t pc [NUM_PMCS]
 
pfarg_load_t load_arg
 
int fd
 
unsigned int i
 
int ret {0}
 
std::string event_str [MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
 
std::string prefix
 
std::string family
 
char event_cstr [MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS][MAX_EVENT_NAME_LENGTH]
 
char prefix_cstr [MAX_PREFIX_NAME_LENGTH]
 
unsigned int ph_ev_count {0}
 
bool inv [MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
 
unsigned int cmask [MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
 
unsigned int start_at_event
 
pfmlib_core_input_param_t params
 
pfmlib_nhm_input_param_t nhm_params
 
int used_counters_number
 
bool nehalem
 
bool westmere
 
bool core
 
bool sampling
 
pfm_dfl_smpl_arg_t buf_arg
 
pfarg_load_t load_args
 
void * buf_addr
 
unsigned num_counters
 
unsigned int max_pmd
 
pfmlib_options_t pfmlib_options
 
int level
 
bool first_alg
 
std::string first_alg_name
 
bool event_count_reached
 

Additional Inherited Members

- Public Types inherited from Auditor
using Factory = Gaudi::PluginService::Factory< IAuditor *(const std::string &, ISvcLocator *)>
 
- Public Types inherited from PropertyHolder< CommonMessaging< implements< IAuditor, IProperty > > >
using PropertyHolderImpl = PropertyHolder< CommonMessaging< implements< IAuditor, IProperty > > >
 Typedef used to refer to this class from derived classes, as in. More...
 
- Public Types inherited from CommonMessaging< implements< IAuditor, IProperty > >
using base_class = CommonMessaging
 
- Protected Member Functions inherited from PropertyHolder< CommonMessaging< implements< IAuditor, IProperty > > >
Gaudi::Details::PropertyBaseproperty (const std::string &name) const
 
- Protected Member Functions inherited from CommonMessaging< implements< IAuditor, IProperty > >
MSG::Level setUpMessaging () const
 Set up local caches. More...
 
MSG::Level resetMessaging ()
 Reinitialize internal states. More...
 
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 

Detailed Description

Performance Monitoring Auditor that uses Perfmon2 library to monitor algorithms.

Author
Daniele Francesco KRUSE danie.nosp@m.le.f.nosp@m.rance.nosp@m.sco..nosp@m.kruse.nosp@m.@cer.nosp@m.n.ch
Date
2009-10-28

Definition at line 208 of file PerfMonAuditor.cpp.

Member Typedef Documentation

◆ Map

Definition at line 360 of file PerfMonAuditor.cpp.

Constructor & Destructor Documentation

◆ PerfMonAuditor() [1/3]

PerfMonAuditor::PerfMonAuditor ( const std::string name,
ISvcLocator pSvc 
)
inline

Definition at line 281 of file PerfMonAuditor.cpp.

282  : // standard constructor
283  Auditor( name, pSvc )
284  , m_pfm( PFMon::instance() )
285  , m_map()
286  , m_indent( 0 )
287  , m_inEvent( false ) {
289  declareProperty( "EVENT0", event_str[0] );
290  declareProperty( "EVENT1", event_str[1] );
291  declareProperty( "EVENT2", event_str[2] );
292  declareProperty( "EVENT3", event_str[3] );
293  declareProperty( "FAMILY", family );
294  declareProperty( "PREFIX", prefix );
295  declareProperty( "INV0", inv[0] );
296  declareProperty( "INV1", inv[1] );
297  declareProperty( "INV2", inv[2] );
298  declareProperty( "INV3", inv[3] );
299  declareProperty( "CMASK0", cmask[0] );
300  declareProperty( "CMASK1", cmask[1] );
301  declareProperty( "CMASK2", cmask[2] );
302  declareProperty( "CMASK3", cmask[3] );
303  declareProperty( "SP0", sp[0] );
304  declareProperty( "SP1", sp[1] );
305  declareProperty( "SP2", sp[2] );
306  declareProperty( "SP3", sp[3] );
307  declareProperty( "SAMPLE", sampling );
308  declareProperty( "START_AT_EVENT", start_at_event );
309  declareProperty( "IS_NEHALEM", is_nehalem_ret );
310 
312  /*
313  // loading functions from PFM library
314  void* handle = dlopen("libpfm.so", RTLD_NOW);
315  if (!handle) {
316  // error() << "Cannot open library: " << dlerror() << endmsg;
317  }
318  typedef void (*hello_t)();
319  hello_t hello = (hello_t) dlsym(handle, "hello");
320  if (!hello) {
321  // error() << "Cannot load symbol 'hello': " << dlerror() << endmsg;
322  dlclose(handle);
323  }
324 
325  pfm_start = (pfm_start_t) dlsym(handle, "pfm_start");
326  pfm_stop = (pfm_stop_t) dlsym(handle, "pfm_stop");
327  pfm_self_stop = (pfm_self_stop_t) dlsym(handle, "pfm_stop"); //it's the same
328  pfm_restart = (pfm_restart_t) dlsym(handle, "pfm_restart");
329  //pfm_read_pmds = (pfm_read_pmds_t) dlsym(handle, "pfm_read_pmds");
330  pfm_initialize = (pfm_initialize_t) dlsym(handle, "pfm_initialize");
331  pfm_find_full_event = (pfm_find_full_event_t) dlsym(handle, "pfm_find_full_event");
332  pfm_dispatch_events = (pfm_dispatch_events_t) dlsym(handle, "pfm_dispatch_events");
333  pfm_create_context = (pfm_create_context_t) dlsym(handle, "pfm_create_context");
334  pfm_write_pmcs = (pfm_write_pmcs_t) dlsym(handle, "pfm_write_pmcs");
335  pfm_write_pmds = (pfm_write_pmds_t) dlsym(handle, "pfm_write_pmds");
336  pfm_load_context = (pfm_load_context_t) dlsym(handle, "pfm_load_context");
337  pfm_strerror = (pfm_strerror_t) dlsym(handle, "pfm_strerror");
338  pfm_set_options = (pfm_set_options_t) dlsym(handle, "pfm_set_options");
339  pfm_get_num_counters = (pfm_get_num_counters_t) dlsym(handle, "pfm_get_num_counters");
340  // use it to do the calculation
341  // info() << "Calling hello..." << endmsg;
342  // hello();
343 
344  // close the library
345  // info() << "Closing library..." << endmsg;
346  dlclose(handle);
347  */
348 
350  }
std::string family
bool inv[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Details::PropertyBase &prop)
Declare a property.
std::string event_str[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
Auditor(const std::string &name, ISvcLocator *svcloc)
Constructor.
Definition: Auditor.cpp:22
std::string prefix
unsigned int start_at_event
const std::string & name() const override
Definition: Auditor.cpp:187
unsigned int cmask[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]

◆ ~PerfMonAuditor()

virtual PerfMonAuditor::~PerfMonAuditor ( )
inlinevirtual

Definition at line 352 of file PerfMonAuditor.cpp.

352 {} // virtual destructor

◆ PerfMonAuditor() [2/3]

PerfMonAuditor::PerfMonAuditor ( )
private

◆ PerfMonAuditor() [3/3]

PerfMonAuditor::PerfMonAuditor ( const PerfMonAuditor )
private

Member Function Documentation

◆ after() [1/5]

void PerfMonAuditor::after ( StandardEventType  evt,
INamedInterface alg,
const StatusCode sc 
)
override

Definition at line 903 of file PerfMonAuditor.cpp.

903  {
904  switch ( evt ) {
907  break;
908  case IAuditor::Execute:
909  i_afterExecute( alg );
910  break;
911  default:
912  break;
913  }
914  return;
915 }
void i_afterExecute(INamedInterface *alg)
void i_afterInitialize(INamedInterface *alg)

◆ after() [2/5]

void Auditor::after
override

Definition at line 107 of file Auditor.cpp.

107  {
108  switch ( evt ) {
109  case Initialize:
110  afterInitialize( obj );
111  break;
112  case ReInitialize:
113  afterReinitialize( obj );
114  break;
115  case Execute:
116  afterExecute( obj, sc );
117  break;
118  case Finalize:
119  afterFinalize( obj );
120  break;
121  case Start:
122  break;
123  case Stop:
124  break;
125  case ReStart:
126  break;
127  default:
128  break; // do nothing
129  }
130 }
void afterExecute(INamedInterface *, const StatusCode &) override
Definition: Auditor.cpp:141
void afterInitialize(INamedInterface *) override
Definition: Auditor.cpp:137
void afterFinalize(INamedInterface *) override
Definition: Auditor.cpp:143
void afterReinitialize(INamedInterface *) override
Definition: Auditor.cpp:139

◆ after() [3/5]

void Auditor::after
override

Definition at line 131 of file Auditor.cpp.

131 {}

◆ after() [4/5]

void Auditor::after
override

Definition at line 133 of file Auditor.cpp.

133 {}

◆ after() [5/5]

void Auditor::after
override

Definition at line 134 of file Auditor.cpp.

134 {}

◆ before() [1/5]

void PerfMonAuditor::before ( StandardEventType  evt,
INamedInterface alg 
)
override

Definition at line 889 of file PerfMonAuditor.cpp.

889  {
890  switch ( evt ) {
893  break;
894  case IAuditor::Execute:
895  i_beforeExecute( alg );
896  break;
897  default:
898  break;
899  }
900  return;
901 }
void i_beforeExecute(INamedInterface *alg)
void i_beforeInitialize(INamedInterface *alg)

◆ before() [2/5]

void Auditor::before
override

Definition at line 104 of file Auditor.cpp.

104 {}

◆ before() [3/5]

void Auditor::before
override

Definition at line 103 of file Auditor.cpp.

103 {}

◆ before() [4/5]

void Auditor::before
override

The following methods are meant to be implemented by the child class...

Definition at line 77 of file Auditor.cpp.

77  {
78  switch ( evt ) {
79  case Initialize:
80  beforeInitialize( obj );
81  break;
82  case ReInitialize:
83  beforeReinitialize( obj );
84  break;
85  case Execute:
86  beforeExecute( obj );
87  break;
88  case Finalize:
89  beforeFinalize( obj );
90  break;
91  case Start:
92  break;
93  case Stop:
94  break;
95  case ReStart:
96  break;
97  default:
98  break; // do nothing
99  }
100 }
void beforeInitialize(INamedInterface *) override
Definition: Auditor.cpp:136
void beforeExecute(INamedInterface *) override
Definition: Auditor.cpp:140
void beforeReinitialize(INamedInterface *) override
Definition: Auditor.cpp:138
void beforeFinalize(INamedInterface *) override
Definition: Auditor.cpp:142

◆ before() [5/5]

void Auditor::before
override

Definition at line 101 of file Auditor.cpp.

101 {}

◆ detect_unavail_pmcs()

int PerfMonAuditor::detect_unavail_pmcs ( int  fd,
pfmlib_regmask_t r_pmcs 
)
inlineprivate

Definition at line 399 of file PerfMonAuditor.cpp.

399 { return detect_unavail_pmu_regs( fd, r_pmcs, NULL ); }
int detect_unavail_pmu_regs(int fd, pfmlib_regmask_t *r_pmcs, pfmlib_regmask_t *r_pmds)

◆ detect_unavail_pmu_regs()

int PerfMonAuditor::detect_unavail_pmu_regs ( int  fd,
pfmlib_regmask_t r_pmcs,
pfmlib_regmask_t r_pmds 
)
private

◆ finalize()

StatusCode PerfMonAuditor::finalize ( )
overridevirtual

Reimplemented from Auditor.

Definition at line 881 of file PerfMonAuditor.cpp.

881  {
882  if ( sampling == 0 )
883  finalizepm();
884  else
885  finalize_smpl();
886  return Auditor::finalize();
887 }
virtual StatusCode finalize()
Definition: Auditor.cpp:185

◆ finalize_smpl()

void PerfMonAuditor::finalize_smpl ( )
private

Definition at line 800 of file PerfMonAuditor.cpp.

800  {
801  int err;
802  for ( int i = 0; i < used_counters_number; i++ ) {
804  filename += '_';
805  filename += event_cstr[i];
806 
807  for ( auto& c : filename )
808  if ( c == ':' ) c = '-';
809 
810  if ( inv[i] ) filename += "_INV_1";
811  if ( cmask[i] > 0 ) filename += "_CMASK_" + std::to_string( cmask[i] );
812  filename += ".txt.gz";
813 
814  gzFile outfile = gzopen( filename.c_str(), "wb" );
815  if ( outfile != NULL ) {
816  if ( nehalem ) {
817  gzprintf( outfile, "NHM " );
818  } else if ( westmere ) {
819  gzprintf( outfile, "WSM " );
820  } else if ( core ) {
821  gzprintf( outfile, "CORE " );
822  }
823  if ( gzprintf( outfile, "%s %d %d %d\n", event_cstr[i], cmask[i], inv[i], sp[i] ) <
824  (int)strlen( event_cstr[i] ) ) {
825  error() << "ERROR: gzputs err: " << gzerror( outfile, &err ) << ". Aborting..." << endmsg;
826  }
827  for ( std::map<std::string, std::map<unsigned long, unsigned int>>::iterator it = samples[i].begin();
828  it != samples[i].end(); it++ ) {
829  unsigned long long sum = 0;
830  for ( std::map<unsigned long, unsigned int>::iterator jt = ( it->second ).begin(); jt != ( it->second ).end();
831  jt++ ) {
832  sum += jt->second;
833  }
834  if ( gzprintf( outfile, "%s%%%llu\n", ( it->first ).c_str(), sum ) < (int)( ( it->first ).length() ) ) {
835  error() << "ERROR: gzputs err: " << gzerror( outfile, &err ) << ". Aborting..." << endmsg;
836  }
837  for ( std::map<unsigned long, unsigned int>::iterator jt = ( it->second ).begin(); jt != ( it->second ).end();
838  jt++ ) {
839  char sym_name[SYM_NAME_MAX_LENGTH];
840  bzero( sym_name, SYM_NAME_MAX_LENGTH );
841  const char* libName;
842  const char* symbolName;
843  int libOffset = 0;
844  int offset = 0;
845  void* sym_addr = IgHookTrace::tosymbol( (void*)( jt->first ) );
846  if ( sym_addr != NULL ) {
847  bool success = IgHookTrace::symbol( sym_addr, symbolName, libName, offset, libOffset );
848  if ( success ) {
849  if ( symbolName != NULL && strlen( symbolName ) > 0 ) {
850  strcpy( sym_name, symbolName );
851  strcat( sym_name, " " );
852  } else {
853  strcpy( sym_name, "??? " );
854  }
855  if ( libName != NULL && strlen( libName ) > 0 ) {
856  strcat( sym_name, libName );
857  strcat( sym_name, " " );
858  } else {
859  strcat( sym_name, "??? " );
860  }
861  sprintf( sym_name + strlen( sym_name ), "%d ", libOffset );
862  if ( strlen( sym_name ) <= 0 ) { error() << "ERROR: Symbol name length is zero. Aborting..." << endmsg; }
863  } else {
864  strcpy( sym_name, "??? ??? 0 " );
865  }
866  } else {
867  strcpy( sym_name, "??? ??? 0 " );
868  }
869  if ( gzprintf( outfile, "%s %d\n", sym_name, jt->second ) < (int)strlen( sym_name ) ) {
870  error() << "ERROR: gzputs err: " << gzerror( outfile, &err ) << endmsg;
871  }
872  }
873  }
874  } else {
875  error() << "ERROR: Could not open file: " << filename << ". Aborting..." << endmsg;
876  }
877  gzclose( outfile );
878  }
879 }
T strcat(T... args)
static void * tosymbol(void *address)
bool inv[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
T to_string(T... args)
#define SYM_NAME_MAX_LENGTH
STL class.
STL class.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
T strlen(T... args)
static bool symbol(void *address, const char *&sym, const char *&lib, int &offset, int &liboffset)
char event_cstr[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS][MAX_EVENT_NAME_LENGTH]
def end
Definition: IOTest.py:123
char prefix_cstr[MAX_PREFIX_NAME_LENGTH]
T strcpy(T... args)
unsigned int i
T begin(T... args)
MsgStream & err() const
shortcut for the method msgStream(MSG::ERROR)
AttribStringParser::Iterator begin(const AttribStringParser &parser)
unsigned int cmask[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
T sprintf(T... args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ finalizepm()

void PerfMonAuditor::finalizepm ( )
private

Definition at line 518 of file PerfMonAuditor.cpp.

518  {
519  info() << "start of finalizepm ucn:" << used_counters_number << endmsg;
520  for ( int i = 0; i < used_counters_number; i++ ) {
522  filename += '_';
523  filename += event_cstr[i];
524 
525  for ( auto& c : filename )
526  if ( c == ':' ) c = '-';
527 
528  if ( inv[i] ) filename += "_INV_1";
529  if ( cmask[i] > 0 ) filename += "_CMASK_" + std::to_string( cmask[i] );
530  filename += ".txt";
531 
532  info() << "Filename:" << filename << endmsg;
533  FILE* outfile = fopen( filename.c_str(), "w" );
534  if ( nehalem ) {
535  fprintf( outfile, "NHM " );
536  } else if ( westmere ) {
537  fprintf( outfile, "WSM " );
538  } else if ( core ) {
539  fprintf( outfile, "CORE " );
540  }
541  fprintf( outfile, "%s %d %d %d\n", event_cstr[i], cmask[i], inv[i], sp[i] );
542  for ( std::map<std::string, std::vector<unsigned long int>>::iterator it = ( results[i] ).begin();
543  it != ( results[i] ).end(); it++ ) {
544  fprintf( outfile, "%s\n", ( it->first ).c_str() );
545  for ( std::vector<unsigned long int>::iterator j = ( it->second ).begin(); j != ( it->second ).end(); j++ ) {
546  fprintf( outfile, "%lu\n", *j );
547  }
548  }
549  fclose( outfile );
550  }
551 }
bool inv[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
T to_string(T... args)
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
STL class.
T fclose(T... args)
STL class.
T fopen(T... args)
char event_cstr[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS][MAX_EVENT_NAME_LENGTH]
def end
Definition: IOTest.py:123
char prefix_cstr[MAX_PREFIX_NAME_LENGTH]
unsigned int i
STL class.
T begin(T... args)
AttribStringParser::Iterator begin(const AttribStringParser &parser)
unsigned int cmask[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
T fprintf(T... args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ i_afterExecute()

void PerfMonAuditor::i_afterExecute ( INamedInterface alg)
private

Definition at line 958 of file PerfMonAuditor.cpp.

958  {
959  if ( !alg ) { return; } // info() << "after:inside! " << alg->name() << endmsg;
960 
961  if ( event_count_reached ) {
962  // info() << "after:inside! " << alg->name() << endmsg;
963 
964  if ( sampling == 0 )
965  stoppm();
966  else
967  stop_smpl();
968  alg_stack.pop();
969  --m_indent;
970  if ( !alg_stack.empty() ) {
971  if ( sampling == 0 )
972  startpm();
973  else
974  start_smpl(); // resuming father algorithm counting
975  }
976  }
977 }

◆ i_afterInitialize()

void PerfMonAuditor::i_afterInitialize ( INamedInterface alg)
private

Definition at line 919 of file PerfMonAuditor.cpp.

919 {}

◆ i_beforeExecute()

void PerfMonAuditor::i_beforeExecute ( INamedInterface alg)
private

Definition at line 921 of file PerfMonAuditor.cpp.

921  {
922  if ( !alg ) return;
923  // info() << "before:inside! " << alg->name() << endmsg;
924  if ( first_alg ) {
925  first_alg = false;
926  first_alg_name = alg->name();
927  // info() << "first_alg_name= " << alg->name() << endmsg;
928  }
929  if ( !event_count_reached ) {
930  if ( !first_alg_name.compare( alg->name() ) ) {
931  ph_ev_count++;
932  // info() << "EVENT COUNT: " << ph_ev_count << endmsg;
933  if ( ph_ev_count == start_at_event ) {
934  event_count_reached = true;
935  // info() << "!!! EVENT COUNT REACHED: " << ph_ev_count << endmsg;
936  }
937  }
938  }
939  if ( event_count_reached ) {
940  // info() << "before:inside! " << alg->name() << endmsg;
941 
942  if ( !alg_stack.empty() ) {
943  if ( sampling == 0 )
944  pausepm(); // pausing father algorithm counting
945  else
946  stop_smpl();
947  }
948  ++m_indent;
949  std::vector<unsigned long int> zeroes( 4, 0 );
950  alg_stack.push( std::make_pair( alg, zeroes ) );
951  if ( sampling == 0 )
952  startpm();
953  else
954  start_smpl();
955  }
956 }
std::string first_alg_name
T make_pair(T... args)
unsigned int ph_ev_count
STL class.
unsigned int start_at_event
T compare(T... args)

◆ i_beforeInitialize()

void PerfMonAuditor::i_beforeInitialize ( INamedInterface alg)
private

Definition at line 917 of file PerfMonAuditor.cpp.

917 {}

◆ initialize()

StatusCode PerfMonAuditor::initialize ( )
overridevirtual

Reimplemented from Auditor.

Definition at line 553 of file PerfMonAuditor.cpp.

553  {
554  if ( !m_pfm.loaded ) {
555  error() << "pfm library could not be loaded" << endmsg;
556  return StatusCode::FAILURE;
557  }
558 
559  info() << "Initializing..." << endmsg;
561  if ( sc.isFailure() ) { return sc; }
563  for ( int i = 0; i < MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS; i++ ) {
564  if ( event_str[i].length() > 0 ) used_counters_number++;
565  }
566  for ( int i = 0; i < MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS; i++ ) { strcpy( event_cstr[i], event_str[i].c_str() ); }
568 
569  if ( m_pfm.pfm_initialize() != PFMLIB_SUCCESS ) { error() << "Cannot initialize perfmon!!" << endmsg; }
570  ph_ev_count = 0;
571  first_alg = true;
572  event_count_reached = false;
573  nehalem = false;
574  core = false;
575  westmere = false;
576  if ( family.compare( "CORE" ) == 0 )
577  core = true;
578  else if ( family.compare( "NEHALEM" ) == 0 )
579  nehalem = true;
580  else if ( family.compare( "WESTMERE" ) == 0 )
581  westmere = true;
582  else {
583  error() << "ERROR: Unsupported processor family " << family << ". aborting..." << endmsg;
584  }
585 
586  info() << "Initialized!" << endmsg;
587  return StatusCode::SUCCESS;
588 }
std::string family
#define PFMLIB_SUCCESS
Definition: pfmlib.h:267
constexpr static const auto SUCCESS
Definition: StatusCode.h:96
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
std::string event_str[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
std::string prefix
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
char event_cstr[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS][MAX_EVENT_NAME_LENGTH]
char prefix_cstr[MAX_PREFIX_NAME_LENGTH]
T strcpy(T... args)
unsigned int i
unsigned int ph_ev_count
T c_str(T... args)
constexpr static const auto FAILURE
Definition: StatusCode.h:97
virtual StatusCode initialize()
Definition: Auditor.cpp:74
bool isFailure() const
Definition: StatusCode.h:141
#define MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
T compare(T... args)

◆ is_nehalem()

int PerfMonAuditor::is_nehalem ( )
inline

Definition at line 224 of file PerfMonAuditor.cpp.

224  {
225 #ifdef __ICC
226 // Disable ICC remark #593: variable "x" was set but never used
227 # pragma warning( push )
228 # pragma warning( disable : 593 )
229 #endif
230  int a, b, c, d;
231  cpuid( 1, a, b, c, d );
232  int sse4_2_mask = 1 << 20;
233  if ( c & sse4_2_mask )
234  return 1;
235  else
236  return 0;
237 #ifdef __ICC
238 # pragma warning( pop )
239 #endif
240  }
#define cpuid(func, ax, bx, cx, dx)

◆ operator=()

PerfMonAuditor& PerfMonAuditor::operator= ( const PerfMonAuditor )
private

◆ pausepm()

void PerfMonAuditor::pausepm ( )
private

Definition at line 506 of file PerfMonAuditor.cpp.

506  {
507  m_pfm.pfm_stop( fd );
508  if ( m_pfm.pfm_read_pmds( fd, pd, inp.pfp_event_count ) == -1 ) { error() << "Could not read pmds" << endmsg; }
509 
510  for ( int i = 0; i < used_counters_number; i++ ) { alg_stack.top().second[i] += pd[i].reg_value; }
511 
512  close( fd );
513 }
pfmlib_input_param_t inp
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
pfarg_pmd_t pd[NUM_PMDS]
unsigned int i
uint64_t reg_value
Definition: perfmon_v2.h:42
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
unsigned int pfp_event_count
Definition: pfmlib.h:108

◆ pfm_bv_copy()

void PerfMonAuditor::pfm_bv_copy ( uint64_t d,
uint64_t j,
uint16_t  n 
)
inlineprivate

Definition at line 404 of file PerfMonAuditor.cpp.

404  {
405  if ( n <= BPL )
406  *d = *j;
407  else {
408  memcpy( d, j, ( n >> LBPL ) * sizeof( uint64_t ) );
409  }
410  }
unsigned long long uint64_t
Definition: instrset.h:143
T memcpy(T... args)
#define LBPL
#define BPL

◆ pfm_bv_isset()

int PerfMonAuditor::pfm_bv_isset ( uint64_t bv,
uint16_t  rnum 
)
inlineprivate

Definition at line 401 of file PerfMonAuditor.cpp.

401  {
402  return bv[rnum >> LBPL] & ( 1UL << ( rnum & ( BPL - 1 ) ) ) ? 1 : 0;
403  }
#define LBPL
#define BPL

◆ pfm_bv_set()

void PerfMonAuditor::pfm_bv_set ( uint64_t bv,
uint16_t  rnum 
)
inlineprivate

Definition at line 400 of file PerfMonAuditor.cpp.

400 { bv[rnum >> LBPL] |= 1UL << ( rnum & ( BPL - 1 ) ); }
#define LBPL
#define BPL

◆ process_smpl_buf()

void PerfMonAuditor::process_smpl_buf ( pfm_dfl_smpl_hdr_t hdr,
size_t  entry_size 
)
staticprivate

Definition at line 594 of file PerfMonAuditor.cpp.

594  {
597  size_t pos, count;
598  uint64_t entry;
599  if ( hdr->hdr_overflows == last_overflow && hdr->hdr_count == last_count ) {
600  printf( "skipping identical set of samples...\n" );
601  return;
602  }
603  count = hdr->hdr_count;
604  ent = (pfm_dfl_smpl_entry_t*)( hdr + 1 );
605  pos = (unsigned long)ent;
606  entry = collected_samples;
607  while ( count-- ) {
608  // if(ent->ovfl_pmd>=0 && ent->ovfl_pmd<=3)
609  if ( ent->ovfl_pmd <= 3 ) {
610  ( ( samples[ent->ovfl_pmd] )[( alg_stack.top().first )->name()] )[(unsigned long)( ent->ip )]++;
611  }
612  pos += entry_size;
613  ent = (pfm_dfl_smpl_entry_t*)pos;
614  entry++;
615  }
616  collected_samples = entry;
617  last_overflow = hdr->hdr_overflows;
618  if ( last_count != hdr->hdr_count && ( last_count || last_overflow == 0 ) ) { collected_partial += hdr->hdr_count; }
619  last_count = hdr->hdr_count;
620  return;
621 }
unsigned long long uint64_t
Definition: instrset.h:143
uint16_t ovfl_pmd
uint64_t ip
T count(T... args)
const std::string & name() const override
Definition: Auditor.cpp:187
T printf(T... args)

◆ sigio_handler()

void PerfMonAuditor::sigio_handler ( int  ,
siginfo_t *  ,
void *   
)
staticprivate

Definition at line 627 of file PerfMonAuditor.cpp.

627  {
628  PFMon& pfm = PFMon::instance();
630  int fd = ctx_fd;
631  int r;
632  if ( fd != ctx_fd ) {
633  // error() << "ERROR: handler does not get valid file descriptor. Aborting..." << endmsg;
634  }
635  if ( pfm.pfm_read_pmds( fd, pd_smpl + 1, 1 ) == -1 ) {
636  // error() << "ERROR: pfm_read_pmds: " << strerror(errno) << ". Aborting..." << endmsg;
637  }
638  while ( true ) {
639  r = read( fd, &msg, sizeof( msg ) );
640  if ( r != sizeof( msg ) ) {
641  if ( r == -1 && errno == EINTR ) {
642  printf( "read interrupted, retrying\n" );
643  continue;
644  }
645  // error() << "ERROR: cannot read overflow message: " << strerror(errno) << ". Aborting..." << endmsg;
646  }
647  break;
648  }
649  switch ( msg.type ) {
650  case PFM_MSG_OVFL: // the sampling buffer is full
651  process_smpl_buf( hdr, entry_size );
652  ovfl_count++;
653  if ( pfm.pfm_restart( fd ) ) {
654  if ( errno != EBUSY ) {
655  // error() << "ERROR: pfm_restart error errno " << errno << ". Aborting..." << endmsg;
656  } else {
657  printf( "pfm_restart: task probably terminated \n" );
658  }
659  }
660  break;
661  default:
662  // error() << "ERROR: unknown message type " << msg.type << ". Aborting..." << endmsg;
663  break;
664  }
665 }
def read(f, regex='.*', skipevents=0)
Definition: hivetimeline.py:33
MsgStream & msg() const
shortcut for the method msgStream(MSG::INFO)
static void process_smpl_buf(pfm_dfl_smpl_hdr_t *hdr, size_t entry_size)
#define PFM_MSG_OVFL
Definition: perfmon.h:210
T printf(T... args)

◆ start_smpl()

void PerfMonAuditor::start_smpl ( )
private

Definition at line 671 of file PerfMonAuditor.cpp.

671  {
672  ovfl_count = 0;
673  num_smpl_pmds = 0;
674  last_overflow = ~0;
675  max_pmd = 0;
676  memset( &pfmlib_options, 0, sizeof( pfmlib_options ) );
679  m_pfm.pfm_set_options( &pfmlib_options );
680  ret = m_pfm.pfm_initialize();
681  if ( ret != PFMLIB_SUCCESS ) {
682  error() << "ERROR: Cannot initialize library: " << m_pfm.pfm_strerror( ret ) << ". Aborting..." << endmsg;
683  }
684  struct sigaction act;
685  memset( &act, 0, sizeof( act ) );
686  act.sa_sigaction = sigio_handler; // dlopen() ==>
687  // act.sa_handler = (sig_t)&sigio_handler;
688  sigaction( SIGIO, &act, 0 );
689  memset( &ctx, 0, sizeof( ctx ) );
690  memset( &buf_arg, 0, sizeof( buf_arg ) );
691  memset( &inp, 0, sizeof( inp ) );
692  memset( &outp, 0, sizeof( outp ) );
693  memset( pd_smpl, 0, sizeof( pd_smpl ) );
694  memset( pc, 0, sizeof( pc ) );
695  memset( &load_args, 0, sizeof( load_args ) );
696  m_pfm.pfm_get_num_counters( &num_counters );
697  memset( &params, 0, sizeof( params ) );
698  memset( &nhm_params, 0, sizeof( nhm_params ) );
699 
700  for ( int i = 0; i < used_counters_number; i++ ) {
701  ret = m_pfm.pfm_find_full_event( event_cstr[i], &inp.pfp_events[i] );
702  if ( ret != PFMLIB_SUCCESS ) {
703  error() << "ERROR: cannot find event: " << event_cstr[i] << ". Aborting..." << endmsg;
704  }
705  }
707  inp.pfp_event_count = 4;
708  for ( int i = 0; i < used_counters_number; i++ ) {
709  if ( inv[i] ) {
712  }
713  if ( cmask[i] > 0 ) {
714  ( params.pfp_core_counters[i] ).cnt_mask = cmask[i];
715  ( nhm_params.pfp_nhm_counters[i] ).cnt_mask = cmask[i];
716  }
717  }
718  if ( nehalem || westmere ) {
719  ret = m_pfm.pfm_dispatch_events( &inp, &nhm_params, &outp, NULL );
720  } else {
721  ret = m_pfm.pfm_dispatch_events( &inp, &params, &outp, NULL );
722  }
723  if ( ret != PFMLIB_SUCCESS ) {
724  error() << "ERROR: cannot configure events: " << m_pfm.pfm_strerror( ret ) << ". Aborting..." << endmsg;
725  }
726  for ( unsigned int i = 0; i < outp.pfp_pmc_count; i++ ) {
729  }
730  for ( unsigned int i = 0; i < outp.pfp_pmd_count; i++ ) {
731  pd_smpl[i].reg_num = outp.pfp_pmds[i].reg_num;
732  if ( i ) {
733  pfm_bv_set( pd_smpl[0].reg_smpl_pmds, pd_smpl[i].reg_num );
734  if ( pd_smpl[i].reg_num > max_pmd ) { max_pmd = pd_smpl[i].reg_num; }
735  num_smpl_pmds++;
736  }
737  }
738  for ( int i = 0; i < used_counters_number; i++ ) {
740  pfm_bv_copy( pd_smpl[i].reg_reset_pmds, pd_smpl[i].reg_smpl_pmds, max_pmd );
741  pd_smpl[i].reg_value = ( uint64_t )( sp[i] * -1 );
742  pd_smpl[i].reg_short_reset = ( uint64_t )( sp[i] * -1 );
743  pd_smpl[i].reg_long_reset = ( uint64_t )( sp[i] * -1 );
744  pd_smpl[i].reg_random_seed = 5; // tocheck
745  pd_smpl[i].reg_random_mask = 0xff; // tocheck
746  }
747  entry_size = sizeof( pfm_dfl_smpl_entry_t ) + ( num_smpl_pmds << 3 );
748  ctx.ctx_flags = 0;
749  buf_arg.buf_size = 3 * getpagesize() + 512;
750  ctx_fd = m_pfm.pfm_create_context( &ctx, (char*)FMT_NAME, &buf_arg, sizeof( buf_arg ) );
751  if ( ctx_fd == -1 ) {
752  if ( errno == ENOSYS ) {
753  error() << "ERROR: Your kernel does not have performance monitoring support! Aborting..." << endmsg;
754  }
755  error() << "ERROR: Can't create PFM context " << strerror( errno ) << ". Aborting..." << endmsg;
756  }
757  buf_addr = mmap( NULL, buf_arg.buf_size, PROT_READ, MAP_PRIVATE, ctx_fd, 0 );
758  if ( buf_addr == MAP_FAILED ) {
759  error() << "ERROR: cannot mmap sampling buffer: " << strerror( errno ) << ". Aborting..." << endmsg;
760  }
762  if ( PFM_VERSION_MAJOR( hdr->hdr_version ) < 1 ) {
763  error() << "ERROR: invalid buffer format version. Aborting..." << endmsg;
764  }
765  if ( m_pfm.pfm_write_pmcs( ctx_fd, pc, outp.pfp_pmc_count ) ) {
766  error() << "ERROR: pfm_write_pmcs error errno " << strerror( errno ) << ". Aborting..." << endmsg;
767  }
768  if ( m_pfm.pfm_write_pmds( ctx_fd, pd_smpl, outp.pfp_pmd_count ) ) {
769  error() << "ERROR: pfm_write_pmds error errno " << strerror( errno ) << ". Aborting..." << endmsg;
770  }
771  load_args.load_pid = getpid();
772  if ( m_pfm.pfm_load_context( ctx_fd, &load_args ) ) {
773  error() << "ERROR: pfm_load_context error errno " << strerror( errno ) << ". Aborting..." << endmsg;
774  }
775  ret = fcntl( ctx_fd, F_SETFL, fcntl( ctx_fd, F_GETFL, 0 ) | O_ASYNC );
776  if ( ret == -1 ) { error() << "ERROR: cannot set ASYNC: " << strerror( errno ) << ". Aborting..." << endmsg; }
777  ret = fcntl( ctx_fd, F_SETOWN, getpid() );
778  if ( ret == -1 ) { error() << "ERROR: cannot setown: " << strerror( errno ) << ". Aborting..." << endmsg; }
779  // pfm_self_start(ctx_fd); ==>
780  m_pfm.pfm_start( ctx_fd, NULL );
781 }
pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS]
Definition: pfmlib.h:129
pfarg_load_t load_args
uint64_t reg_short_reset
Definition: perfmon_v2.h:44
pfmlib_core_input_param_t params
#define PFM_REGFL_OVFL_NOTIFY
Definition: perfmon.h:112
#define PFM_NHM_SEL_INV
#define PFM_PLM3
Definition: pfmlib.h:53
pfmlib_event_t pfp_events[PFMLIB_MAX_PMCS]
Definition: pfmlib.h:112
#define PFM_CORE_SEL_INV
Definition: pfmlib_core.h:68
pfmlib_nhm_counter_t pfp_nhm_counters[PMU_NHM_NUM_COUNTERS]
T strerror(T... args)
bool inv[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
#define PFMLIB_SUCCESS
Definition: pfmlib.h:267
unsigned int pfm_verbose
Definition: pfmlib.h:138
unsigned int pfp_dfl_plm
Definition: pfmlib.h:109
uint16_t reg_num
Definition: perfmon_v2.h:39
unsigned long long uint64_t
Definition: instrset.h:143
T memset(T... args)
pfmlib_input_param_t inp
unsigned int pfp_pmc_count
Definition: pfmlib.h:126
pfmlib_options_t pfmlib_options
unsigned long long reg_value
Definition: pfmlib.h:97
unsigned int pfp_pmd_count
Definition: pfmlib.h:127
uint32_t reg_random_seed
Definition: perfmon_v2.h:51
uint64_t reg_long_reset
Definition: perfmon_v2.h:43
pfmlib_nhm_input_param_t nhm_params
#define PFM_VERSION_MAJOR(x)
Definition: perfmon.h:213
uint32_t ctx_flags
Definition: perfmon_v2.h:19
void pfm_bv_copy(uint64_t *d, uint64_t *j, uint16_t n)
void pfm_bv_set(uint64_t *bv, uint16_t rnum)
uint32_t reg_flags
Definition: perfmon_v2.h:41
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
unsigned int pfm_debug
Definition: pfmlib.h:137
unsigned int reg_num
Definition: pfmlib.h:99
pfmlib_output_param_t outp
uint16_t reg_num
Definition: perfmon_v2.h:28
char event_cstr[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS][MAX_EVENT_NAME_LENGTH]
uint32_t load_pid
Definition: perfmon_v2.h:69
unsigned int i
pfarg_pmc_t pc[NUM_PMCS]
#define FMT_NAME
#define PFM_REGFL_RANDOM
Definition: perfmon.h:113
pfm_dfl_smpl_arg_t buf_arg
static void sigio_handler(int, siginfo_t *, void *)
uint64_t reg_value
Definition: perfmon_v2.h:31
unsigned int max_pmd
pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS]
Definition: pfmlib.h:128
uint64_t reg_random_mask
Definition: perfmon_v2.h:50
pfmlib_core_counter_t pfp_core_counters[PMU_CORE_NUM_COUNTERS]
Definition: pfmlib_core.h:79
unsigned int cmask[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
uint64_t reg_value
Definition: perfmon_v2.h:42
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
unsigned int pfp_event_count
Definition: pfmlib.h:108

◆ startpm()

void PerfMonAuditor::startpm ( )
private

Definition at line 431 of file PerfMonAuditor.cpp.

431  {
432  memset( &ctx, 0, sizeof( ctx ) );
433  memset( &inp, 0, sizeof( inp ) );
434  memset( &outp, 0, sizeof( outp ) );
435  memset( pd, 0, sizeof( pd ) );
436  memset( pc, 0, sizeof( pc ) );
437  memset( &load_arg, 0, sizeof( load_arg ) );
438  memset( &params, 0, sizeof( params ) );
439  memset( &nhm_params, 0, sizeof( nhm_params ) );
440 
441  for ( int i = 0; i < used_counters_number; i++ ) {
442  ret = m_pfm.pfm_find_full_event( event_cstr[i], &inp.pfp_events[i] );
443  if ( ret != PFMLIB_SUCCESS ) {
444  error() << "ERROR: cannot find event: " << event_cstr[i] << ". Aborting..." << endmsg;
445  }
446  }
448  inp.pfp_event_count = 4;
449  for ( int i = 0; i < used_counters_number; i++ ) {
450  if ( inv[i] ) {
453  }
454  if ( cmask[i] > 0 ) {
455  ( params.pfp_core_counters[i] ).cnt_mask = cmask[i];
456  ( nhm_params.pfp_nhm_counters[i] ).cnt_mask = cmask[i];
457  }
458  }
459  if ( nehalem || westmere ) {
460  ret = m_pfm.pfm_dispatch_events( &inp, &nhm_params, &outp, NULL );
461  } else {
462  ret = m_pfm.pfm_dispatch_events( &inp, &params, &outp, NULL );
463  }
464  if ( ret != PFMLIB_SUCCESS ) {
465  error() << "ERROR: cannot dispatch events: " << m_pfm.pfm_strerror( ret ) << ". Aborting..." << endmsg;
466  }
467  for ( unsigned int i = 0; i < outp.pfp_pmc_count; i++ ) {
470  }
471  for ( unsigned int i = 0; i < outp.pfp_pmd_count; i++ ) {
473  pd[i].reg_value = 0;
474  }
475  fd = m_pfm.pfm_create_context( &ctx, NULL, 0, 0 );
476  if ( fd == -1 ) { error() << "ERROR: Context not created. Aborting..." << endmsg; }
477  if ( m_pfm.pfm_write_pmcs( fd, pc, outp.pfp_pmc_count ) == -1 ) {
478  error() << "ERROR: Could not write pmcs. Aborting..." << endmsg;
479  }
480  if ( m_pfm.pfm_write_pmds( fd, pd, outp.pfp_pmd_count ) == -1 ) {
481  error() << "ERROR: Could not write pmds. Aborting..." << endmsg;
482  }
483  load_arg.load_pid = getpid();
484  if ( m_pfm.pfm_load_context( fd, &load_arg ) == -1 ) {
485  error() << "ERROR: Could not load context. Aborting..." << endmsg;
486  // error() << "Could not read pmds" << endmsg;
487  }
488 
489  m_pfm.pfm_start( fd, NULL );
490 }
pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS]
Definition: pfmlib.h:129
pfmlib_core_input_param_t params
#define PFM_NHM_SEL_INV
#define PFM_PLM3
Definition: pfmlib.h:53
pfmlib_event_t pfp_events[PFMLIB_MAX_PMCS]
Definition: pfmlib.h:112
#define PFM_CORE_SEL_INV
Definition: pfmlib_core.h:68
pfmlib_nhm_counter_t pfp_nhm_counters[PMU_NHM_NUM_COUNTERS]
bool inv[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
#define PFMLIB_SUCCESS
Definition: pfmlib.h:267
unsigned int pfp_dfl_plm
Definition: pfmlib.h:109
uint16_t reg_num
Definition: perfmon_v2.h:39
T memset(T... args)
pfmlib_input_param_t inp
unsigned int pfp_pmc_count
Definition: pfmlib.h:126
unsigned long long reg_value
Definition: pfmlib.h:97
unsigned int pfp_pmd_count
Definition: pfmlib.h:127
pfmlib_nhm_input_param_t nhm_params
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
unsigned int reg_num
Definition: pfmlib.h:99
pfmlib_output_param_t outp
uint16_t reg_num
Definition: perfmon_v2.h:28
char event_cstr[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS][MAX_EVENT_NAME_LENGTH]
pfarg_pmd_t pd[NUM_PMDS]
uint32_t load_pid
Definition: perfmon_v2.h:69
unsigned int i
pfarg_pmc_t pc[NUM_PMCS]
uint64_t reg_value
Definition: perfmon_v2.h:31
pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS]
Definition: pfmlib.h:128
pfmlib_core_counter_t pfp_core_counters[PMU_CORE_NUM_COUNTERS]
Definition: pfmlib_core.h:79
unsigned int cmask[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
pfarg_load_t load_arg
uint64_t reg_value
Definition: perfmon_v2.h:42
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
unsigned int pfp_event_count
Definition: pfmlib.h:108

◆ stop_smpl()

void PerfMonAuditor::stop_smpl ( )
private

Definition at line 787 of file PerfMonAuditor.cpp.

787  {
788  m_pfm.pfm_self_stop( ctx_fd );
789  process_smpl_buf( hdr, entry_size );
790  close( ctx_fd );
791  ret = munmap( hdr, buf_arg.buf_size );
792  if ( ret ) { error() << "Cannot unmap buffer: %s" << strerror( errno ) << endmsg; }
793  return;
794 }
T strerror(T... args)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
static void process_smpl_buf(pfm_dfl_smpl_hdr_t *hdr, size_t entry_size)
pfm_dfl_smpl_arg_t buf_arg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202

◆ stoppm()

void PerfMonAuditor::stoppm ( )
private

Definition at line 496 of file PerfMonAuditor.cpp.

496  {
497  m_pfm.pfm_stop( fd );
498  if ( m_pfm.pfm_read_pmds( fd, pd, inp.pfp_event_count ) == -1 ) { error() << "Could not read pmds" << endmsg; }
499  for ( int i = 0; i < used_counters_number; i++ ) {
500  results[i][( alg_stack.top().first )->name()].push_back( alg_stack.top().second[i] + pd[i].reg_value );
501  }
502 
503  close( fd );
504 }
pfmlib_input_param_t inp
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
pfarg_pmd_t pd[NUM_PMDS]
unsigned int i
const std::string & name() const override
Definition: Auditor.cpp:187
uint64_t reg_value
Definition: perfmon_v2.h:42
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
unsigned int pfp_event_count
Definition: pfmlib.h:108

Member Data Documentation

◆ buf_addr

void* PerfMonAuditor::buf_addr
private

Definition at line 419 of file PerfMonAuditor.cpp.

◆ buf_arg

pfm_dfl_smpl_arg_t PerfMonAuditor::buf_arg
private

Definition at line 417 of file PerfMonAuditor.cpp.

◆ cmask

unsigned int PerfMonAuditor::cmask[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
private

Definition at line 388 of file PerfMonAuditor.cpp.

◆ core

bool PerfMonAuditor::core
private

Definition at line 395 of file PerfMonAuditor.cpp.

◆ ctx

pfarg_ctx_t PerfMonAuditor::ctx
private

Definition at line 370 of file PerfMonAuditor.cpp.

◆ event_count_reached

bool PerfMonAuditor::event_count_reached
private

Definition at line 428 of file PerfMonAuditor.cpp.

◆ event_cstr

char PerfMonAuditor::event_cstr[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS][MAX_EVENT_NAME_LENGTH]
private

Definition at line 384 of file PerfMonAuditor.cpp.

◆ event_str

std::string PerfMonAuditor::event_str[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
private

Definition at line 381 of file PerfMonAuditor.cpp.

◆ family

std::string PerfMonAuditor::family
private

Definition at line 383 of file PerfMonAuditor.cpp.

◆ fd

int PerfMonAuditor::fd
private

Definition at line 374 of file PerfMonAuditor.cpp.

◆ first_alg

bool PerfMonAuditor::first_alg
private

Definition at line 426 of file PerfMonAuditor.cpp.

◆ first_alg_name

std::string PerfMonAuditor::first_alg_name
private

Definition at line 427 of file PerfMonAuditor.cpp.

◆ i

unsigned int PerfMonAuditor::i
private

Definition at line 375 of file PerfMonAuditor.cpp.

◆ inp

pfmlib_input_param_t PerfMonAuditor::inp
private

Definition at line 368 of file PerfMonAuditor.cpp.

◆ inv

bool PerfMonAuditor::inv[MAX_NUMBER_OF_PROGRAMMABLE_COUNTERS]
private

Definition at line 387 of file PerfMonAuditor.cpp.

◆ is_nehalem_ret

int PerfMonAuditor::is_nehalem_ret
private

Definition at line 366 of file PerfMonAuditor.cpp.

◆ level

int PerfMonAuditor::level
private

Definition at line 424 of file PerfMonAuditor.cpp.

◆ load_arg

pfarg_load_t PerfMonAuditor::load_arg
private

Definition at line 373 of file PerfMonAuditor.cpp.

◆ load_args

pfarg_load_t PerfMonAuditor::load_args
private

Definition at line 418 of file PerfMonAuditor.cpp.

◆ m_indent

int PerfMonAuditor::m_indent
private

Definition at line 362 of file PerfMonAuditor.cpp.

◆ m_inEvent

bool PerfMonAuditor::m_inEvent
private

Definition at line 363 of file PerfMonAuditor.cpp.

◆ m_map

Map PerfMonAuditor::m_map
private

Definition at line 361 of file PerfMonAuditor.cpp.

◆ m_pfm

PFMon& PerfMonAuditor::m_pfm
private

Definition at line 243 of file PerfMonAuditor.cpp.

◆ max_pmd

unsigned int PerfMonAuditor::max_pmd
private

Definition at line 421 of file PerfMonAuditor.cpp.

◆ nehalem

bool PerfMonAuditor::nehalem
private

Definition at line 393 of file PerfMonAuditor.cpp.

◆ nhm_params

pfmlib_nhm_input_param_t PerfMonAuditor::nhm_params
private

Definition at line 391 of file PerfMonAuditor.cpp.

◆ num_counters

unsigned PerfMonAuditor::num_counters
private

Definition at line 420 of file PerfMonAuditor.cpp.

◆ outp

pfmlib_output_param_t PerfMonAuditor::outp
private

Definition at line 369 of file PerfMonAuditor.cpp.

◆ params

pfmlib_core_input_param_t PerfMonAuditor::params
private

Definition at line 390 of file PerfMonAuditor.cpp.

◆ pc

pfarg_pmc_t PerfMonAuditor::pc[NUM_PMCS]
private

Definition at line 372 of file PerfMonAuditor.cpp.

◆ pd

pfarg_pmd_t PerfMonAuditor::pd[NUM_PMDS]
private

Definition at line 371 of file PerfMonAuditor.cpp.

◆ pfmlib_options

pfmlib_options_t PerfMonAuditor::pfmlib_options
private

Definition at line 422 of file PerfMonAuditor.cpp.

◆ ph_ev_count

unsigned int PerfMonAuditor::ph_ev_count {0}
private

Definition at line 386 of file PerfMonAuditor.cpp.

◆ prefix

std::string PerfMonAuditor::prefix
private

Definition at line 382 of file PerfMonAuditor.cpp.

◆ prefix_cstr

char PerfMonAuditor::prefix_cstr[MAX_PREFIX_NAME_LENGTH]
private

Definition at line 385 of file PerfMonAuditor.cpp.

◆ ret

int PerfMonAuditor::ret {0}
private

Definition at line 376 of file PerfMonAuditor.cpp.

◆ sampling

bool PerfMonAuditor::sampling
private

Definition at line 397 of file PerfMonAuditor.cpp.

◆ start_at_event

unsigned int PerfMonAuditor::start_at_event
private

Definition at line 389 of file PerfMonAuditor.cpp.

◆ used_counters_number

int PerfMonAuditor::used_counters_number
private

Definition at line 392 of file PerfMonAuditor.cpp.

◆ westmere

bool PerfMonAuditor::westmere
private

Definition at line 394 of file PerfMonAuditor.cpp.


The documentation for this class was generated from the following file: