Timing your code
SIMULATeQCD provides a build-in timer called StopWatch
(src/base/stopWatch.h
).
It is capable of measuring the time duration CPU-only routines as well as the time duration GPU-kernels.
To initialize the timer you simply call
StopWatch<device> timer;
where device
is boolean template parameter.
If device = false
then only the time duration of CPU routines of the current rank will be considered.
If device = true
then the time duration of GPU-kernel executions will be considered
as well. Please do not construct the StopWatch before the CommBase!
Measuring time duration
Measuring the time duration is quite easy. Here is an example:
// Initialize timer which also measure GPU-Kernel execution times:
StopWatch<true> timer;
timer.start();
// ... do some computation ...
timer.stop();
rootLogger.info("First time: ", timer);
timer.reset();
timer.start();
// ... do some computation ...
timer.stop();
rootLogger.info("Second time: ", timer);
Combining different timers
It’s also possible to add/multiply/etc. different timers, e.g.:
StopWatch<true> timer1, timer2, timer3;
timer1.start();
// ... do some computation ...
timer1.stop();
// The streaming operator is overloaded, so you can directly
// print the time with the correct unit.
// The call below could print for example "First time: 5min 34s":
rootLogger.info("First time: ", timer1);
timer2.start();
// ... do some computation ...
timer2.stop();
rootLogger.info("Second time: ", timer2);
// Combine different timer
timer3 = timer1 + timer2;
timer3 = timer1 - timer2;
timer3 += timer2;
timer3 -= timer2;
timer3 /= 5;
timer3 *= 3;
Getting time in different units
There are some additional convenience functions to obtain the times in different units:
// Get time duration in certain units:
double microseconds = timer.microseconds();
double milliseconds = timer.milliseconds();
double seconds = timer.seconds();
double minutes = timer.minutes();
double hours = timer.hours();
double days = timer.days();
// Get time duration in a human friendly unit, e.g "123ms"
std::string time_str = timer.autoFormat();
Compute FLOP/s and MB/s
To compute FLOP/s and MB/s one may use these functions:
// set how many bytes were processed (for an MB/s output)
timer.setBytes(500);
// return MBytes/s (be sure to call setBytes() before)
double mbytess = timer.mbs();
// set how many FLOPs were calculated
timer.setFlops(500);
// return MFLOP/s (be sure to call setFlops() before)
double mflopss = timer.mflps();