summaryrefslogtreecommitdiff
path: root/simulator/opendc-simulator
diff options
context:
space:
mode:
Diffstat (limited to 'simulator/opendc-simulator')
-rw-r--r--simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt8
-rw-r--r--simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt29
-rw-r--r--simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt5
3 files changed, 24 insertions, 18 deletions
diff --git a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt
index 1f26c9c9..252a40ec 100644
--- a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt
+++ b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt
@@ -101,11 +101,17 @@ public abstract class SimAbstractMachine(private val clock: Clock) : SimMachine
for ((cpu, source) in resources) {
val consumer = workload.getConsumer(ctx, cpu)
val adapter = SimSpeedConsumerAdapter(consumer) { newSpeed ->
+ val _speed = _speed
+ val _usage = _usage
+
val oldSpeed = _speed[cpu.id]
_speed[cpu.id] = newSpeed
totalSpeed = totalSpeed - oldSpeed + newSpeed
- updateUsage(totalSpeed / totalCapacity)
+ val newUsage = totalSpeed / totalCapacity
+ if (_usage.value != newUsage) {
+ updateUsage(totalSpeed / totalCapacity)
+ }
}
launch { source.consume(adapter) }
diff --git a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt
index 85613a57..cbfcd810 100644
--- a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt
+++ b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt
@@ -10,15 +10,12 @@ import kotlin.math.min
* The linear interpolation power model partially adapted from CloudSim.
* This model is developed to adopt the <a href="http://www.spec.org/power_ssj2008/">SPECpower benchmark</a>.
*
- * @param hardwareName The name of the hardware vendor.
+ * @param powerValues A [List] of average active power measured by the power analyzer(s) and accumulated by the
+ * PTDaemon (Power and Temperature Daemon) for this measurement interval, displayed as watts (W).
* @see <a href="http://www.spec.org/power_ssj2008/results/res2011q1/">Machines used in the SPEC benchmark</a>
*/
-public class InterpolationPowerModel(hardwareName: String) : PowerModel {
- /**
- * A [List] of average active power measured by the power analyzer(s) and accumulated by the
- * PTDaemon (Power and Temperature Daemon) for this measurement interval, displayed as watts (W).
- */
- private val averagePowerValues: List<Double> = loadAveragePowerValue(hardwareName)
+public class InterpolationPowerModel(private val powerValues: List<Double>) : PowerModel {
+ public constructor(hardwareName: String) : this(loadAveragePowerValue(hardwareName))
public override fun computePower(utilization: Double): Double {
val clampedUtilization = min(1.0, max(0.0, utilization))
@@ -34,7 +31,7 @@ public class InterpolationPowerModel(hardwareName: String) : PowerModel {
powerFlr + delta * (clampedUtilization - utilizationFlr.toDouble() / 10) * 100
}
- override fun toString(): String = "InterpolationPowerModel[entries=${averagePowerValues.size}]"
+ override fun toString(): String = "InterpolationPowerModel[entries=${powerValues.size}]"
/**
* Gets the power consumption for a given utilization percentage.
@@ -43,13 +40,15 @@ public class InterpolationPowerModel(hardwareName: String) : PowerModel {
* where 10 means 100% of utilization.
* @return the power consumption for the given utilization percentage
*/
- private fun getAveragePowerValue(index: Int): Double = averagePowerValues[index]
+ private fun getAveragePowerValue(index: Int): Double = powerValues[index]
- private fun loadAveragePowerValue(hardwareName: String, path: String = "spec_machines.yml"): List<Double> {
- val content = this::class
- .java.classLoader
- .getResourceAsStream(path)
- val hardwareToAveragePowerValues: Map<String, List<Double>> = Yaml().load(content)
- return hardwareToAveragePowerValues.getOrDefault(hardwareName, listOf())
+ private companion object {
+ private fun loadAveragePowerValue(hardwareName: String, path: String = "spec_machines.yml"): List<Double> {
+ val content = this::class
+ .java.classLoader
+ .getResourceAsStream(path)
+ val hardwareToAveragePowerValues: Map<String, List<Double>> = Yaml().load(content)
+ return hardwareToAveragePowerValues.getOrDefault(hardwareName, listOf())
+ }
}
}
diff --git a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt
index 2442d748..694a928b 100644
--- a/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt
+++ b/simulator/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt
@@ -50,14 +50,15 @@ public class SimTraceWorkload(public val trace: Sequence<Fragment>) : SimWorkloa
override fun onNext(ctx: SimResourceContext): SimResourceCommand {
val now = ctx.clock.millis()
val fragment = fragment ?: return SimResourceCommand.Exit
- val work = (fragment.duration / 1000) * fragment.usage
+ val usage = fragment.usage / fragment.cores
+ val work = (fragment.duration / 1000) * usage
val deadline = offset + fragment.duration
assert(deadline >= now) { "Deadline already passed" }
val cmd =
if (cpu.id < fragment.cores && work > 0.0)
- SimResourceCommand.Consume(work, fragment.usage, deadline)
+ SimResourceCommand.Consume(work, usage, deadline)
else
SimResourceCommand.Idle(deadline)