summaryrefslogtreecommitdiff
path: root/simulator
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2020-07-23 20:55:25 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-08-24 19:48:24 +0200
commitdb3b8a63b66f5a34d17483bcb29a85bdd8b75598 (patch)
tree39e2a240448e2eb6bf6a5bbc324a0be2d082b95e /simulator
parentba5bce34d632ea9155dc957e90068d9f40b439ee (diff)
Make HPC sampling strategy consistent
Diffstat (limited to 'simulator')
-rw-r--r--simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt51
1 files changed, 38 insertions, 13 deletions
diff --git a/simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt b/simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt
index b24d6de1..d03d556b 100644
--- a/simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt
+++ b/simulator/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/trace/WorkloadSampler.kt
@@ -109,6 +109,24 @@ fun sampleHpcWorkload(
name.matches(pattern)
}
+ val hpcSequence = generateSequence(0) { it + 1 }
+ .map { index ->
+ val res = mutableListOf<TraceEntry<VmWorkload>>()
+ hpc.mapTo(res) { sample(it, index) }
+ res.shuffle(random)
+ res
+ }
+ .flatten()
+
+ val nonHpcSequence = generateSequence(0) { it + 1 }
+ .map { index ->
+ val res = mutableListOf<TraceEntry<VmWorkload>>()
+ nonHpc.mapTo(res) { sample(it, index) }
+ res.shuffle(random)
+ res
+ }
+ .flatten()
+
logger.debug { "Found ${hpc.size} HPC workloads and ${nonHpc.size} non-HPC workloads" }
val totalLoad = if (workload is CompositeWorkload) {
@@ -117,15 +135,14 @@ fun sampleHpcWorkload(
trace.sumByDouble { it.workload.image.tags.getValue("total-load") as Double }
}
+ logger.debug { "Total trace load: $totalLoad" }
+
val res = mutableListOf<TraceEntry<VmWorkload>>()
if (sampleOnLoad) {
var currentLoad = 0.0
var i = 0
- while (true) {
- // Sample random HPC entry with replacement
- val entry = sample(hpc.random(random), i++)
-
+ for (entry in hpcSequence) {
val entryLoad = entry.workload.image.tags.getValue("total-load") as Double
if ((currentLoad + entryLoad) / totalLoad > fraction || res.size > trace.size) {
break
@@ -135,8 +152,7 @@ fun sampleHpcWorkload(
res += entry
}
- (nonHpc as MutableList<TraceEntry<VmWorkload>>).shuffle(random)
- for (entry in nonHpc) {
+ for (entry in nonHpcSequence) {
val entryLoad = entry.workload.image.tags.getValue("total-load") as Double
if ((currentLoad + entryLoad) / totalLoad > 1 || res.size > trace.size) {
break
@@ -146,14 +162,23 @@ fun sampleHpcWorkload(
res += entry
}
} else {
- repeat((fraction * trace.size).toInt()) { i ->
- // Sample random HPC entry with replacement
- val entry = sample(hpc.random(random), i)
- res.add(entry)
- }
+ var hpcLoad = 0.0
+ hpcSequence
+ .take((fraction * trace.size).toInt())
+ .forEach { entry ->
+ hpcLoad += entry.workload.image.tags.getValue("total-load") as Double
+ res.add(entry)
+ }
+
+ var nonHpcLoad = 0.0
+ nonHpcSequence
+ .take(((1 - fraction) * trace.size).toInt())
+ .forEach { entry ->
+ nonHpcLoad += entry.workload.image.tags.getValue("total-load") as Double
+ res.add(entry)
+ }
- (nonHpc as MutableList<TraceEntry<VmWorkload>>).shuffle(random)
- res.addAll(nonHpc.subList(0, ((1 - fraction) * trace.size).toInt()))
+ logger.debug { "HPC load $hpcLoad and non-HPC load $nonHpcLoad" }
}
logger.info { "Sampled ${trace.size} VMs (fraction $fraction) into subset of ${res.size} VMs" }