* [PATCH i-g-t] tests/perf_pmu: Use absolute tolerance in accuracy tests @ 2018-03-07 11:11 Tvrtko Ursulin 2018-03-07 11:34 ` Chris Wilson 0 siblings, 1 reply; 4+ messages in thread From: Tvrtko Ursulin @ 2018-03-07 11:11 UTC (permalink / raw) To: igt-dev; +Cc: Intel-gfx From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> We need to use absolute tolerance when asserting on percentages. Relative tolerance in this case is unfair and inaccurate since it's strictness varies with relative target busyness. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> --- tests/perf_pmu.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c index 9ebffc64d1f1..8e547338b47c 100644 --- a/tests/perf_pmu.c +++ b/tests/perf_pmu.c @@ -1459,7 +1459,15 @@ static void __rearm_spin_batch(igt_spin_t *spin) __sync_synchronize(); } -#define div_round_up(a, b) (((a) + (b) - 1) / (b)) +#define __assert_within(x, ref, tol_up, tol_down) \ + igt_assert_f((double)(x) <= ((double)(ref) + (tol_up)) && \ + (double)(x) >= ((double)(ref) - (tol_down)), \ + "%f not within +%f/-%f of %f! ('%s' vs '%s')\n", \ + (double)(x), (double)(tol_up), (double)(tol_down), \ + (double)(ref), #x, #ref) + +#define assert_within(x, ref, tolerance) \ + __assert_within(x, ref, tolerance, tolerance) static void accuracy(int gem_fd, const struct intel_execution_engine2 *e, @@ -1571,7 +1579,7 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, /* Let the child run. */ read(link[0], &expected, sizeof(expected)); - assert_within_epsilon(expected, target_busy_pct/100., 0.05); + assert_within(100.0 * expected, target_busy_pct, 5); /* Collect engine busyness for an interesting part of child runtime. */ fd = open_pmu(I915_PMU_ENGINE_BUSY(e->class, e->instance)); @@ -1590,8 +1598,11 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, igt_info("error=%.2f%% (%.2f%% vs %.2f%%)\n", __error(busy_r, expected), 100 * busy_r, 100 * expected); - assert_within_epsilon(busy_r, expected, 0.15); - assert_within_epsilon(1 - busy_r, 1 - expected, 0.15); + busy_r *= 100.0; + expected *= 100.0; + + assert_within(busy_r, expected, 2); + assert_within(100.0 - busy_r, 100.0 - expected, 2); } igt_main -- 2.14.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH i-g-t] tests/perf_pmu: Use absolute tolerance in accuracy tests 2018-03-07 11:11 [PATCH i-g-t] tests/perf_pmu: Use absolute tolerance in accuracy tests Tvrtko Ursulin @ 2018-03-07 11:34 ` Chris Wilson 2018-03-09 11:54 ` [PATCH i-g-t v2] " Tvrtko Ursulin 0 siblings, 1 reply; 4+ messages in thread From: Chris Wilson @ 2018-03-07 11:34 UTC (permalink / raw) To: Tvrtko Ursulin, igt-dev; +Cc: Intel-gfx Quoting Tvrtko Ursulin (2018-03-07 11:11:19) > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > We need to use absolute tolerance when asserting on percentages. Relative > tolerance in this case is unfair and inaccurate since it's strictness > varies with relative target busyness. > > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > Cc: Chris Wilson <chris@chris-wilson.co.uk> > --- > tests/perf_pmu.c | 19 +++++++++++++++---- > 1 file changed, 15 insertions(+), 4 deletions(-) > > diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c > index 9ebffc64d1f1..8e547338b47c 100644 > --- a/tests/perf_pmu.c > +++ b/tests/perf_pmu.c > @@ -1459,7 +1459,15 @@ static void __rearm_spin_batch(igt_spin_t *spin) > __sync_synchronize(); > } > > -#define div_round_up(a, b) (((a) + (b) - 1) / (b)) > +#define __assert_within(x, ref, tol_up, tol_down) \ > + igt_assert_f((double)(x) <= ((double)(ref) + (tol_up)) && \ > + (double)(x) >= ((double)(ref) - (tol_down)), \ > + "%f not within +%f/-%f of %f! ('%s' vs '%s')\n", \ > + (double)(x), (double)(tol_up), (double)(tol_down), \ > + (double)(ref), #x, #ref) > + > +#define assert_within(x, ref, tolerance) \ > + __assert_within(x, ref, tolerance, tolerance) > > static void > accuracy(int gem_fd, const struct intel_execution_engine2 *e, > @@ -1571,7 +1579,7 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, > > /* Let the child run. */ > read(link[0], &expected, sizeof(expected)); > - assert_within_epsilon(expected, target_busy_pct/100., 0.05); > + assert_within(100.0 * expected, target_busy_pct, 5); > > /* Collect engine busyness for an interesting part of child runtime. */ > fd = open_pmu(I915_PMU_ENGINE_BUSY(e->class, e->instance)); > @@ -1590,8 +1598,11 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, > igt_info("error=%.2f%% (%.2f%% vs %.2f%%)\n", > __error(busy_r, expected), 100 * busy_r, 100 * expected); > > - assert_within_epsilon(busy_r, expected, 0.15); > - assert_within_epsilon(1 - busy_r, 1 - expected, 0.15); > + busy_r *= 100.0; > + expected *= 100.0; > + > + assert_within(busy_r, expected, 2); > + assert_within(100.0 - busy_r, 100.0 - expected, 2); The advantage of switching to absolute here is that we only need the single test. Ok, using a factor of 100 here should make the output more readable. Kill the extra assert_within, Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> But I suspect we may need to relax the target for kasan, we will see in a few days. -Chris _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH i-g-t v2] tests/perf_pmu: Use absolute tolerance in accuracy tests 2018-03-07 11:34 ` Chris Wilson @ 2018-03-09 11:54 ` Tvrtko Ursulin 2018-03-09 20:49 ` Chris Wilson 0 siblings, 1 reply; 4+ messages in thread From: Tvrtko Ursulin @ 2018-03-09 11:54 UTC (permalink / raw) To: igt-dev; +Cc: Intel-gfx From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> We need to use absolute tolerance when asserting on percentages. Relative tolerance in this case is unfair and inaccurate since it's strictness varies with relative target busyness. v2: * Do not include spin batch edit and submit into measured time. * Open PMU before child is in test PWM phase. * No need to emit test PWM for twice as long with the new explicit synchroniazation via pipe. * Log test duration in ms for better readability. * Drop inverse assert. (Chris Wilson) Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> # v1 --- tests/perf_pmu.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c index 9ebffc64d1f1..ff9f71540ee4 100644 --- a/tests/perf_pmu.c +++ b/tests/perf_pmu.c @@ -1459,7 +1459,15 @@ static void __rearm_spin_batch(igt_spin_t *spin) __sync_synchronize(); } -#define div_round_up(a, b) (((a) + (b) - 1) / (b)) +#define __assert_within(x, ref, tol_up, tol_down) \ + igt_assert_f((double)(x) <= ((double)(ref) + (tol_up)) && \ + (double)(x) >= ((double)(ref) - (tol_down)), \ + "%f not within +%f/-%f of %f! ('%s' vs '%s')\n", \ + (double)(x), (double)(tol_up), (double)(tol_down), \ + (double)(ref), #x, #ref) + +#define assert_within(x, ref, tolerance) \ + __assert_within(x, ref, tolerance, tolerance) static void accuracy(int gem_fd, const struct intel_execution_engine2 *e, @@ -1493,8 +1501,8 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, while (test_us < min_test_us) test_us += busy_us + idle_us; - igt_info("calibration=%luus, test=%luus; ratio=%.2f%% (%luus/%luus)\n", - pwm_calibration_us, test_us, + igt_info("calibration=%lums, test=%lums; ratio=%.2f%% (%luus/%luus)\n", + pwm_calibration_us / 1000, test_us / 1000, (double)busy_us / (busy_us + idle_us) * 100.0, busy_us, idle_us); @@ -1507,7 +1515,7 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, igt_fork(child, 1) { struct sched_param rt = { .sched_priority = 99 }; const unsigned long timeout[] = { - pwm_calibration_us * 1000, test_us * 2 * 1000 + pwm_calibration_us * 1000, test_us * 1000 }; struct drm_i915_gem_exec_object2 obj = {}; uint64_t total_busy_ns = 0, total_idle_ns = 0; @@ -1537,19 +1545,16 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, igt_nsec_elapsed(&test_start); do { - struct timespec t_busy = { }; - unsigned int target_idle_us; - - igt_nsec_elapsed(&t_busy); + unsigned int target_idle_us, t_busy; /* Restart the spinbatch. */ __rearm_spin_batch(spin); __submit_spin_batch(gem_fd, &obj, e); - measured_usleep(busy_us); + t_busy = measured_usleep(busy_us); igt_spin_batch_end(spin); gem_sync(gem_fd, obj.handle); - total_busy_ns += igt_nsec_elapsed(&t_busy); + total_busy_ns += t_busy; target_idle_us = (100 * total_busy_ns / target_busy_pct - (total_busy_ns + total_idle_ns)) / 1000; @@ -1569,12 +1574,13 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, igt_spin_batch_free(gem_fd, spin); } + fd = open_pmu(I915_PMU_ENGINE_BUSY(e->class, e->instance)); + /* Let the child run. */ read(link[0], &expected, sizeof(expected)); - assert_within_epsilon(expected, target_busy_pct/100., 0.05); + assert_within(100.0 * expected, target_busy_pct, 5); /* Collect engine busyness for an interesting part of child runtime. */ - fd = open_pmu(I915_PMU_ENGINE_BUSY(e->class, e->instance)); val[0] = __pmu_read_single(fd, &ts[0]); read(link[0], &expected, sizeof(expected)); val[1] = __pmu_read_single(fd, &ts[1]); @@ -1590,8 +1596,7 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, igt_info("error=%.2f%% (%.2f%% vs %.2f%%)\n", __error(busy_r, expected), 100 * busy_r, 100 * expected); - assert_within_epsilon(busy_r, expected, 0.15); - assert_within_epsilon(1 - busy_r, 1 - expected, 0.15); + assert_within(100.0 * busy_r, 100.0 * expected, 2); } igt_main -- 2.14.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH i-g-t v2] tests/perf_pmu: Use absolute tolerance in accuracy tests 2018-03-09 11:54 ` [PATCH i-g-t v2] " Tvrtko Ursulin @ 2018-03-09 20:49 ` Chris Wilson 0 siblings, 0 replies; 4+ messages in thread From: Chris Wilson @ 2018-03-09 20:49 UTC (permalink / raw) To: Tvrtko Ursulin, igt-dev; +Cc: Intel-gfx Quoting Tvrtko Ursulin (2018-03-09 11:54:13) > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > We need to use absolute tolerance when asserting on percentages. Relative > tolerance in this case is unfair and inaccurate since it's strictness > varies with relative target busyness. > > v2: > * Do not include spin batch edit and submit into measured time. > * Open PMU before child is in test PWM phase. > * No need to emit test PWM for twice as long with the new explicit > synchroniazation via pipe. > * Log test duration in ms for better readability. > * Drop inverse assert. (Chris Wilson) > > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > Cc: Chris Wilson <chris@chris-wilson.co.uk> > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> # v1 Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Would be nice to add a comment now we have a reasonable suspicion: > @@ -1537,19 +1545,16 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e, > > igt_nsec_elapsed(&test_start); > do { > - struct timespec t_busy = { }; > - unsigned int target_idle_us; > - > - igt_nsec_elapsed(&t_busy); > + unsigned int target_idle_us, t_busy; > > /* Restart the spinbatch. */ > __rearm_spin_batch(spin); > __submit_spin_batch(gem_fd, &obj, e); /* * Note that the submission may be delayed to a tasklet (ksoftirqd) * which cannot run until we sleep as we hog the cpu (we are RT). */ > - measured_usleep(busy_us); > + t_busy = measured_usleep(busy_us); > igt_spin_batch_end(spin); > gem_sync(gem_fd, obj.handle); And back to thinking how we can kick the tasklet, or kick the habit. -Chris _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-03-09 20:49 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-03-07 11:11 [PATCH i-g-t] tests/perf_pmu: Use absolute tolerance in accuracy tests Tvrtko Ursulin 2018-03-07 11:34 ` Chris Wilson 2018-03-09 11:54 ` [PATCH i-g-t v2] " Tvrtko Ursulin 2018-03-09 20:49 ` Chris Wilson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox