diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-01-17 17:18:05 -0500 |
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-02-18 15:26:52 -0500 |
| commit | 53954671033dc878acbeef1ecf9ac653c7b1a58f (patch) | |
| tree | cf1605094cd114483887cac885d0188fdd72f6f8 /tools/testing | |
| parent | 0ae3f73af5ba8025abcb328913643b291698af35 (diff) | |
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: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Diffstat (limited to 'tools/testing')
| -rw-r--r-- | tools/testing/selftests/rcutorture/bin/kvm.sh | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/tools/testing/selftests/rcutorture/bin/kvm.sh b/tools/testing/selftests/rcutorture/bin/kvm.sh index ad3779cefdb8..18649b87ea6c 100644 --- a/tools/testing/selftests/rcutorture/bin/kvm.sh +++ b/tools/testing/selftests/rcutorture/bin/kvm.sh | |||
| @@ -214,7 +214,42 @@ do | |||
| 214 | done | 214 | done |
| 215 | sort -k2nr $T/cfgcpu > $T/cfgcpu.sort | 215 | sort -k2nr $T/cfgcpu > $T/cfgcpu.sort |
| 216 | 216 | ||
| 217 | awk < $T/cfgcpu.sort \ | 217 | awk < $T/cfgcpu.sort > $T/cfgcpu.pack -v ncpus=$cpus ' |
| 218 | BEGIN { | ||
| 219 | njobs = 0; | ||
| 220 | } | ||
| 221 | |||
| 222 | { | ||
| 223 | cf[njobs] = $1; | ||
| 224 | cpus[njobs] = $2; | ||
| 225 | njobs++; | ||
| 226 | } | ||
| 227 | |||
| 228 | END { | ||
| 229 | alldone = 0; | ||
| 230 | batch = 0; | ||
| 231 | nc = -1; | ||
| 232 | while (nc != ncpus) { | ||
| 233 | batch++; | ||
| 234 | nc = ncpus; | ||
| 235 | for (i = 0; i < njobs; i++) { | ||
| 236 | if (done[i]) | ||
| 237 | continue; | ||
| 238 | if (nc >= cpus[i] || nc == ncpus) { | ||
| 239 | done[i] = batch; | ||
| 240 | nc -= cpus[i]; | ||
| 241 | if (nc <= 0) | ||
| 242 | break; | ||
| 243 | } | ||
| 244 | } | ||
| 245 | } | ||
| 246 | for (b = 1; b <= batch; b++) | ||
| 247 | for (i = 0; i < njobs; i++) | ||
| 248 | if (done[i] == b) | ||
| 249 | print cf[i], cpus[i]; | ||
| 250 | }' | ||
| 251 | |||
| 252 | awk < $T/cfgcpu.pack \ | ||
| 218 | -v CONFIGDIR="$CONFIGFRAG/$kversion/" \ | 253 | -v CONFIGDIR="$CONFIGFRAG/$kversion/" \ |
| 219 | -v KVM="$KVM" \ | 254 | -v KVM="$KVM" \ |
| 220 | -v ncpus=$cpus \ | 255 | -v ncpus=$cpus \ |
