From 44215bd668c5fa3efe2f57fc577824478b00af57 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Thu, 1 Sep 2022 14:38:34 +0200 Subject: refactor(sim/compute): Re-implement using flow2 This change re-implements the OpenDC compute simulator framework using the new flow2 framework for modelling multi-edge flow networks. The re-implementation is written in Java and focusses on performance and clean API surface. --- .../capelin/topology/TopologyFactories.kt | 16 ++++++------- .../experiments/capelin/CapelinIntegrationTest.kt | 26 +++++++++++----------- 2 files changed, 21 insertions(+), 21 deletions(-) (limited to 'opendc-experiments/opendc-experiments-capelin/src') diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt index 08d4a7e0..0b4cafa6 100644 --- a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt +++ b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/topology/TopologyFactories.kt @@ -25,13 +25,13 @@ package org.opendc.experiments.capelin.topology import org.opendc.experiments.compute.topology.HostSpec +import org.opendc.simulator.compute.SimPsuFactories import org.opendc.simulator.compute.model.MachineModel import org.opendc.simulator.compute.model.MemoryUnit import org.opendc.simulator.compute.model.ProcessingNode import org.opendc.simulator.compute.model.ProcessingUnit -import org.opendc.simulator.compute.power.LinearPowerModel -import org.opendc.simulator.compute.power.PowerModel -import org.opendc.simulator.compute.power.SimplePowerDriver +import org.opendc.simulator.compute.power.CpuPowerModel +import org.opendc.simulator.compute.power.CpuPowerModels import java.io.File import java.io.InputStream import java.util.Random @@ -48,7 +48,7 @@ private val reader = ClusterSpecReader() */ fun clusterTopology( file: File, - powerModel: PowerModel = LinearPowerModel(350.0, idlePower = 200.0), + powerModel: CpuPowerModel = CpuPowerModels.linear(350.0, 200.0), random: Random = Random(0) ): List { return clusterTopology(reader.read(file), powerModel, random) @@ -59,7 +59,7 @@ fun clusterTopology( */ fun clusterTopology( input: InputStream, - powerModel: PowerModel = LinearPowerModel(350.0, idlePower = 200.0), + powerModel: CpuPowerModel = CpuPowerModels.linear(350.0, 200.0), random: Random = Random(0) ): List { return clusterTopology(reader.read(input), powerModel, random) @@ -68,14 +68,14 @@ fun clusterTopology( /** * Construct a topology from the given list of [clusters]. */ -fun clusterTopology(clusters: List, powerModel: PowerModel, random: Random = Random(0)): List { +fun clusterTopology(clusters: List, powerModel: CpuPowerModel, random: Random = Random(0)): List { return clusters.flatMap { it.toHostSpecs(random, powerModel) } } /** * Helper method to convert a [ClusterSpec] into a list of [HostSpec]s. */ -private fun ClusterSpec.toHostSpecs(random: Random, powerModel: PowerModel): List { +private fun ClusterSpec.toHostSpecs(random: Random, powerModel: CpuPowerModel): List { val cpuSpeed = cpuSpeed val memoryPerHost = memCapacityPerHost.roundToLong() @@ -92,7 +92,7 @@ private fun ClusterSpec.toHostSpecs(random: Random, powerModel: PowerModel): Lis "node-$name-$it", mapOf("cluster" to id), machineModel, - SimplePowerDriver(powerModel) + SimPsuFactories.simple(powerModel) ) } } diff --git a/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt b/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt index 70363b6c..47058caa 100644 --- a/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt +++ b/opendc-experiments/opendc-experiments-capelin/src/test/kotlin/org/opendc/experiments/capelin/CapelinIntegrationTest.kt @@ -120,11 +120,11 @@ class CapelinIntegrationTest { { assertEquals(0, monitor.serversActive, "All VMs should finish after a run") }, { assertEquals(0, monitor.attemptsFailure, "No VM should be unscheduled") }, { assertEquals(0, monitor.serversPending, "No VM should not be in the queue") }, - { assertEquals(223393683, monitor.idleTime) { "Incorrect idle time" } }, - { assertEquals(66977508, monitor.activeTime) { "Incorrect active time" } }, - { assertEquals(3160381, monitor.stealTime) { "Incorrect steal time" } }, + { assertEquals(223394204, monitor.idleTime) { "Incorrect idle time" } }, + { assertEquals(66976984, monitor.activeTime) { "Incorrect active time" } }, + { assertEquals(3160316, monitor.stealTime) { "Incorrect steal time" } }, { assertEquals(0, monitor.lostTime) { "Incorrect lost time" } }, - { assertEquals(5.840939264814157E9, monitor.energyUsage, 0.01) { "Incorrect power draw" } } + { assertEquals(5.84093E9, monitor.energyUsage, 1E4) { "Incorrect power draw" } } ) } @@ -160,11 +160,11 @@ class CapelinIntegrationTest { // Note that these values have been verified beforehand assertAll( - { assertEquals(10999592, monitor.idleTime) { "Idle time incorrect" } }, - { assertEquals(9741207, monitor.activeTime) { "Active time incorrect" } }, + { assertEquals(10999504, monitor.idleTime) { "Idle time incorrect" } }, + { assertEquals(9741294, monitor.activeTime) { "Active time incorrect" } }, { assertEquals(0, monitor.stealTime) { "Steal time incorrect" } }, { assertEquals(0, monitor.lostTime) { "Lost time incorrect" } }, - { assertEquals(7.011676470304312E8, monitor.energyUsage, 0.01) { "Incorrect power draw" } } + { assertEquals(7.0116E8, monitor.energyUsage, 1E4) { "Incorrect power draw" } } ) } @@ -199,10 +199,10 @@ class CapelinIntegrationTest { // Note that these values have been verified beforehand assertAll( - { assertEquals(6028050, monitor.idleTime) { "Idle time incorrect" } }, - { assertEquals(14712749, monitor.activeTime) { "Active time incorrect" } }, - { assertEquals(12532907, monitor.stealTime) { "Steal time incorrect" } }, - { assertEquals(470593, monitor.lostTime) { "Lost time incorrect" } } + { assertEquals(6027979, monitor.idleTime) { "Idle time incorrect" } }, + { assertEquals(14712820, monitor.activeTime) { "Active time incorrect" } }, + { assertEquals(12532979, monitor.stealTime) { "Steal time incorrect" } }, + { assertEquals(445913, monitor.lostTime) { "Lost time incorrect" } } ) } @@ -229,8 +229,8 @@ class CapelinIntegrationTest { // Note that these values have been verified beforehand assertAll( - { assertEquals(10085158, monitor.idleTime) { "Idle time incorrect" } }, - { assertEquals(8539158, monitor.activeTime) { "Active time incorrect" } }, + { assertEquals(10085103, monitor.idleTime) { "Idle time incorrect" } }, + { assertEquals(8539212, monitor.activeTime) { "Active time incorrect" } }, { assertEquals(0, monitor.stealTime) { "Steal time incorrect" } }, { assertEquals(0, monitor.lostTime) { "Lost time incorrect" } }, { assertEquals(2328039558, monitor.uptime) { "Uptime incorrect" } } -- cgit v1.2.3