diff options
Diffstat (limited to 'simulator/opendc-simulator')
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) |
