scripts/sanitycheck: be more fair with dividing subsets
Since we do interger division to determine how many items are in each
set, its possible we can have bad rounding error and the last set having
a much larger amount of items compared to all other sets.
For example, total = 3740, sets = 300:
per_set = 3740 / 300 = 12.466 = 12
last_set = 3740 - 299 * 12 = 152
So instead of doing simple division, we add on extra item to the early
sets and we've exhausted the rounding error:
num_extra_sets = total - per_set * sets
140 = 3740 - 12 * 300
So the first 140 subsets will have 13 per_set, and the last 160 will
have 12 per_set.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
diff --git a/scripts/sanitycheck b/scripts/sanitycheck
index f6ab889..13f9eec 100755
--- a/scripts/sanitycheck
+++ b/scripts/sanitycheck
@@ -4283,12 +4283,21 @@
key=lambda x: x[0][x[0].find("/") + 1:]))
subset, sets = options.subset.split("/")
+ subset = int(subset)
+ sets = int(sets)
total = len(suite.instances)
- per_set = round(total / int(sets))
- start = (int(subset) - 1) * per_set
- if subset == sets:
- end = total
+ per_set = int(total / sets)
+ num_extra_sets = total - (per_set * sets)
+
+ # Try and be more fair for rounding error with integer division
+ # so the last subset doesn't get overloaded, we add 1 extra to
+ # subsets 1..num_extra_sets.
+ if subset <= num_extra_sets:
+ start = (subset - 1) * (per_set + 1)
+ end = start + per_set + 1
else:
+ base = num_extra_sets * (per_set + 1)
+ start = ((subset - num_extra_sets - 1) * per_set) + base
end = start + per_set
sliced_instances = islice(suite.instances.items(), start, end)