mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-07-26 03:07:24 +00:00
benchmarks/gem_exec_ctx: Run for a fixed time
Rather than investigate the curve for dispatch latency, just run for a fixed time and report an average latency. Instead offer two modes, average single dispatch latency, average continuous dispatch latency. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
276fb3d3f4
commit
6953899beb
@ -45,15 +45,15 @@
|
|||||||
#include "igt_stats.h"
|
#include "igt_stats.h"
|
||||||
|
|
||||||
enum mode { NOP, CREATE, SWITCH, DEFAULT };
|
enum mode { NOP, CREATE, SWITCH, DEFAULT };
|
||||||
|
#define SYNC 0x1
|
||||||
|
|
||||||
#define LOCAL_I915_EXEC_NO_RELOC (1<<11)
|
#define LOCAL_I915_EXEC_NO_RELOC (1<<11)
|
||||||
#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
|
#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
|
||||||
|
|
||||||
static uint64_t elapsed(const struct timespec *start,
|
static double elapsed(const struct timespec *start,
|
||||||
const struct timespec *end,
|
const struct timespec *end)
|
||||||
int loop)
|
|
||||||
{
|
{
|
||||||
return (1000000000ULL*(end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec))/loop;
|
return (end->tv_sec - start->tv_sec) + 1e-9*(end->tv_nsec - start->tv_nsec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
|
static int __gem_execbuf(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
|
||||||
@ -82,11 +82,11 @@ static uint32_t __gem_context_create(int fd)
|
|||||||
return create.ctx_id;
|
return create.ctx_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int loop(unsigned ring, int reps, enum mode mode)
|
static int loop(unsigned ring, int reps, enum mode mode, unsigned flags)
|
||||||
{
|
{
|
||||||
struct drm_i915_gem_execbuffer2 execbuf;
|
struct drm_i915_gem_execbuffer2 execbuf;
|
||||||
struct drm_i915_gem_exec_object2 gem_exec;
|
struct drm_i915_gem_exec_object2 gem_exec;
|
||||||
int count, fds[2], fd;
|
int fds[2], fd;
|
||||||
uint32_t ctx;
|
uint32_t ctx;
|
||||||
|
|
||||||
fd = fds[0] = drm_open_driver(DRIVER_INTEL);
|
fd = fds[0] = drm_open_driver(DRIVER_INTEL);
|
||||||
@ -115,49 +115,49 @@ static int loop(unsigned ring, int reps, enum mode mode)
|
|||||||
}
|
}
|
||||||
ctx = gem_context_create(fd);
|
ctx = gem_context_create(fd);
|
||||||
|
|
||||||
for (count = 1; count <= 1<<16; count <<= 1) {
|
while (reps--) {
|
||||||
igt_stats_t stats;
|
struct timespec start, end;
|
||||||
int n;
|
unsigned count = 0;
|
||||||
|
|
||||||
igt_stats_init_with_size(&stats, reps);
|
sleep(1); /* wait for the hw to go back to sleep */
|
||||||
|
|
||||||
for (n = 0; n < reps; n++) {
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
struct timespec start, end;
|
do {
|
||||||
int loops = count;
|
uint32_t tmp;
|
||||||
sleep(1); /* wait for the hw to go back to sleep */
|
switch (mode) {
|
||||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
case CREATE:
|
||||||
while (loops--) {
|
ctx = execbuf.rsvd1;
|
||||||
uint32_t tmp;
|
execbuf.rsvd1 = gem_context_create(fd);
|
||||||
switch (mode) {
|
break;
|
||||||
case CREATE:
|
|
||||||
ctx = execbuf.rsvd1;
|
|
||||||
execbuf.rsvd1 = gem_context_create(fd);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SWITCH:
|
case SWITCH:
|
||||||
tmp = execbuf.rsvd1;
|
tmp = execbuf.rsvd1;
|
||||||
execbuf.rsvd1 = ctx;
|
execbuf.rsvd1 = ctx;
|
||||||
ctx = tmp;
|
ctx = tmp;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DEFAULT:
|
case DEFAULT:
|
||||||
fd = fds[loops & 1];
|
fd = fds[count & 1];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NOP:
|
case NOP:
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);
|
|
||||||
if (mode == CREATE)
|
|
||||||
gem_context_destroy(fd, ctx);
|
|
||||||
}
|
}
|
||||||
gem_sync(fd, gem_exec.handle);
|
do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);
|
||||||
clock_gettime(CLOCK_MONOTONIC, &end);
|
count++;
|
||||||
igt_stats_push(&stats, elapsed(&start, &end, count));
|
if (mode == CREATE)
|
||||||
}
|
gem_context_destroy(fd, ctx);
|
||||||
|
|
||||||
printf("%7.3f\n", igt_stats_get_trimean(&stats)/1000);
|
if (flags & SYNC)
|
||||||
igt_stats_fini(&stats);
|
gem_sync(fd, gem_exec.handle);
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
|
} while (elapsed(&start, &end) < 2.);
|
||||||
|
|
||||||
|
gem_sync(fd, gem_exec.handle);
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
|
printf("%7.3f\n", 1e6*elapsed(&start, &end) / count);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -165,11 +165,12 @@ static int loop(unsigned ring, int reps, enum mode mode)
|
|||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
unsigned ring = I915_EXEC_RENDER;
|
unsigned ring = I915_EXEC_RENDER;
|
||||||
|
unsigned flags = 0;
|
||||||
enum mode mode = NOP;
|
enum mode mode = NOP;
|
||||||
int reps = 13;
|
int reps = 1;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "e:r:b:")) != -1) {
|
while ((c = getopt (argc, argv, "e:r:b:s")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'e':
|
case 'e':
|
||||||
if (strcmp(optarg, "rcs") == 0)
|
if (strcmp(optarg, "rcs") == 0)
|
||||||
@ -203,10 +204,14 @@ int main(int argc, char **argv)
|
|||||||
reps = 1;
|
reps = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
flags |= SYNC;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return loop(ring, reps, mode);
|
return loop(ring, reps, mode, flags);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user