[igt-dev] [i-g-t] tests/kms_setmode: basic Improve accuracy with using of confidence interval
Chris Wilson
chris at chris-wilson.co.uk
Fri Nov 20 15:05:56 UTC 2020
Quoting Ram Moon, AnandX (2020-11-20 09:12:40)
> Hi Chris,
>
> -----Original Message-----
> From: Ram Moon, AnandX
> Sent: Tuesday, November 3, 2020 11:28 PM
> To: Chris Wilson <chris at chris-wilson.co.uk>; igt-dev at lists.freedesktop.org
> Subject: RE: [igt-dev] [i-g-t] tests/kms_setmode: basic Improve accuracy with using of confidence interval
>
> Hi Chris,
>
> Thanks for your review comment.
>
> -----Original Message-----
> From: Chris Wilson <chris at chris-wilson.co.uk>
> Sent: Tuesday, November 3, 2020 4:19 PM
> To: Ram Moon, AnandX <anandx.ram.moon at intel.com>; igt-dev at lists.freedesktop.org
> Cc: Ram Moon, AnandX <anandx.ram.moon at intel.com>
> Subject: Re: [igt-dev] [i-g-t] tests/kms_setmode: basic Improve accuracy with using of confidence interval
>
> Quoting Anand Moon (2020-11-02 09:08:36)
> > Using confidence interval formula accuracy is estimates approximately
> > at 95% when {X} is the average of a sample of size n.
> > Use this confidence interval formula as used in statistics to estimate
> > the accuracy.
> >
> > Signed-off-by: Anand Moon <anandx.ram.moon at intel.com>
> > ---
> > See below link.
> > https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule#Cumulati
> > ve_distribution_function
> > ---
> > tests/kms_setmode.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/tests/kms_setmode.c b/tests/kms_setmode.c index
> > 92f3ead2..58814a13 100644
> > --- a/tests/kms_setmode.c
> > +++ b/tests/kms_setmode.c
> > @@ -494,7 +494,7 @@ static void check_timings(int crtc_idx, const drmModeModeInfo *kmode)
> > * which depend on timing, giving the lowest acceptable MTBF of 5.6s
> > * for 60Hz sampling rate.
> > */
> > - accuracy = 3. * stddev;
> > + accuracy = 3. * stddev / sqrt(CALIBRATE_TS_STEPS);
>
> Oops, yes, this should be standard error rather than deviation. Could you add igt_stats_get_std_error() so we don't hardcode N?
> -Chris
>
> Do you want me to rename accuracy to std_error and use stats.n_values instead of CALIBRATE_TS_STEPS I could not find the definition of igt_stats_get_std_error function.
>
> -Anand
>
> Thanks for fixing the code changes.
>
> Actually above changes fix the issue to improve the accuracy calculations.
> But now I am able to reproduce the original bug using 4K monitors on 5.8.x kernel, See below logs.
>
> CRTC[98] [Pipe A] Mode: 3840x2160 at 60Hz Connectors: DP-2[330] Expected frametime: 16668us; measured 16672.3us +- 1.805us accuracy 0.00% [0.07 scanlines]
> (kms_setmode:14315) CRITICAL: Test assertion failure function check_timings, file ../tests/kms_setmode.c:544:
> (kms_setmode:14315) CRITICAL: Failed assertion: fabs(mean - expected) < 1.718 * stddev
> (kms_setmode:14315) CRITICAL: vblank interval differs from modeline! expected 16667.6us, measured 16672us +- 1.805us, difference 4.7us (2.6 sigma) Stack trace:
> #0 ../lib/igt_core.c:1734 __igt_fail_assert()
> #1 ../tests/kms_setmode.c:544 test_one_combination()
> #2 ../tests/kms_setmode.c:834 __real_main883()
> #3 ../tests/kms_setmode.c:883 main()
> #4 ../csu/libc-start.c:342 __libc_start_main()
> #5 [_start+0x2e]
> Subtest basic failed.
> **** DEBUG ****
>
> So after in digging into the below comments it turns out that *confidence interval* with respect to standard deviation is calculated with *Cumulative distribution function* (formula)
>
> As per the Wikipedia table
> For various values of z, the percentage of values expected to lie in and outside the symmetric interval, CI = (−zσ, zσ), are as follows:
> [0] https://en.wikipedia.org/wiki/Standard_deviation#Rules_for_normally_distributed_data
>
> It turns out that *3 σ* gives around proportion percentage 99.7300204% which is according to the CI = (−zσ, zσ) table.
>
> I would like to submit a below patch as this changes fix the overall bug.
> Please share your thought and suggestion on any alternative approach I should try.
You would also have to update the comments as it no longer matches the
broaden 90% critical value.
Still debating what is a sensible error rate, but in the meantime I
would suggest a different approach: ignore the deviation if it is within
a single scanline.
Something like:
- igt_assert_f(fabs(mean - expected) < 1.718 * stddev,
- "vblank interval differs from modeline! expected %.1fus, measured %1.fus +- %.3fus, difference %.1fus (%.1f sigma)\n",
+ igt_assert_f(fabs(mean - expected) < max(line_time(kmode), 1.718 * stddev),
+ "vblank interval differs from modeline! expected %.1fus, measured %1.fus +- %.3fus, difference %.1fus (%.1f sigma, %.1f scanlines)\n",
expected, mean, stddev,
- fabs(mean - expected), fabs(mean - expected) / stddev);
+ fabs(mean - expected),
+ fabs(mean - expected) / stddev,
+ fabs(mean - expected) / line_time(kmode));
More information about the igt-dev
mailing list