CPUCruncher Class Reference

A class that implements a search for prime numbers. More...

#include <src/CPUCruncher.h>

Inheritance diagram for CPUCruncher:
Collaboration diagram for CPUCruncher:

Public Types

typedef tbb::concurrent_hash_map< std::string, unsigned int > CHM
 
- Public Types inherited from CommonMessaging< BASE >
using base_class = CommonMessaging
 
using base_class = CommonMessaging
 

Public Member Functions

virtual StatusCode execute ()
 the execution of the algorithm More...
 
virtual StatusCode initialize ()
 Its initialization. More...
 
virtual StatusCode finalize ()
 the finalization of the algorithm More...
 
virtual const std::vector< std::string > get_inputs ()
 Get the inputs. More...
 
virtual const std::vector< std::string > get_outputs ()
 Get the outputs. More...
 
double get_runtime () const
 
- Public Member Functions inherited from GaudiAlgorithm
StatusCode initialize () override
 standard initialization method More...
 
StatusCode execute () override
 standard execution method More...
 
StatusCode finalize () override
 standard finalization method More...
 
StatusCode sysExecute () override
 the generic actions for the execution. More...
 
void put (IDataProviderSvc *svc, DataObject *object, const std::string &address, const bool useRootInTES=true) const
 Register a data object or container into Gaudi Event Transient Store. More...
 
