summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@kernel.org>2022-05-19 09:06:16 +0200
committerMauro Carvalho Chehab <mchehab@kernel.org>2022-06-15 08:33:47 +0200
commit74f7970332cedbf57da24959fb287b451da9a945 (patch)
treead8845aa12f4899c4a557f7126c75f3ee5bd4157
parentdbe6a031860c1808dcb63d7816165ef4614828bc (diff)
benchmarks/gem_blt: fix baseline estimation
This test is expected to run under a certain time defined by a command line parameter (by default, 2s). In order to achive the specified time, the baseline() function tries to estimate the value of a counter that will get the minimal amount of interaction to wait for > 0.1s. However, currently, the baseline estimation is broken, returning a too big number, as it is measuring the memcpy() time, instead of actually gem_execbuf(). Due to that, a default test without passing any command line parameter would take more than 1.5 years to output the first benchmark data! Fix it by using the same logic that it is inside run() at the baseline time estimation. Before this patch, baseline could return 399242693. After it, it now return 20. That means an interval of about 120 ms at the code which runs a gem_execbuf() loop, which should be good enough to ensure that the tests won't take too long, and will approximately match the time specified by the excecution parameter '-t'. Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
-rw-r--r--benchmarks/gem_blt.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/benchmarks/gem_blt.c b/benchmarks/gem_blt.c
index 424ce8e7..bd8264b4 100644
--- a/benchmarks/gem_blt.c
+++ b/benchmarks/gem_blt.c
@@ -57,29 +57,21 @@ elapsed(const struct timespec *start, const struct timespec *end)
return (end->tv_sec - start->tv_sec) + 1e-9*(end->tv_nsec - start->tv_nsec);
}
-static int baseline(uint64_t bytes, int milliseconds)
+static int baseline(int fd, struct drm_i915_gem_execbuffer2 execbuf, int milliseconds)
{
struct timespec start, end;
- const int size = 64*1024*1024;
int count = 0;
- void *mem;
-
- mem = malloc(size);
- if (mem == NULL)
- return 1;
clock_gettime(CLOCK_MONOTONIC, &start);
do {
- memset(mem, count, size);
+ gem_execbuf(fd, &execbuf);
count++;
clock_gettime(CLOCK_MONOTONIC, &end);
- if (elapsed(&start, &end) > 0.1)
+ if (elapsed(&start, &end) > (milliseconds / 1000.))
break;
} while (1);
- free(mem);
-
- return ceil(1e-3*milliseconds/elapsed(&start, &end) * count * size / bytes);
+ return count;
}
static int gem_linear_blt(int fd,
@@ -260,7 +252,7 @@ static int run(int object, int batch, int time, int reps, int ncpus, unsigned fl
execbuf.flags |= I915_EXEC_NO_RELOC;
/* Guess how many loops we need for 0.1s */
- count = baseline((uint64_t)object * batch, 100) / ncpus;
+ count = baseline(fd, execbuf, 100) / ncpus;
if (flags & SYNC) {
time *= count / 2;
count = 1;