Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53954671 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcutorture: Do better bin packing



Running the standard set of rcutorture tests on 24 CPUs results in
the following sub-optimal schedule:

	----start batch----
	 TREE07 16
	----start batch----
	 TREE08 16
	 SRCU-P 8
	----start batch----
	 TREE01 8
	 TREE02 8
	 TREE03 8
	----start batch----
	 TREE04 8
	 TREE05 8
	 TREE06 8
	----start batch----
	 SRCU-N 4
	 TINY01 1
	 TINY02 1
	 TREE09 1

If one of the eight-CPU runs were to be moved into the first batch,
the test suite would complete in four batches rather than five.

This commit therefore uses a greedy algorithm to re-order the test
entries so that the sequential batching will produce an optimal schedule
in this case:

	----start batch----
	 TREE07 16
	 SRCU-P 8
	----start batch----
	 TREE08 16
	 TREE01 8
	----start batch----
	 TREE02 8
	 TREE03 8
	 TREE04 8
	----start batch----
	 TREE05 8
	 TREE06 8
	 SRCU-N 4
	 TINY01 1
	 TINY02 1
	 TREE09 1

Please note that this is still not an optimal bin-packing algorithm,
however, it does produce optimal solutions for most common scenarios.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
parent 0ae3f73a
Loading
Loading
Loading
Loading
+36 −1
Original line number Original line Diff line number Diff line
@@ -214,7 +214,42 @@ do
done
done
sort -k2nr $T/cfgcpu > $T/cfgcpu.sort
sort -k2nr $T/cfgcpu > $T/cfgcpu.sort


awk < $T/cfgcpu.sort \
awk < $T/cfgcpu.sort > $T/cfgcpu.pack -v ncpus=$cpus '
BEGIN {
	njobs = 0;
}

{
	cf[njobs] = $1;
	cpus[njobs] = $2;
	njobs++;
}

END {
	alldone = 0;
	batch = 0;
	nc = -1;
	while (nc != ncpus) {
		batch++;
		nc = ncpus;
		for (i = 0; i < njobs; i++) {
			if (done[i])
				continue;
			if (nc >= cpus[i] || nc == ncpus) {
				done[i] = batch;
				nc -= cpus[i];
				if (nc <= 0)
					break;
			}
		}
	}
	for (b = 1; b <= batch; b++)
		for (i = 0; i < njobs; i++)
			if (done[i] == b)
				print cf[i], cpus[i];
}'

awk < $T/cfgcpu.pack \
	-v CONFIGDIR="$CONFIGFRAG/$kversion/" \
	-v CONFIGDIR="$CONFIGFRAG/$kversion/" \
	-v KVM="$KVM" \
	-v KVM="$KVM" \
	-v ncpus=$cpus \
	-v ncpus=$cpus \