void put (DataObject *object, const std::string &address, const bool useRootInTES=true) const
 Register a data object or container into Gaudi Event Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type get (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Templated access to the data in Gaudi Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type getIfExists (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Templated access to the data in Gaudi Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type get (const std::string &location, const bool useRootInTES=true) const
 Templated access to the data from Gaudi Event Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type getIfExists (const std::string &location, const bool useRootInTES=true) const
 Templated access to the data in Gaudi Transient Store. More...
 
template<class TYPE >
TYPE * getDet (IDataProviderSvc *svc, const std::string &location) const
 Templated access to the detector data from the Gaudi Detector Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type getDetIfExists (IDataProviderSvc *svc, const std::string &location) const
 Templated access to the detector data from the Gaudi Detector Transient Store. More...
 
template<class TYPE >
TYPE * getDet (const std::string &location) const
 Templated access to the detector data from the Gaudi Detector Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type getDetIfExists (const std::string &location) const
 Templated access to the detector data from the Gaudi Detector Transient Store. More...
 
template<class TYPE >
bool exist (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Check the existence of a data object or container in the Gaudi Transient Event Store. More...
 
template<class TYPE >
bool exist (const std::string &location, const bool useRootInTES=true) const
 Check the existence of a data object or container in the Gaudi Transient Event Store. More...
 
template<class TYPE >
bool existDet (IDataProviderSvc *svc, const std::string &location) const
 Check the existence of detector objects in the Gaudi Transient Detector Store. More...
 
template<class TYPE >
bool existDet (const std::string &location) const
 Check the existence of detector objects in the Gaudi Transient Detector Store. More...
 
template<class TYPE , class TYPE2 >
Gaudi::Utils::GetData< TYPE >::return_type getOrCreate (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Get the existing data object from Gaudi Event Transient store. More...
 
template<class TYPE , class TYPE2 >
Gaudi::Utils::GetData< TYPE >::return_type getOrCreate (const std::string &location, const bool useRootInTES=true) const
 Get the existing data object from Gaudi Event Transient store. More...
 
 GaudiAlgorithm (const std::string &name, ISvcLocator *pSvcLocator)
 Standard constructor (protected) More...
 
 ~GaudiAlgorithm () override=default
 destructor, virtual and protected More...
 
SmartIF< INTupleSvc > & evtColSvc () const
 Access the standard event collection service. More...
 
 GaudiAlgorithm (const GaudiAlgorithm &)=delete
 
GaudiAlgorithmoperator= (const GaudiAlgorithm &)=delete
 
StatusCode initialize () override
 standard initialization method More...
 
StatusCode execute () override
 standard execution method More...
 
StatusCode finalize () override
 standard finalization method More...
 
StatusCode sysExecute () override
 the generic actions for the execution. More...
 
void put (IDataProviderSvc *svc, DataObject *object, const std::string &address, const bool useRootInTES=true) const
 Register a data object or container into Gaudi Event Transient Store. More...
 
void put (DataObject *object, const std::string &address, const bool useRootInTES=true) const
 Register a data object or container into Gaudi Event Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type get (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Templated access to the data in Gaudi Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type getIfExists (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Templated access to the data in Gaudi Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type get (const std::string &location, const bool useRootInTES=true) const
 Templated access to the data from Gaudi Event Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type getIfExists (const std::string &location, const bool useRootInTES=true) const
 Templated access to the data in Gaudi Transient Store. More...
 
template<class TYPE >
TYPE * getDet (IDataProviderSvc *svc, const std::string &location) const
 Templated access to the detector data from the Gaudi Detector Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type getDetIfExists (IDataProviderSvc *svc, const std::string &location) const
 Templated access to the detector data from the Gaudi Detector Transient Store. More...
 
template<class TYPE >
TYPE * getDet (const std::string &location) const
 Templated access to the detector data from the Gaudi Detector Transient Store. More...
 
template<class TYPE >
Gaudi::Utils::GetData< TYPE >::return_type getDetIfExists (const std::string &location) const
 Templated access to the detector data from the Gaudi Detector Transient Store. More...
 
template<class TYPE >
bool exist (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Check the existence of a data object or container in the Gaudi Transient Event Store. More...
 
template<class TYPE >
bool exist (const std::string &location, const bool useRootInTES=true) const
 Check the existence of a data object or container in the Gaudi Transient Event Store. More...
 
template<class TYPE >
bool existDet (IDataProviderSvc *svc, const std::string &location) const
 Check the existence of detector objects in the Gaudi Transient Detector Store. More...
 
template<class TYPE >
bool existDet (const std::string &location) const
 Check the existence of detector objects in the Gaudi Transient Detector Store. More...
 
template<class TYPE , class TYPE2 >
Gaudi::Utils::GetData< TYPE >::return_type getOrCreate (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Get the existing data object from Gaudi Event Transient store. More...
 
template<class TYPE , class TYPE2 >
Gaudi::Utils::GetData< TYPE >::return_type getOrCreate (const std::string &location, const bool useRootInTES=true) const
 Get the existing data object from Gaudi Event Transient store. More...
 
 GaudiAlgorithm (const std::string &name, ISvcLocator *pSvcLocator)
 Standard constructor (protected) More...
 
 ~GaudiAlgorithm () override=default
 destructor, virtual and protected More...
 
SmartIF< INTupleSvc > & evtColSvc () const
 Access the standard event collection service. More...
 
 GaudiAlgorithm (const GaudiAlgorithm &)=delete
 
GaudiAlgorithmoperator= (const GaudiAlgorithm &)=delete
 
- Public Member Functions inherited from GaudiCommon< Algorithm >
Gaudi::Utils::GetData< TYPE >::return_type get (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Templated access to the data in Gaudi Transient Store. More...
 
Gaudi::Utils::GetData< TYPE >::return_type get (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Templated access to the data in Gaudi Transient Store. More...
 
Gaudi::Utils::GetData< TYPE >::return_type getIfExists (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Quicker version of the get function which bypasses the check on the retrieved data. More...
 
Gaudi::Utils::GetData< TYPE >::return_type getIfExists (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Quicker version of the get function which bypasses the check on the retrieved data. More...
 
bool exist (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Check the existence of a data object or container in the Gaudi Transient Event Store. More...
 
bool exist (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Check the existence of a data object or container in the Gaudi Transient Event Store. More...
 
Gaudi::Utils::GetData< TYPE >::return_type getOrCreate (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Get the existing data object from Gaudi Event Transient store. More...
 
Gaudi::Utils::GetData< TYPE >::return_type getOrCreate (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
 Get the existing data object from Gaudi Event Transient store. More...
 
DataObjectput (IDataProviderSvc *svc, DataObject *object, const std::string &location, const bool useRootInTES=true) const
 Register a data object or container into Gaudi Event Transient Store. More...
 
DataObjectput (IDataProviderSvc *svc, DataObject *object, const std::string &location, const bool useRootInTES=true) const
 Register a data object or container into Gaudi Event Transient Store. More...
 
TOOL * tool (const std::string &type, const std::string &name, const IInterface *parent=0, bool create=true) const
 Useful method for the easy location of tools. More...
 
TOOL * tool (const std::string &type, const IInterface *parent=0, bool create=true) const
 A useful method for the easy location of tools. More...
 
TOOL * tool (const std::string &type, const std::string &name, const IInterface *parent=0, bool create=true) const
 Useful method for the easy location of tools. More...
 
TOOL * tool (const std::string &type, const IInterface *parent=0, bool create=true) const
 A useful method for the easy location of tools. More...
 
SmartIF< SERVICE > svc (const std::string &name, const bool create=true) const
 A useful method for the easy location of services. More...
 
SmartIF< SERVICE > svc (const std::string &name, const bool create=true) const
 A useful method for the easy location of services. More...
 
IUpdateManagerSvcupdMgrSvc () const
 Short-cut to locate the Update Manager Service. More...
 
IUpdateManagerSvcupdMgrSvc () const
 Short-cut to locate the Update Manager Service. More...
 
StatusCode Error (const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
 Print the error message and return with the given StatusCode. More...
 
StatusCode Error (const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
 Print the error message and return with the given StatusCode. More...
 
StatusCode Warning (const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
 Print the warning message and return with the given StatusCode. More...
 
StatusCode Warning (const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
 Print the warning message and return with the given StatusCode. More...
 
StatusCode Info (const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const size_t mx=10) const
 Print the info message and return with the given StatusCode. More...
 
StatusCode Info (const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const size_t mx=10) const
 Print the info message and return with the given StatusCode. More...
 
StatusCode Print (const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const MSG::Level lev=MSG::INFO) const
 Print the message and return with the given StatusCode. More...
 
StatusCode Print (const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const MSG::Level lev=MSG::INFO) const
 Print the message and return with the given StatusCode. More...
 
void Assert (const bool ok, const std::string &message="", const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Assertion - throw exception if the given condition is not fulfilled. More...
 
void Assert (const bool ok, const char *message, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Assertion - throw exception if the given condition is not fulfilled. More...
 
void Assert (const bool ok, const std::string &message="", const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Assertion - throw exception if the given condition is not fulfilled. More...
 
void Assert (const bool ok, const char *message, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Assertion - throw exception if the given condition is not fulfilled. More...
 
void Exception (const std::string &msg, const GaudiException &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Create and (re)-throw a given GaudiException. More...
 
void Exception (const std::string &msg, const std::exception &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Create and (re)-throw a given exception. More...
 
void Exception (const std::string &msg="no message", const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Create and throw an exception with the given message. More...
 
void Exception (const std::string &msg, const GaudiException &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Create and (re)-throw a given GaudiException. More...
 
void Exception (const std::string &msg, const std::exception &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Create and (re)-throw a given exception. More...
 
void Exception (const std::string &msg="no message", const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
 Create and throw an exception with the given message. More...
 
const Statisticscounters () const
 accessor to all counters More...
 
const Statisticscounters () const
 accessor to all counters More...
 
StatEntitycounter (const std::string &tag) const
 accessor to certain counter by name More...
 
StatEntitycounter (const std::string &tag) const
 accessor to certain counter by name More...
 
void resetMsgStream () const
 
void resetMsgStream () const
 
bool typePrint () const
 Insert the actual C++ type of the algorithm/tool in the messages ? More...
 
bool typePrint () const
 Insert the actual C++ type of the algorithm/tool in the messages ? More...
 
bool propsPrint () const
 Print properties at initialization ? More...
 
bool propsPrint () const
 Print properties at initialization ? More...
 
bool statPrint () const
 Print statistical counters at finalization ? More...
 
bool statPrint () const
 Print statistical counters at finalization ? More...
 
bool errorsPrint () const
 Print error counters at finalization ? More...
 
bool errorsPrint () const
 Print error counters at finalization ? More...
 
long printStat (const MSG::Level level=MSG::ALWAYS) const
 perform the actual printout of statistical counters More...
 
long printStat (const MSG::Level level=MSG::ALWAYS) const
 perform the actual printout of statistical counters More...
 
long printErrors (const MSG::Level level=MSG::ALWAYS) const
 perform the actual printout of error counters More...
 
long printErrors (const MSG::Level level=MSG::ALWAYS) const
 perform the actual printout of error counters More...
 
long printProps (const MSG::Level level=MSG::ALWAYS) const
 perform the actual printout of properties More...
 
long printProps (const MSG::Level level=MSG::ALWAYS) const
 perform the actual printout of properties More...
 
void registerCondition (const std::string &condition, StatusCode(CallerClass::*mf)()=nullptr)
 register the current instance to the UpdateManagerSvc as a consumer for a condition. More...
 
void registerCondition (const std::string &condition, CondType *&condPtrDest, StatusCode(CallerClass::*mf)()=NULL)
 register the current instance to the UpdateManagerSvc as a consumer for a condition. More...
 
void registerCondition (char *condition, StatusCode(CallerClass::*mf)()=NULL)
 just to avoid conflicts with the version using a pointer to a template class. More...
 
void registerCondition (TargetClass *condition, StatusCode(CallerClass::*mf)()=NULL)
 register the current instance to the UpdateManagerSvc as a consumer for a condition. More...
 
void registerCondition (const std::string &condition, StatusCode(CallerClass::*mf)()=nullptr)
 register the current instance to the UpdateManagerSvc as a consumer for a condition. More...
 
void registerCondition (const std::string &condition, CondType *&condPtrDest, StatusCode(CallerClass::*mf)()=NULL)
 register the current instance to the UpdateManagerSvc as a consumer for a condition. More...
 
void registerCondition (char *condition, StatusCode(CallerClass::*mf)()=NULL)
 just to avoid conflicts with the version using a pointer to a template class. More...
 
void registerCondition (TargetClass *condition, StatusCode(CallerClass::*mf)()=NULL)
 register the current instance to the UpdateManagerSvc as a consumer for a condition. More...
 
StatusCode runUpdate ()
 asks the UpdateManagerSvc to perform an update of the instance (if needed) without waiting the next BeginEvent incident. More...
 
StatusCode runUpdate ()
 asks the UpdateManagerSvc to perform an update of the instance (if needed) without waiting the next BeginEvent incident. More...
 
 GaudiCommon (const std::string &name, ISvcLocator *pSvcLocator)
 Algorithm constructor. More...
 
 GaudiCommon (const std::string &type, const std::string &name, const IInterface *parent)
 Tool constructor. More...
 
 GaudiCommon (const std::string &name, ISvcLocator *pSvcLocator)
 Algorithm constructor. More...
 
 GaudiCommon (const std::string &type, const std::string &name, const IInterface *parent)
 Tool constructor. More...
 
StatusCode initialize () override
 standard initialization method More...
 
StatusCode initialize () override
 standard initialization method More...
 
StatusCode finalize () override
 standard finalization method More...
 
StatusCode finalize () override
 standard finalization method More...
 
StatusCode release (const IInterface *interface) const
 Manual forced (and 'safe') release of the active tool or service. More...
 
StatusCode release (const IInterface *interface) const
 Manual forced (and 'safe') release of the active tool or service. More...
 
const Servicesservices () const
 get the list of aquired services More...
 
const Servicesservices () const
 get the list of aquired services More...
 
const std::string & context () const
 Returns the "context" string. Used to identify different processing states. More...
 
const std::string & context () const
 Returns the "context" string. Used to identify different processing states. More...
 
const std::string & rootInTES () const
 Returns the "rootInTES" string. More...
 
const std::string & rootInTES () const
 Returns the "rootInTES" string. More...
 
double globalTimeOffset () const
 Returns the "globalTimeOffset" double. More...
 
double globalTimeOffset () const
 Returns the "globalTimeOffset" double. More...
 
const std::string fullTESLocation (const std::string &location, const bool useRootInTES) const
 Returns the full correct event location given the rootInTes settings. More...
 
const std::string fullTESLocation (const std::string &location, const bool useRootInTES) const
 Returns the full correct event location given the rootInTes settings. More...
 
- Public Member Functions inherited from CommonMessaging< BASE >
 ~CommonMessaging () override=default
 Virtual destructor. More...
 
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...
 
MSG::Level msgLevel () const
 get the output level from the embedded MsgStream More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
 ~CommonMessaging () override=default
 Virtual destructor. More...
 
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...
 
MSG::Level msgLevel () const
 get the output level from the embedded MsgStream More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 

Public Attributes

int evtslots = 10
 
tuple whiteboard
 
tuple eventloopmgr
 
tuple a1
 
tuple a2 = CPUCruncher("A2")
 
tuple a3 = CPUCruncher("A3")
 
tuple a4 = CPUCruncher("A4")
 
string EvtSel = 'NONE'
 
list ExtSvc = [whiteboard]
 
 EventLoop = eventloopmgr,
 
list TopAlg = [a1,a2,a3,a4]
 

Protected Member Functions

 CPUCruncher (const std::string &name, ISvcLocator *pSvc)
 
virtual ~CPUCruncher ()
 virtual & protected desctrustor More...
 
- Protected Member Functions inherited from GaudiCommon< Algorithm >
 ~GaudiCommon () override=default
 Destructor. More...
 
 ~GaudiCommon () override=default
 Destructor. More...
 
StatusCode releaseTool (const IAlgTool *tool) const
 manual forced (and 'safe') release of the tool More...
 
StatusCode releaseTool (const IAlgTool *tool) const
 manual forced (and 'safe') release of the tool More...
 
StatusCode releaseSvc (const IInterface *svc) const
 manual forced (and 'safe') release of the service More...
 
StatusCode releaseSvc (const IInterface *svc) const
 manual forced (and 'safe') release of the service More...
 
- Protected Member Functions inherited from CommonMessaging< BASE >
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 

Private Member Functions

 CPUCruncher ()
 the default constructor is disabled More...
 
 CPUCruncher (const CPUCruncher &)
 the copy constructor is disabled More...
 
CPUCruncheroperator= (const CPUCruncher &)
 the assignement operator is disabled More...
 
void findPrimes (const unsigned long int)
 The CPU intensive function. More...
 
void calibrate ()
 Calibrate. More...
 
long unsigned int getNCaliIters (double)
 

Private Attributes

double m_avg_runtime
 
double m_var_runtime
 
bool m_local_rndm_gen
 
bool m_shortCalib
 
const uint MAX_INPUTS = 40
 
const uint MAX_OUTPUTS = 10
 
std::vector< DataObjectHandle< DataObject > * > m_inputHandles
 
std::vector< DataObjectHandle< DataObject > * > m_outputHandles
 
unsigned int m_rwRepetitions
 
bool m_sleepyExecution
 

Static Private Attributes

static std::vector< unsigned int > m_niters_vect
 
static std::vector< double > m_times_vect
 
static CHM m_name_ncopies_map
 

Friends

class AlgFactory< CPUCruncher >
 

Additional Inherited Members

- Protected Types inherited from GaudiCommon< Algorithm >
typedef std::map< std::string, StatEntityStatistics
 the actual type of general counters More...
 
typedef std::map< std::string, StatEntityStatistics
 the actual type of general counters More...
 
typedef std::map< std::string, unsigned int > Counter
 the actual type error/warning counter More...
 
typedef std::map< std::string, unsigned int > Counter
 the actual type error/warning counter More...
 
typedef std::vector< IAlgTool * > AlgTools
 storage for active tools More...
 
typedef std::vector< IAlgTool * > AlgTools
 storage for active tools More...
 
typedef std::vector< SmartIF< IService > > Services
 storage for active services More...
 
typedef std::vector< SmartIF< IService > > Services
 storage for active services More...
 
- Protected Attributes inherited from GaudiCommon< Algorithm >
SmartIF< ICounterSummarySvcm_counterSummarySvc
 a pointer to the CounterSummarySvc More...
 
std::vector< std::string > m_counterList
 list of counters to declare. Set by property CounterList. This can be a regular expression. More...
 
std::vector< std::string > m_statEntityList
 
- Protected Attributes inherited from CommonMessaging< BASE >
SmartIF< IMessageSvcm_msgsvc
 Pointer to the message service;. More...
 
std::unique_ptr< MsgStreamm_msgStream
 The predefined message stream. More...
 
bool m_streamWithService = false
 Flag to create a new MsgStream if it was created without the message service. More...
 
- Static Protected Attributes inherited from GaudiCommon< Algorithm >
static const bool IgnoreRootInTES
 Simple definition to be used with the new useRootInTES argument get<TYPE> and put methods. More...
 
static const bool UseRootInTES
 Simple definition to be used with the new useRootInTES argument get<TYPE> and put methods. More...
 

Detailed Description

A class that implements a search for prime numbers.

A lot of allocations are performed on purpose not to stress only the FP unit of the CPU.

Definition at line 19 of file CPUCruncher.h.

Member Typedef Documentation

typedef tbb::concurrent_hash_map<std::string,unsigned int> CPUCruncher::CHM

Definition at line 26 of file CPUCruncher.h.

Constructor & Destructor Documentation

CPUCruncher::CPUCruncher ( const std::string &  name,
ISvcLocator pSvc 
)
protected

Definition at line 18 of file CPUCruncher.cpp.

19  :
21  false) {
22 
23  // For Concurrent run
24  m_inputHandles.resize(MAX_INPUTS);
25  for (uint i = 0; i < MAX_INPUTS; ++i){
27  declareInput("input_" + std::to_string(i), *m_inputHandles[i]);
28  }
29 
31  for (uint i = 0; i < MAX_OUTPUTS; ++i){
33  declareOutput("output_" + std::to_string(i), *m_outputHandles[i]);
34  }
35 
36  declareProperty("avgRuntime", m_avg_runtime,
37  "Average runtime of the module.");
38  declareProperty("varRuntime", m_var_runtime,
39  "Variance of the runtime of the module.");
40  declareProperty("localRndm", m_local_rndm_gen = true,
41  "Decide if the local random generator is to be used");
42  declareProperty("NIterationsVect", m_niters_vect,
43  "Number of iterations for the calibration.");
44  declareProperty("NTimesVect", m_times_vect,
45  "Number of seconds for the calibration.");
46  declareProperty("shortCalib", m_shortCalib = false,
47  "Enable coarse grained calibration");
48  declareProperty("RwRepetitions", m_rwRepetitions = 1,
49  "Increase access to the WB");
50  declareProperty("SleepyExecution", m_sleepyExecution = false,
51  "Sleep during execution instead of crunching");
52 
53  // Register the algo in the static concurrent hash map in order to
54  // monitor the # of copies
55  CHM::accessor name_ninstances;
56  m_name_ncopies_map.insert(name_ninstances, name);
57  name_ninstances->second += 1;
58 }
bool m_sleepyExecution
Definition: CPUCruncher.h:87
string to_string(const T &value)
Definition: mergesort.cpp:40
bool m_shortCalib
Definition: CPUCruncher.h:68
const uint MAX_OUTPUTS
Definition: CPUCruncher.h:77
double m_avg_runtime
Definition: CPUCruncher.h:65
static std::vector< unsigned int > m_niters_vect
Definition: CPUCruncher.h:71
static CHM m_name_ncopies_map
Definition: CPUCruncher.h:84
static std::vector< double > m_times_vect
Definition: CPUCruncher.h:72
std::vector< DataObjectHandle< DataObject > * > m_inputHandles
Definition: CPUCruncher.h:79
unsigned int m_rwRepetitions
Definition: CPUCruncher.h:82
const uint MAX_INPUTS
Definition: CPUCruncher.h:76
bool m_local_rndm_gen
Definition: CPUCruncher.h:67
std::vector< DataObjectHandle< DataObject > * > m_outputHandles
Definition: CPUCruncher.h:80
list i
Definition: ana.py:128
double m_var_runtime
Definition: CPUCruncher.h:66
CPUCruncher::~CPUCruncher ( )
protectedvirtual

virtual & protected desctrustor

Definition at line 60 of file CPUCruncher.cpp.

60  {
61  for (uint i = 0; i < MAX_INPUTS; ++i) {
62  delete m_inputHandles[i];
63  }
64 
66  for (uint i = 0; i < MAX_OUTPUTS; ++i) {
67  delete m_outputHandles[i];
68  }
69 }
const uint MAX_OUTPUTS
Definition: CPUCruncher.h:77
std::vector< DataObjectHandle< DataObject > * > m_inputHandles
Definition: CPUCruncher.h:79
const uint MAX_INPUTS
Definition: CPUCruncher.h:76
std::vector< DataObjectHandle< DataObject > * > m_outputHandles
Definition: CPUCruncher.h:80
list i
Definition: ana.py:128
CPUCruncher::CPUCruncher ( )
private

the default constructor is disabled

CPUCruncher::CPUCruncher ( const CPUCruncher )
private

the copy constructor is disabled

Member Function Documentation

void CPUCruncher::calibrate ( )
private

Calibrate.

Definition at line 83 of file CPUCruncher.cpp.

83  {
84 
85  MsgStream log(msgSvc(), name());
86  m_niters_vect.push_back(0);
87  m_niters_vect.push_back(500);
88  m_niters_vect.push_back(600);
89  m_niters_vect.push_back(700);
90  m_niters_vect.push_back(800);
91  m_niters_vect.push_back(1000);
92  m_niters_vect.push_back(1300);
93  m_niters_vect.push_back(1600);
94  m_niters_vect.push_back(2000);
95  m_niters_vect.push_back(2300);
96  m_niters_vect.push_back(2600);
97  m_niters_vect.push_back(3000);
98  m_niters_vect.push_back(3300);
99  m_niters_vect.push_back(3500);
100  m_niters_vect.push_back(3900);
101  m_niters_vect.push_back(4200);
102  m_niters_vect.push_back(5000);
103  m_niters_vect.push_back(6000);
104  m_niters_vect.push_back(8000);
105  m_niters_vect.push_back(10000);
106  m_niters_vect.push_back(12000);
107  m_niters_vect.push_back(15000);
108  m_niters_vect.push_back(17000);
109  m_niters_vect.push_back(20000);
110  m_niters_vect.push_back(25000);
111  m_niters_vect.push_back(30000);
112  m_niters_vect.push_back(35000);
113  m_niters_vect.push_back(40000);
114  m_niters_vect.push_back(60000);
115  if (!m_shortCalib){
116  m_niters_vect.push_back(100000);
117  m_niters_vect.push_back(200000);
118  }
119 
120 
121  m_times_vect.resize(m_niters_vect.size());
122  m_times_vect[0]=0.;
123 
124 
125  log << MSG::INFO << "Starting calibration..." << endmsg;
126  for (unsigned int i=1;i<m_niters_vect.size();++i){
127  unsigned long niters=m_niters_vect[i];
128  unsigned int trials = 30;
129  do{
130  auto start_cali=tbb::tick_count::now();
131  findPrimes(niters);
132  auto stop_cali=tbb::tick_count::now();
133  double deltat = (stop_cali-start_cali).seconds();
134  m_times_vect[i]=deltat;
135  log << MSG::DEBUG << "Calibration: # iters = " << niters << " => " << deltat << endmsg;
136  trials--;
137  } while(trials > 0 and m_times_vect[i]<m_times_vect[i-1]); // make sure that they are monotonic
138  }
139  log << MSG::INFO << "Calibration finished!" << endmsg;
140 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
bool m_shortCalib
Definition: CPUCruncher.h:68
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
void findPrimes(const unsigned long int)
The CPU intensive function.
static std::vector< unsigned int > m_niters_vect
Definition: CPUCruncher.h:71
static std::vector< double > m_times_vect
Definition: CPUCruncher.h:72
list i
Definition: ana.py:128
StatusCode CPUCruncher::execute ( )
virtual

the execution of the algorithm

Definition at line 234 of file CPUCruncher.cpp.

235 {
236 
237  MsgStream logstream(msgSvc(), name());
238 
239  if (m_sleepyExecution) {
240  logstream << MSG::DEBUG << "Going to dream for: "<< m_avg_runtime << endmsg;
241  std::chrono::duration<double> dreamtime( m_avg_runtime );
242 
243  tbb::tick_count starttbb=tbb::tick_count::now();
244  std::this_thread::sleep_for(dreamtime);
245  tbb::tick_count endtbb=tbb::tick_count::now();
246  // actual sleeping time can be longer due to scheduling or resource contention delays
247  const double actualDreamTime=(endtbb-starttbb).seconds();
248 
249  logstream << MSG::DEBUG << "Actual dreaming time was: "<< actualDreamTime << "s" << endmsg;
250 
251  return StatusCode::SUCCESS;
252  }
253 
254  float runtime;
255 
256  if (m_local_rndm_gen){
257  /* This will disappear with a thread safe random number generator svc
258  * Use box mueller to generate gaussian randoms
259  * The quality is not good for in depth study given that the generator is a
260  * linear congruent.
261  * Throw away basically a free number: we are in a cpu cruncher after all.
262  * The seed is taken from the clock, but we could assign a seed per module to
263  * ensure reproducibility.
264  *
265  * This is not an overkill but rather an exercise towards a thread safe
266  * random number generation.
267  */
268 
269  auto getGausRandom = [] (double mean, double sigma) -> double {
270 
271  unsigned int seed = std::clock();
272 
273  auto getUnifRandom = [] (unsigned int & seed) ->double {
274  // from numerical recipies
275  constexpr unsigned int m = 232;
276  constexpr unsigned int a = 1664525;
277  constexpr unsigned int c = 1013904223;
278  seed = (a * seed + c) % m;
279  const double unif = double(seed) / m;
280  return unif;
281  };
282 
283  const double unif1 = getUnifRandom(seed);
284  const double unif2 = getUnifRandom(seed);
285  const double normal = sqrt(-2.*log(unif1))*cos(2*M_PI*unif2);
286  return normal*sigma + mean;
287  };
288  runtime = fabs(getGausRandom( m_avg_runtime , m_var_runtime ));
289  //End Of temp block
290  } else {
291  // Should be a member.
293  runtime = std::fabs(rndmgaus());
294  }
295 
296  tbb::tick_count starttbb=tbb::tick_count::now();
297  logstream << MSG::DEBUG << "Runtime will be: "<< runtime << endmsg;
298  if (getContext())
299  logstream << MSG::DEBUG << "Start event " << getContext()->evt()
300  << " in slot " << getContext()->slot()
301  << " on pthreadID " << std::hex << pthread_self() << std::dec
302  << endmsg;
303 
304  for (auto & inputHandle: m_inputHandles){
305  if(!inputHandle->isValid())
306  continue;
307 
308  DataObject* obj = nullptr;
309  for (unsigned int i=0; i<m_rwRepetitions;++i){
310  obj = inputHandle->get();
311  }
312  if (obj == nullptr)
313  logstream << MSG::ERROR << "A read object was a null pointer." << endmsg;
314  }
315 
316  const unsigned long n_iters= getNCaliIters(runtime);
317  findPrimes( n_iters );
318 
319  for (auto & outputHandle: m_outputHandles){
320  if(!outputHandle->isValid())
321  continue;
322 
323  outputHandle->put(new DataObject());
324  }
325 
326  for (auto & inputHandle: m_inputHandles){
327  if(!inputHandle->isValid())
328  continue;
329 
330  for (unsigned int i=1; i<m_rwRepetitions;++i){
331  inputHandle->get();
332  }
333  }
334 
335  tbb::tick_count endtbb=tbb::tick_count::now();
336 
337  const double actualRuntime=(endtbb-starttbb).seconds();
338 
339  if (getContext())
340  logstream << MSG::DEBUG << "Finish event " << getContext()->evt()
341  // << " on pthreadID " << getContext()->m_thread_id
342  << " in " << actualRuntime << " seconds" << endmsg;
343 
344  logstream << MSG::DEBUG << "Timing: ExpectedRuntime= " << runtime
345  << " ActualRuntime= " << actualRuntime
346  << " Ratio= " << runtime/actualRuntime
347  << " Niters= " << n_iters << endmsg;
348 
349 
350  return StatusCode::SUCCESS ;
351 }
tuple c
Definition: gaudirun.py:391
bool m_sleepyExecution
Definition: CPUCruncher.h:87
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
void findPrimes(const unsigned long int)
The CPU intensive function.
double m_avg_runtime
Definition: CPUCruncher.h:65
Parameters for the Gauss random number generation.
long unsigned int getNCaliIters(double)
constexpr double m
Definition: SystemOfUnits.h:93
std::vector< DataObjectHandle< DataObject > * > m_inputHandles
Definition: CPUCruncher.h:79
unsigned int m_rwRepetitions
Definition: CPUCruncher.h:82
std::vector< DataObjectHandle< DataObject > * > m_outputHandles
Definition: CPUCruncher.h:80
bool m_local_rndm_gen
Definition: CPUCruncher.h:67
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
list i
Definition: ana.py:128
double m_var_runtime
Definition: CPUCruncher.h:66
StatusCode CPUCruncher::finalize ( )
virtual

the finalization of the algorithm

Definition at line 355 of file CPUCruncher.cpp.

356 {
357  MsgStream log(msgSvc(), name());
358 
359  unsigned int ninstances;
360 
361  {
362  CHM::const_accessor const_name_ninstances;
363  m_name_ncopies_map.find(const_name_ninstances,name());
364  ninstances=const_name_ninstances->second;
365  }
366 
367  constexpr double s2ms=1000.;
368  // do not show repetitions
369  if (ninstances!=0){
370  log << MSG::INFO << "Summary: name= "<< name()
371  <<"\t avg_runtime= " << m_avg_runtime*s2ms
372  << "\t n_clones= " << ninstances << endmsg;
373 
374  CHM::accessor name_ninstances;
375  m_name_ncopies_map.find(name_ninstances,name());
376  name_ninstances->second=0;
377  }
378 
379  return GaudiAlgorithm::finalize () ;
380 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
double m_avg_runtime
Definition: CPUCruncher.h:65
static CHM m_name_ncopies_map
Definition: CPUCruncher.h:84
StatusCode finalize() override
standard finalization method
void CPUCruncher::findPrimes ( const unsigned long int  n_iterations)
private

The CPU intensive function.

Definition at line 177 of file CPUCruncher.cpp.

177  {
178 
179 
180  MsgStream log(msgSvc(), name());
181 
182  // Flag to trigger the allocation
183  bool is_prime;
184 
185  // Let's prepare the material for the allocations
186  unsigned int primes_size=1;
187  unsigned long* primes = new unsigned long[primes_size];
188  primes[0]=2;
189 
190  unsigned long i = 2;
191 
192  // Loop on numbers
193  for (unsigned long int iiter=0;iiter<n_iterations;iiter++ ){
194  // Once at max, it returns to 0
195  i+=1;
196 
197  // Check if it can be divided by the smaller ones
198  is_prime = true;
199  for (unsigned long j=2;j<i && is_prime;++j){
200  if (i%j == 0){
201  is_prime = false;
202  }
203  }// end loop on numbers < than tested one
204  if (is_prime){
205  // copy the array of primes (INEFFICIENT ON PURPOSE!)
206  unsigned int new_primes_size = 1 + primes_size;
207  unsigned long* new_primes = new unsigned long[new_primes_size];
208 
209  for (unsigned int prime_index=0; prime_index<primes_size;prime_index++){
210  new_primes[prime_index]=primes[prime_index];
211  }
212  // attach the last prime
213  new_primes[primes_size]=i;
214 
215  // Update primes array
216  delete[] primes;
217  primes = new_primes;
218  primes_size=new_primes_size;
219  } // end is prime
220 
221  } // end of while loop
222 
223  // Fool Compiler optimisations:
224  for (unsigned int prime_index=0; prime_index<primes_size;prime_index++)
225  if (primes[prime_index] == 4)
226  log << "This does never happen, but it's necessary too fool aggressive compiler optimisations!"<< endmsg ;
227 
228  delete[] primes;
229 
230 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
list i
Definition: ana.py:128
const std::vector< std::string > CPUCruncher::get_inputs ( )
virtual

Get the inputs.

Definition at line 385 of file CPUCruncher.cpp.

386 {
387  std::vector<std::string> di;
388  for (auto & h: m_inputHandles){
389  if(h->isValid())
390  di.push_back(h->dataProductName());
391  }
392 
393  return di;
394 }
std::vector< DataObjectHandle< DataObject > * > m_inputHandles
Definition: CPUCruncher.h:79
const std::vector< std::string > CPUCruncher::get_outputs ( )
virtual

Get the outputs.

Definition at line 399 of file CPUCruncher.cpp.

400 {
401  std::vector<std::string> di;
402  for (auto & h: m_outputHandles){
403  if(h->isValid())
404  di.push_back(h->dataProductName());
405  }
406 
407  return di;
408 }
std::vector< DataObjectHandle< DataObject > * > m_outputHandles
Definition: CPUCruncher.h:80
double CPUCruncher::get_runtime ( ) const
inline

Definition at line 39 of file CPUCruncher.h.

39 { return m_avg_runtime; };
double m_avg_runtime
Definition: CPUCruncher.h:65
unsigned long CPUCruncher::getNCaliIters ( double  runtime)
private

Definition at line 142 of file CPUCruncher.cpp.

142  {
143 
144  unsigned int smaller_i=0;
145  double time=0.;
146  bool found=false;
147  // We know that the first entry is 0, so we start to iterate from 1
148  for (unsigned int i=1;i<m_times_vect.size();i++){
149  time = m_times_vect[i];
150  if (time>runtime){
151  smaller_i=i-1;
152  found=true;
153  break;
154  }
155  }
156 
157  // Case 1: we are outside the interpolation range, we take the last 2 points
158  if (not found)
159  smaller_i=m_times_vect.size()-2;
160 
161  // Case 2: we maeke a linear interpolation
162  // y=mx+q
163  const double x0=m_times_vect[smaller_i];
164  const double x1=m_times_vect[smaller_i+1];
165  const double y0=m_niters_vect[smaller_i];
166  const double y1=m_niters_vect[smaller_i+1];
167  const double m=(y1-y0)/(x1-x0);
168  const double q=y0-m*x0;
169 
170  const unsigned long nCaliIters = m * runtime + q ;
171  //always() << x0 << "<" << runtime << "<" << x1 << " Corresponding to " << nCaliIters << " iterations" << endmsg;
172 
173  return nCaliIters ;
174 }
static std::vector< unsigned int > m_niters_vect
Definition: CPUCruncher.h:71
constexpr double m
Definition: SystemOfUnits.h:93
static std::vector< double > m_times_vect
Definition: CPUCruncher.h:72
list i
Definition: ana.py:128
StatusCode CPUCruncher::initialize ( )
virtual

Its initialization.

Definition at line 71 of file CPUCruncher.cpp.

71  {
72  if (m_times_vect.size()==0){
73  calibrate();
74  }
75 
76  return StatusCode::SUCCESS ;
77 }
void calibrate()
Calibrate.
Definition: CPUCruncher.cpp:83
static std::vector< double > m_times_vect
Definition: CPUCruncher.h:72
CPUCruncher& CPUCruncher::operator= ( const CPUCruncher )
private

the assignement operator is disabled

Friends And Related Function Documentation

friend class AlgFactory< CPUCruncher >
friend

Definition at line 22 of file CPUCruncher.h.

Member Data Documentation

tuple CPUCruncher.a1
Initial value:
1 = CPUCruncher("A1",
2  varRuntime=.1,
3  avgRuntime=.5,
4  shortCalib = True )

Definition at line 16 of file CPUCruncher.py.

tuple CPUCruncher.a2 = CPUCruncher("A2")

Definition at line 22 of file CPUCruncher.py.

tuple CPUCruncher.a3 = CPUCruncher("A3")

Definition at line 26 of file CPUCruncher.py.

tuple CPUCruncher.a4 = CPUCruncher("A4")

Definition at line 30 of file CPUCruncher.py.

CPUCruncher.EventLoop = eventloopmgr,

Definition at line 38 of file CPUCruncher.py.

tuple CPUCruncher.eventloopmgr
Initial value:
1 = HiveEventLoopMgr(MaxEventsParallel = evtslots,
2  MaxAlgosParallel = 20,
3  NumThreads = 8,
4  AlgosDependencies = [[],['a1'],['a1'],['a2','a3']])

Definition at line 11 of file CPUCruncher.py.

string CPUCruncher.EvtSel = 'NONE'

Definition at line 36 of file CPUCruncher.py.

int CPUCruncher.evtslots = 10

Definition at line 6 of file CPUCruncher.py.

list CPUCruncher.ExtSvc = [whiteboard]

Definition at line 37 of file CPUCruncher.py.

double CPUCruncher::m_avg_runtime
private

Definition at line 65 of file CPUCruncher.h.

std::vector<DataObjectHandle<DataObject> *> CPUCruncher::m_inputHandles
private

Definition at line 79 of file CPUCruncher.h.

bool CPUCruncher::m_local_rndm_gen
private

Definition at line 67 of file CPUCruncher.h.

CPUCruncher::CHM CPUCruncher::m_name_ncopies_map
staticprivate

Definition at line 84 of file CPUCruncher.h.

std::vector< unsigned int > CPUCruncher::m_niters_vect
staticprivate

Definition at line 71 of file CPUCruncher.h.

std::vector<DataObjectHandle<DataObject> *> CPUCruncher::m_outputHandles
private

Definition at line 80 of file CPUCruncher.h.

unsigned int CPUCruncher::m_rwRepetitions
private

Definition at line 82 of file CPUCruncher.h.

bool CPUCruncher::m_shortCalib
private

Definition at line 68 of file CPUCruncher.h.

bool CPUCruncher::m_sleepyExecution
private

Definition at line 87 of file CPUCruncher.h.

std::vector< double > CPUCruncher::m_times_vect
staticprivate

Definition at line 72 of file CPUCruncher.h.

double CPUCruncher::m_var_runtime
private

Definition at line 66 of file CPUCruncher.h.

const uint CPUCruncher::MAX_INPUTS = 40
private

Definition at line 76 of file CPUCruncher.h.

const uint CPUCruncher::MAX_OUTPUTS = 10
private

Definition at line 77 of file CPUCruncher.h.

list CPUCruncher.TopAlg = [a1,a2,a3,a4]

Definition at line 39 of file CPUCruncher.py.

tuple CPUCruncher.whiteboard
Initial value:
1 = HiveWhiteBoard("EventDataSvc",
2  EventSlots = evtslots)

Definition at line 8 of file CPUCruncher.py.


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