| The Gaudi Framework v32r1 (f65d50dc)

SequencerTimerTool.cpp
Go to the documentation of this file.
1 // Include files
2
3 // From ROOT
4 #include "TH1D.h"
5
6 // from Gaudi
7 #include "GaudiKernel/IRndmGenSvc.h"
8 #include "GaudiKernel/RndmGenerators.h"
9 #include "GaudiUtils/Aida2ROOT.h"
10
11 // local
12 #include "SequencerTimerTool.h"
13
14 //-----------------------------------------------------------------------------
15 // Implementation file for class : SequencerTimerTool
16 //
17 // 2004-05-19 : Olivier Callot
18 //-----------------------------------------------------------------------------
19
20 // Declaration of the Tool Factory
21 DECLARE_COMPONENT( SequencerTimerTool )
22
23 //=============================================================================
24 // Standard constructor, initializes variables
25 //=============================================================================
26 SequencerTimerTool::SequencerTimerTool( const std::string& type, const std::string& name, const IInterface* parent )
27 : GaudiHistoTool( type, name, parent ) {
28 declareInterface<ISequencerTimerTool>( this );
29
30 // Histograms are disabled by default in this tool.
31 setProperty( "HistoProduce", false ).ignore();
32 }
33 //=========================================================================
34 //
35 //=========================================================================
36 StatusCode SequencerTimerTool::initialize() {
37 const StatusCode sc = GaudiHistoTool::initialize();
38 if ( sc.isFailure() ) return sc;
39 double sum = 0;
40 TimerForSequencer norm( "normalize", m_headerSize, m_normFactor );
41 norm.start();
42 IRndmGenSvc* rsvc = svc<IRndmGenSvc>( "RndmGenSvc", true );
43 { // Use dummy loop suggested by Vanya Belyaev:
44 Rndm::Numbers gauss;
45 gauss.initialize( rsvc, Rndm::Gauss( 0., 1.0 ) ).ignore();
46 unsigned int shots = m_shots;
47 while ( 0 < --shots ) { sum += gauss() * sum; }
48 }
49 norm.stop();
50 double time = norm.lastCpu();
51 m_speedRatio = 1. / time;
52 info() << "This machine has a speed about " << format( "%6.2f", 1000. * m_speedRatio )
53 << " times the speed of a 2.8 GHz Xeon." << endmsg;
54 if ( m_normalised ) m_normFactor = m_speedRatio;
55 return sc;
56 }
57
58 //=========================================================================
59 // Finalize : Report timers
60 //=========================================================================
61 StatusCode SequencerTimerTool::finalize() {
62
63 std::string line( m_headerSize + 68, '-' );
64 info() << line << endmsg << "This machine has a speed about " << format( "%6.2f", 1000. * m_speedRatio )
65 << " times the speed of a 2.8 GHz Xeon.";
66 if ( m_normalised ) info() << " *** All times are renormalized ***";
67 info() << endmsg << TimerForSequencer::header( m_headerSize ) << endmsg << line << endmsg;
68
69 std::string lastName;
70 for ( const auto& timr : m_timerList ) {
71 if ( lastName == timr.name() ) continue; // suppress duplicate
72 lastName = timr.name();
73 info() << timr << endmsg;
74 }
75 info() << line << endmsg;
76
77 return GaudiHistoTool::finalize();
78 }
79
80 //=========================================================================
81 // Return the index of a specified name. Trailing and leading spaces ignored
82 //=========================================================================
83 int SequencerTimerTool::indexByName( const std::string& name ) {
84 auto beg = name.find_first_not_of( " \t" );
85 auto end = name.find_last_not_of( " \t" );
86 auto temp = name.substr( beg, end - beg + 1 );
87 auto i = std::find_if( std::begin( m_timerList ), std::end( m_timerList ), [&]( const TimerForSequencer& timer ) {
88 beg = timer.name().find_first_not_of( " \t" );
89 end = timer.name().find_last_not_of( " \t" );
90 return timer.name().compare( beg, end - beg + 1, temp ) == 0;
91 } );
92 return i != std::end( m_timerList ) ? std::distance( std::begin( m_timerList ), i ) : -1;
93 }
94
95 //=========================================================================
96 // Build and save the histograms
97 //=========================================================================
98 void SequencerTimerTool::saveHistograms() {
99 if ( produceHistos() ) {
100 info() << "Saving Timing histograms" << endmsg;
101 const size_t bins = m_timerList.size();
102 AIDA::IHistogram1D* histoTime = book( "ElapsedTime", 0, bins, bins );
103 AIDA::IHistogram1D* histoCPU = book( "CPUTime", 0, bins, bins );
104 AIDA::IHistogram1D* histoCount = book( "Count", 0, bins, bins );
105 TH1D* tHtime = Gaudi::Utils::Aida2ROOT::aida2root( histoTime );
106 TH1D* tHCPU = Gaudi::Utils::Aida2ROOT::aida2root( histoCPU );
107 TH1D* tHCount = Gaudi::Utils::Aida2ROOT::aida2root( histoCount );
108 for ( const auto& tfsq : m_timerList ) {
109 tHtime->Fill( tfsq.name().c_str(), tfsq.elapsedTotal() );
110 tHCPU->Fill( tfsq.name().c_str(), tfsq.cpuTotal() );
111 tHCount->Fill( tfsq.name().c_str(), tfsq.count() );
112 }
113 }
114 }
115
116 //=============================================================================
117 // Add a timer
118 //=============================================================================
119 int SequencerTimerTool::addTimer( const std::string& name ) {
120 std::string myName( 2 * m_indent, ' ' );
121 myName += name;
122 if ( myName.size() < m_headerSize ) { myName += std::string( m_headerSize - myName.size(), ' ' ); }
123 m_timerList.emplace_back( std::move( myName ), m_headerSize, m_normFactor );
124 return m_timerList.size() - 1;
125 }
126
127 //=============================================================================
plotSpeedupsPyRoot.time
def time
Definition: plotSpeedupsPyRoot.py:152
SequencerTimerTool::initialize
StatusCode initialize() override
initialize method, to compute the normalization factor
Definition: SequencerTimerTool.cpp:36
TimerForSequencer
Auxiliary class.
Definition: TimerForSequencer.h:20
TimerForSequencer::header
static std::string header(std::string::size_type size)
header matching the previous format
Definition: TimerForSequencer.cpp:60
std::distance
T distance(T... args)
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:109
std::string::find_first_not_of
T find_first_not_of(T... args)
gaudiComponentHelp.name
name
Definition: gaudiComponentHelp.py:41
TimerForSequencer::lastCpu
double lastCpu() const
returns the last measured time
Definition: TimerForSequencer.h:47
SequencerTimerTool::m_normalised
Gaudi::Property< bool > m_normalised
Definition: SequencerTimerTool.h:74
GaudiHistos< GaudiTool >::finalize
StatusCode finalize() override
standard finalization method
Definition: GaudiHistos.icpp:120
TimerForSequencer::stop
uint64_t stop()
Stop time measurement and return the last elapsed time.
Definition: TimerForSequencer.cpp:10
TimerForSequencer::name
const std::string & name() const
returns the name
Definition: TimerForSequencer.h:41
std
STL namespace.
std::end
T end(T... args)
Rndm::Gauss
Parameters for the Gauss random number generation.
Definition: RndmGenerators.h:22
TimerForSequencer::start
void start()
Start a time measurement.
Definition: TimerForSequencer.h:30
SequencerTimerTool::indexByName
int indexByName(const std::string &name) override
returns the index of the counter with that name, or -1
Definition: SequencerTimerTool.cpp:83
GaudiHistoTool
Simple class to extend the functionality of class GaudiTool.
Definition: GaudiHistoTool.h:39
INamedInterface::name
virtual const std::string & name() const =0
Retrieve the name of the instance.
std::string
STL class.
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
SequencerTimerTool::m_shots
Gaudi::Property< int > m_shots
Definition: SequencerTimerTool.h:73
SequencerTimerTool::saveHistograms
void saveHistograms() override
prepares and saves the timing histograms
Definition: SequencerTimerTool.cpp:98
Aida2ROOT.h
Rndm::Numbers
Random number accessor This small class encapsulates the use of the random number generator.
Definition: RndmGenerators.h:349
IRndmGenSvc
Random Generator service interface definition Definition of a interface for a service to access rando...
Definition: IRndmGenSvc.h:35
StatusCode
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
IInterface
Definition of the basic interface.
Definition: IInterface.h:244
gaudirun.type
type
Definition: gaudirun.py:142
SequencerTimerTool.h
setProperty
bool PyHelper() setProperty(IInterface *p, char *name, char *value)
Definition: Bootstrap.cpp:233
Gaudi::Utils::Aida2ROOT::aida2root
static TH1D * aida2root(AIDA::IHistogram1D *aida)
get the underlying pointer for 1D-histogram
Definition: Aida2ROOT.cpp:70
IOTest.end
def end
Definition: IOTest.py:112
SequencerTimerTool::addTimer
int addTimer(const std::string &name) override
add a timer entry with the specified name
Definition: SequencerTimerTool.cpp:119
std::move
T move(T... args)
RndmGenerators.h
std::string::find_last_not_of
T find_last_not_of(T... args)
SequencerTimerTool::m_indent
int m_indent
Amount of indentation.
Definition: SequencerTimerTool.h:79
std::find_if
T find_if(T... args)
std::vector::size
T size(T... args)
IRndmGenSvc.h
std::begin
T begin(T... args)
GaudiHistos< GaudiTool >::book
AIDA::IHistogram1D * book(const std::string &title, const double low=0, const double high=100, const unsigned long bins=100) const
book the 1D histogram
Definition: GaudiHistos.h:1849
Gaudi::Units::gauss
constexpr double gauss
Definition: SystemOfUnits.h:231
GaudiHistos< GaudiTool >::initialize
StatusCode initialize() override
standard initialization method
Definition: GaudiHistos.icpp:81
SequencerTimerTool
Implements the time measurement inside a sequencer.
Definition: SequencerTimerTool.h:25
SequencerTimerTool::m_timerList
std::vector< TimerForSequencer > m_timerList
Definition: SequencerTimerTool.h:80
std::string::substr
T substr(T... args)
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:130
SequencerTimerTool::m_headerSize
Gaudi::Property< std::string::size_type > m_headerSize
Definition: SequencerTimerTool.h:76
SequencerTimerTool::m_speedRatio
double m_speedRatio
Definition: SequencerTimerTool.h:82
SequencerTimerTool::finalize
StatusCode finalize() override
finalize method, to print the time summary table
Definition: SequencerTimerTool.cpp:61
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
plotSpeedupsPyRoot.line
line
Definition: plotSpeedupsPyRoot.py:170
GaudiHistos< GaudiTool >::produceHistos
bool produceHistos() const
get the flag for histogram production (property "HistoProduce")
Definition: GaudiHistos.h:2371
std::string::compare
T compare(T... args)
SequencerTimerTool::m_normFactor
double m_normFactor
Factor to convert to standard CPU (1 GHz PIII)
Definition: SequencerTimerTool.h:81
std::vector::emplace_back
T emplace_back(T... args)