Message ID | 20210707084849.304329-2-nsaenzju@redhat.com |
---|---|
State | New |
Headers | show |
Series | [1/2] oslat: Remove redundant include | expand |
On Wed, 7 Jul 2021, Nicolas Saenz Julienne wrote: > The point of preheat is to make sure CPUs are out of idle and running at > max frequency by the time the real test starts. So it's expected to > incur into extra latencies we don't really mean to measure. With this in > mind, it doesn't make sense to take into account the trace threshold > during that run. So don't do it. > > Note that this has been observed in practice. The threshold would be hit > during preheat but not during the real test. > > Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com> > --- > src/oslat/oslat.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c > index 1cba6fc..6ff5ba8 100644 > --- a/src/oslat/oslat.c > +++ b/src/oslat/oslat.c > @@ -29,6 +29,7 @@ > #include <numa.h> > #include <math.h> > #include <limits.h> > +#include <stdbool.h> > > #include <sys/prctl.h> > #include <sys/stat.h> > @@ -150,6 +151,7 @@ struct thread { > struct global { > /* Configuration. */ > unsigned int runtime_secs; > + bool preheat; > /* > * Number of threads running for current test > * (either pre heat or real run) > @@ -299,7 +301,7 @@ static void insert_bucket(struct thread *t, stamp_t value) > us = index + 1; > assert(us > 0); > > - if (g.trace_threshold && us >= g.trace_threshold) { > + if (!g.preheat && g.trace_threshold && us >= g.trace_threshold) { > char *line = "%s: Trace threshold (%d us) triggered with %u us!\n" > "Stopping the test.\n"; > tracemark(line, g.app_name, g.trace_threshold, us); > @@ -515,11 +517,12 @@ static void write_summary_json(FILE *f, void *data) > fprintf(f, " }\n"); > } > > -static void run_expt(struct thread *threads, int runtime_secs) > +static void run_expt(struct thread *threads, int runtime_secs, bool preheat) > { > int i; > > g.runtime_secs = runtime_secs; > + g.preheat = preheat; > g.n_threads_started = 0; > g.n_threads_running = 0; > g.n_threads_finished = 0; > @@ -846,14 +849,14 @@ int main(int argc, char *argv[]) > g.n_threads = 1; > else > g.n_threads = g.n_threads_total; > - run_expt(threads, 1); > + run_expt(threads, 1, true); > record_bias(threads); > > if (!g.quiet) > printf("Test starts...\n"); > /* Reset n_threads to always run on all the cores */ > g.n_threads = g.n_threads_total; > - run_expt(threads, g.runtime); > + run_expt(threads, g.runtime, false); > > if (!g.quiet) > printf("Test completed.\n\n"); > -- > 2.31.1 > > Signed-off-by: John Kacur <jkacur@redhat.com>
On Wed, 7 Jul 2021, Peter Xu wrote: > On Wed, Jul 07, 2021 at 10:48:49AM +0200, Nicolas Saenz Julienne wrote: > > The point of preheat is to make sure CPUs are out of idle and running at > > max frequency by the time the real test starts. So it's expected to > > incur into extra latencies we don't really mean to measure. With this in > > mind, it doesn't make sense to take into account the trace threshold > > during that run. So don't do it. > > > > Note that this has been observed in practice. The threshold would be hit > > during preheat but not during the real test. > > > > Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com> > > Reviewed-by: Peter Xu <peterx@redhat.com> > > -- > Peter Xu > > Thanks, added
diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c index 1cba6fc..6ff5ba8 100644 --- a/src/oslat/oslat.c +++ b/src/oslat/oslat.c @@ -29,6 +29,7 @@ #include <numa.h> #include <math.h> #include <limits.h> +#include <stdbool.h> #include <sys/prctl.h> #include <sys/stat.h> @@ -150,6 +151,7 @@ struct thread { struct global { /* Configuration. */ unsigned int runtime_secs; + bool preheat; /* * Number of threads running for current test * (either pre heat or real run) @@ -299,7 +301,7 @@ static void insert_bucket(struct thread *t, stamp_t value) us = index + 1; assert(us > 0); - if (g.trace_threshold && us >= g.trace_threshold) { + if (!g.preheat && g.trace_threshold && us >= g.trace_threshold) { char *line = "%s: Trace threshold (%d us) triggered with %u us!\n" "Stopping the test.\n"; tracemark(line, g.app_name, g.trace_threshold, us); @@ -515,11 +517,12 @@ static void write_summary_json(FILE *f, void *data) fprintf(f, " }\n"); } -static void run_expt(struct thread *threads, int runtime_secs) +static void run_expt(struct thread *threads, int runtime_secs, bool preheat) { int i; g.runtime_secs = runtime_secs; + g.preheat = preheat; g.n_threads_started = 0; g.n_threads_running = 0; g.n_threads_finished = 0; @@ -846,14 +849,14 @@ int main(int argc, char *argv[]) g.n_threads = 1; else g.n_threads = g.n_threads_total; - run_expt(threads, 1); + run_expt(threads, 1, true); record_bias(threads); if (!g.quiet) printf("Test starts...\n"); /* Reset n_threads to always run on all the cores */ g.n_threads = g.n_threads_total; - run_expt(threads, g.runtime); + run_expt(threads, g.runtime, false); if (!g.quiet) printf("Test completed.\n\n");
The point of preheat is to make sure CPUs are out of idle and running at max frequency by the time the real test starts. So it's expected to incur into extra latencies we don't really mean to measure. With this in mind, it doesn't make sense to take into account the trace threshold during that run. So don't do it. Note that this has been observed in practice. The threshold would be hit during preheat but not during the real test. Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com> --- src/oslat/oslat.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)