user guide: add time measurement sections
This commit is contained in:
parent
a6b7b14d5e
commit
cdf48181e5
@ -693,6 +693,75 @@ another experiment (the results of the initialization). The
|
|||||||
initialization results will be cached if the derivation is kept
|
initialization results will be cached if the derivation is kept
|
||||||
invariant, when modifying the computation phase parameters.
|
invariant, when modifying the computation phase parameters.
|
||||||
.\" ===================================================================
|
.\" ===================================================================
|
||||||
|
.NH 2
|
||||||
|
Measurement of the execution time
|
||||||
|
.LP
|
||||||
|
The programs must measure the wall time of the computation phase following a
|
||||||
|
set of rules. The way in which the wall time is measured is very important to
|
||||||
|
get accurate results. The measured time must be implemented by using a
|
||||||
|
monotonic clock which is able to correct the drift of the oscillator of
|
||||||
|
the internal clock due to changes in temperature. This clock must be
|
||||||
|
measured in C and C++ with:
|
||||||
|
.CS
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
|
.CE
|
||||||
|
A helper function can be used the approximate value of the clock in a
|
||||||
|
double precision float, in seconds:
|
||||||
|
.CS
|
||||||
|
double get_time()
|
||||||
|
{
|
||||||
|
struct timespec tv;
|
||||||
|
if(clock_gettime(CLOCK_MONOTONIC, &tv) != 0)
|
||||||
|
{
|
||||||
|
perror("clock_gettime failed");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
return (double)(ts.tv_sec) +
|
||||||
|
(double)ts.tv_nsec * 1.0e-9;
|
||||||
|
}
|
||||||
|
.CE
|
||||||
|
The start and end points must be measured after the synchronization of
|
||||||
|
all the processes and threads, so the complete computation work can be
|
||||||
|
bounded to fit inside the measured interval. An example for a MPI
|
||||||
|
program:
|
||||||
|
.CS
|
||||||
|
double start, end, delta_time;
|
||||||
|
MPI_Barrier();
|
||||||
|
start = get_time();
|
||||||
|
run_simulation();
|
||||||
|
MPI_Barrier();
|
||||||
|
end = get_time();
|
||||||
|
delta_time = end - start;
|
||||||
|
.CE
|
||||||
|
.\" ===================================================================
|
||||||
|
.NH 2
|
||||||
|
Format of the execution time
|
||||||
|
.LP
|
||||||
|
The measured execution time must be printed to the standard output
|
||||||
|
(stdout) in scientific notation with at least 7 significative digits.
|
||||||
|
The following the printf format (or the strict equivalent in other languages)
|
||||||
|
must be used:
|
||||||
|
.CS
|
||||||
|
printf("time %e\\n", delta_time);
|
||||||
|
.CE
|
||||||
|
The line must be printed alone and only once: for MPI programs,
|
||||||
|
only one process shall print the time:
|
||||||
|
.CS
|
||||||
|
if(rank == 0) printf("time %e\\n", delta_time);
|
||||||
|
.CE
|
||||||
|
Other lines can be printed in the stdout, but without the
|
||||||
|
.I time
|
||||||
|
prefix, so that the following pipe can be used to capture the line:
|
||||||
|
.CS
|
||||||
|
% ./app | grep "^time"
|
||||||
|
1.234567e-01
|
||||||
|
.CE
|
||||||
|
Ensure that your program follows this convention by testing it with the
|
||||||
|
above
|
||||||
|
.I grep
|
||||||
|
filter; otherwise the results will fail to be parsed when building
|
||||||
|
the dataset with the execution time.
|
||||||
|
.\" ===================================================================
|
||||||
.bp
|
.bp
|
||||||
.NH 1
|
.NH 1
|
||||||
Experimentation
|
Experimentation
|
||||||
|
Loading…
Reference in New Issue
Block a user