[Intel-gfx] [PATCH i-g-t] igt/gem_exec_nop/headless: Verify GT performance in headless mode

Chris Wilson chris at chris-wilson.co.uk
Thu Apr 13 21:11:58 UTC 2017


On Thu, Apr 13, 2017 at 02:14:17PM +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> 
> Check that no-op execution speed is the same in headless mode
> and with the display active.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100572
> Cc: Imre Deak <imre.deak at intel.com>
> ---
>  tests/gem_exec_nop.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
> 
> diff --git a/tests/gem_exec_nop.c b/tests/gem_exec_nop.c
> index 5d0d4957545e..e0e53a3108c6 100644
> --- a/tests/gem_exec_nop.c
> +++ b/tests/gem_exec_nop.c
> @@ -112,6 +112,45 @@ static void single(int fd, uint32_t handle,
>  		 ring_name, count, time*1e6 / count);
>  }
>  
> +static void headless(int fd, uint32_t handle)
> +{
> +	const struct intel_execution_engine *e = &intel_execution_engines[0];
> +	unsigned int nr_connected = 0;
> +	drmModeConnector *connector;
> +	drmModeRes *res;
> +	unsigned long n1, n2;
> +	double delta;
> +
> +	res = drmModeGetResources(fd);
> +	igt_assert(res);
> +
> +	/* require one connected connector for the test */
> +	for (int i = 0; i < res->count_connectors; i++) {
> +		connector = drmModeGetConnectorCurrent(fd, res->connectors[i]);
> +		if (connector->connection == DRM_MODE_CONNECTED)
> +			nr_connected++;
> +		drmModeFreeConnector(connector);
> +	}
> +	igt_require(nr_connected == 1);
> +
> +	/* warmup */
> +	nop_on_ring(fd, handle, e->exec_id | e->flags, 2, &n1);
> +	/* benchmark nops */
> +	nop_on_ring(fd, handle, e->exec_id | e->flags, 2, &n1);

Hmm, using count isn't great by itself as the duration may vary (but
significantly? unlikely).

Why just 1? How about using the median of 5 runs?

static double
stable_nop_on_ring(int fd,
		   unsigned int handle, unsigned int engine,
		   int timeout, int reps)
{
	igt_stats_t s;
	double n;

	assert(reps >= 5);

	igt_stats_init_with_size(&s, reps);
	s.is_float = true;

	while (reps--) {
		unsigned long count;
		double time;

		time = nop_on_ring(fd, handle, engine, timeout, &count);
		igt_stats_push_float(&s, time / count);
	}

	n = igt_stats_get_median(&s);
	igt_stats_fini(&s);

	return n;
}

n[ACTIVE] = stable_nop_on_ring(fd, handle, e>exec_id | e->flags, 2, 5);

> +
> +	/* force the last connector off */
> +	kmstest_unset_all_crtcs(fd, res);
> +
> +	/* warmup */
> +	nop_on_ring(fd, handle, e->exec_id | e->flags, 2, &n2);
> +	/* benchmark nops again */
> +	nop_on_ring(fd, handle, e->exec_id | e->flags, 2, &n2);
> +
> +	/* check that the two execution speeds are roughly the same */
> +	delta = abs((long)n2 - (long)n1);
> +	igt_assert(delta < n1 * 0.1f);

I suggest somethike like (tests/gem_spin_batch.c):

#define assert_float_within_epsilon(x, ref, tolerance) \
	igt_assert_f((x) <= (1 + tolerance/100.) * ref && \
		     (x) >= (1 - tolerance/100.) * ref, \
		     "'%s' != '%s' (%f not within %d%% tolerance of %fd)\n",\
#x, #ref, x, tolerance, ref)

	assert_float_within_epsilon(n[ACTIVE], n[HEADLESS], 10);

-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list