diff --git a/python/scripts/nvbench_compare.py b/python/scripts/nvbench_compare.py index cd17207..e601b86 100644 --- a/python/scripts/nvbench_compare.py +++ b/python/scripts/nvbench_compare.py @@ -1239,13 +1239,21 @@ def compute_timing_interval_from_samples(samples): return interval +def percentile_rank(percentile: int, sample_count: int) -> int: + clamped_percentile = min(max(percentile, 0), 100) + return round((clamped_percentile / 100.0) * (sample_count - 1)) + + def compute_robust_timing_input_from_samples(samples): values = positive_finite_array(samples) if values is None: return None - first_quartile, median, third_quartile = np.quantile(values, [0.25, 0.5, 0.75]) + sorted_values = np.sort(values) + first_quartile = sorted_values[percentile_rank(25, len(sorted_values))] + median = sorted_values[percentile_rank(50, len(sorted_values))] + third_quartile = sorted_values[percentile_rank(75, len(sorted_values))] interval = make_timing_interval( - lower=np.min(values), + lower=sorted_values[0], upper=third_quartile, center=median, ) diff --git a/python/test/test_nvbench_compare.py b/python/test/test_nvbench_compare.py index 94fcca2..75e05ed 100644 --- a/python/test/test_nvbench_compare.py +++ b/python/test/test_nvbench_compare.py @@ -801,14 +801,15 @@ def test_compare_gpu_timings_classifies_common_cases(tmp_path, nvbench_compare): mean=100.0, stdev=1.0, stdev_relative=0.01, - sample_values=[4.0, 5.0, 6.0], + sample_values=[4.0, 5.0, 6.0, 100.0], ), ) assert mixed_robust_summary_and_bulk is not None assert mixed_robust_summary_and_bulk.ref_time == pytest.approx(10.0) - assert mixed_robust_summary_and_bulk.cmp_time == pytest.approx(5.0) + assert mixed_robust_summary_and_bulk.cmp_time == pytest.approx(6.0) assert mixed_robust_summary_and_bulk.ref_interval.center == pytest.approx(10.0) - assert mixed_robust_summary_and_bulk.cmp_interval.center == pytest.approx(5.0) + assert mixed_robust_summary_and_bulk.cmp_interval.center == pytest.approx(6.0) + assert mixed_robust_summary_and_bulk.cmp_interval.upper == pytest.approx(6.0) ref_interval_timing = make_gpu_timing_data( nvbench_compare,