diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-09-08 13:43:17 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-09-08 14:11:53 +0100 |
commit | 4cce7155c09dbd6c262dc0251dacc99ff3267be7 (patch) | |
tree | cf5d09f0c4e65e9083483e46d1d7b9d5c4fa29bf /tests | |
parent | a0eebbddecaac3b11eca09b1d37e2c0b7be37d04 (diff) |
igt/gem_exec_nop: Check submitting nops to each engine in parallel
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/gem_exec_nop.c | 83 |
1 files changed, 78 insertions, 5 deletions
diff --git a/tests/gem_exec_nop.c b/tests/gem_exec_nop.c index 480eb8f1..451cb477 100644 --- a/tests/gem_exec_nop.c +++ b/tests/gem_exec_nop.c @@ -120,7 +120,74 @@ static bool ignore_engine(int fd, unsigned engine) return false; } -static void all(int fd, uint32_t handle, int timeout) +static void parallel(int fd, uint32_t handle, int timeout) +{ + struct drm_i915_gem_execbuffer2 execbuf; + struct drm_i915_gem_exec_object2 obj; + struct timespec start, now; + unsigned engines[16]; + const char *names[16]; + unsigned nengine; + unsigned engine; + unsigned long count; + double time, sum; + + sum = 0; + nengine = 0; + for_each_engine(fd, engine) { + if (ignore_engine(fd, engine)) + continue; + + engines[nengine] = engine; + names[nengine] = e__->name; + nengine++; + + time = nop_on_ring(fd, handle, engine, 1, &count) / count; + sum += time; + igt_debug("%s: %.3fus\n", e__->name, 1e6*time); + } + igt_require(nengine); + igt_info("average (individually): %.3fus\n", sum/nengine*1e6); + + memset(&obj, 0, sizeof(obj)); + obj.handle = handle; + + memset(&execbuf, 0, sizeof(execbuf)); + execbuf.buffers_ptr = (uintptr_t)&obj; + execbuf.buffer_count = 1; + execbuf.flags |= LOCAL_I915_EXEC_HANDLE_LUT; + execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC; + if (__gem_execbuf(fd, &execbuf)) { + execbuf.flags = 0; + gem_execbuf(fd, &execbuf); + } + gem_sync(fd, handle); + intel_detect_and_clear_missed_interrupts(fd); + + igt_fork(child, nengine) { + execbuf.flags &= ~ENGINE_FLAGS; + execbuf.flags |= engines[child]; + + count = 0; + clock_gettime(CLOCK_MONOTONIC, &start); + do { + for (int loop = 0; loop < 1024; loop++) + gem_execbuf(fd, &execbuf); + count += 1024; + clock_gettime(CLOCK_MONOTONIC, &now); + } while (elapsed(&start, &now) < timeout); + gem_sync(fd, handle); + clock_gettime(CLOCK_MONOTONIC, &now); + time = elapsed(&start, &now) / count; + igt_info("%s: %ld cycles, %.3fus\n", names[child], count, 1e6*time); + } + + igt_waitchildren(); + igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0); + +} + +static void series(int fd, uint32_t handle, int timeout) { struct drm_i915_gem_execbuffer2 execbuf; struct drm_i915_gem_exec_object2 obj; @@ -252,15 +319,21 @@ igt_main igt_fork_hang_detector(device); } - igt_subtest("basic") - all(device, handle, 10); + igt_subtest("basic-series") + series(device, handle, 10); + + igt_subtest("basic-parallel") + parallel(device, handle, 10); for (e = intel_execution_engines; e->name; e++) igt_subtest_f("%s", e->name) single(device, handle, e->exec_id | e->flags, e->name); - igt_subtest("all") - all(device, handle, 150); + igt_subtest("series") + series(device, handle, 150); + + igt_subtest("parallel") + parallel(device, handle, 150); igt_fixture { igt_stop_hang_detector(); |