diff options
| author | Dante Niewenhuis <d.niewenhuis@hotmail.com> | 2024-04-22 14:32:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-22 14:32:53 +0200 |
| commit | 7ffa97502d2725c1fe0a84677a654a5ea12cb454 (patch) | |
| tree | 7f08b88a8e5bd1d39585b9cfcb530bd43f1a4733 /opendc-simulator | |
| parent | d4c1d8468a17eb7adf8bf20949c2fdc4b2f93fec (diff) | |
Updated the power models and added tests (#222)
* Updated the power models and added tests
* Updated test topologies
Diffstat (limited to 'opendc-simulator')
2 files changed, 106 insertions, 8 deletions
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/java/org/opendc/simulator/compute/power/CpuPowerModels.java b/opendc-simulator/opendc-simulator-compute/src/main/java/org/opendc/simulator/compute/power/CpuPowerModels.java index 7ba9eaed..537fb8d8 100644 --- a/opendc-simulator/opendc-simulator-compute/src/main/java/org/opendc/simulator/compute/power/CpuPowerModels.java +++ b/opendc-simulator/opendc-simulator-compute/src/main/java/org/opendc/simulator/compute/power/CpuPowerModels.java @@ -163,6 +163,12 @@ public class CpuPowerModels { this.idlePower = idlePower; } + // Clamps the provided utilization in the range of 0.0 and 1.0 + // This is done to avoid floating point errors + public double clampUtilization(double utilization) { + return Math.max(0.0, Math.min(1.0, utilization)); + } + @Override public String toString() { return getClass().getSimpleName() + "[max=" + maxPower + ",idle=" + idlePower + "]"; @@ -174,12 +180,14 @@ public class CpuPowerModels { SqrtPowerModel(double maxPower, double idlePower) { super(maxPower, idlePower); - this.factor = (maxPower - idlePower) / Math.sqrt(100); + this.factor = (maxPower - idlePower); } @Override public double computePower(double utilization) { - return idlePower + factor * Math.sqrt(utilization * 100); + utilization = clampUtilization(utilization); + + return idlePower + factor * Math.sqrt(utilization); } @Override @@ -198,12 +206,14 @@ public class CpuPowerModels { LinearPowerModel(double maxPower, double idlePower) { super(maxPower, idlePower); - this.factor = (maxPower - idlePower) / 100; + this.factor = maxPower - idlePower; } @Override public double computePower(double utilization) { - return idlePower + factor * utilization * 100; + utilization = clampUtilization(utilization); + + return idlePower + factor * utilization; } @Override @@ -222,12 +232,14 @@ public class CpuPowerModels { SquarePowerModel(double maxPower, double idlePower) { super(maxPower, idlePower); - this.factor = (maxPower - idlePower) / Math.pow(100, 2); + this.factor = (maxPower - idlePower); } @Override public double computePower(double utilization) { - return idlePower + factor * Math.pow(utilization * 100, 2); + utilization = clampUtilization(utilization); + + return idlePower + factor * Math.pow(utilization, 2); } @Override @@ -246,12 +258,14 @@ public class CpuPowerModels { CubicPowerModel(double maxPower, double idlePower) { super(maxPower, idlePower); - this.factor = (maxPower - idlePower) / Math.pow(100, 3); + this.factor = (maxPower - idlePower); } @Override public double computePower(double utilization) { - return idlePower + factor * Math.pow(utilization * 100, 3); + utilization = clampUtilization(utilization); + + return idlePower + factor * Math.pow(utilization, 3); } @Override diff --git a/opendc-simulator/opendc-simulator-compute/src/test/kotlin/org/opendc/simulator/compute/power/PowerModelTest.kt b/opendc-simulator/opendc-simulator-compute/src/test/kotlin/org/opendc/simulator/compute/power/PowerModelTest.kt index e85758ae..e3bea821 100644 --- a/opendc-simulator/opendc-simulator-compute/src/test/kotlin/org/opendc/simulator/compute/power/PowerModelTest.kt +++ b/opendc-simulator/opendc-simulator-compute/src/test/kotlin/org/opendc/simulator/compute/power/PowerModelTest.kt @@ -78,6 +78,90 @@ internal class PowerModelTest { ) } + @Test + fun `test linear model`() { + val powerModel = CpuPowerModels.linear(400.0, 200.0) + + assertAll( + { assertEquals(200.0, powerModel.computePower(-0.1)) }, + { assertEquals(200.0, powerModel.computePower(0.0)) }, + { assertEquals(220.0, powerModel.computePower(0.1)) }, + { assertEquals(240.0, powerModel.computePower(0.2)) }, + { assertEquals(260.0, powerModel.computePower(0.3)) }, + { assertEquals(280.0, powerModel.computePower(0.4)) }, + { assertEquals(300.0, powerModel.computePower(0.5)) }, + { assertEquals(320.0, powerModel.computePower(0.6)) }, + { assertEquals(340.0, powerModel.computePower(0.7)) }, + { assertEquals(360.0, powerModel.computePower(0.8)) }, + { assertEquals(380.0, powerModel.computePower(0.9)) }, + { assertEquals(400.0, powerModel.computePower(1.0)) }, + { assertEquals(400.0, powerModel.computePower(1.1)) }, + ) + } + + @Test + fun `test sqrt model`() { + val powerModel = CpuPowerModels.sqrt(400.0, 200.0) + + assertAll( + { assertEquals(200.0, powerModel.computePower(-1.0), 1.0) }, + { assertEquals(200.0, powerModel.computePower(0.0), 1.0) }, + { assertEquals(263.0, powerModel.computePower(0.1), 1.0) }, + { assertEquals(289.0, powerModel.computePower(0.2), 1.0) }, + { assertEquals(309.0, powerModel.computePower(0.3), 1.0) }, + { assertEquals(326.0, powerModel.computePower(0.4), 1.0) }, + { assertEquals(341.0, powerModel.computePower(0.5), 1.0) }, + { assertEquals(354.0, powerModel.computePower(0.6), 1.0) }, + { assertEquals(367.0, powerModel.computePower(0.7), 1.0) }, + { assertEquals(378.0, powerModel.computePower(0.8), 1.0) }, + { assertEquals(389.0, powerModel.computePower(0.9), 1.0) }, + { assertEquals(400.0, powerModel.computePower(1.0), 1.0) }, + { assertEquals(400.0, powerModel.computePower(1.1), 1.0) }, + ) + } + + @Test + fun `test square model`() { + val powerModel = CpuPowerModels.square(400.0, 200.0) + + assertAll( + { assertEquals(200.0, powerModel.computePower(-1.0), 1.0) }, + { assertEquals(200.0, powerModel.computePower(0.0), 1.0) }, + { assertEquals(202.0, powerModel.computePower(0.1), 1.0) }, + { assertEquals(208.0, powerModel.computePower(0.2), 1.0) }, + { assertEquals(218.0, powerModel.computePower(0.3), 1.0) }, + { assertEquals(232.0, powerModel.computePower(0.4), 1.0) }, + { assertEquals(250.0, powerModel.computePower(0.5), 1.0) }, + { assertEquals(272.0, powerModel.computePower(0.6), 1.0) }, + { assertEquals(298.0, powerModel.computePower(0.7), 1.0) }, + { assertEquals(328.0, powerModel.computePower(0.8), 1.0) }, + { assertEquals(362.0, powerModel.computePower(0.9), 1.0) }, + { assertEquals(400.0, powerModel.computePower(1.0), 1.0) }, + { assertEquals(400.0, powerModel.computePower(1.1), 1.0) }, + ) + } + + @Test + fun `test cubic model`() { + val powerModel = CpuPowerModels.cubic(400.0, 200.0) + + assertAll( + { assertEquals(200.0, powerModel.computePower(-1.0), 1.0) }, + { assertEquals(200.0, powerModel.computePower(0.0), 1.0) }, + { assertEquals(200.0, powerModel.computePower(0.1), 1.0) }, + { assertEquals(201.0, powerModel.computePower(0.2), 1.0) }, + { assertEquals(205.0, powerModel.computePower(0.3), 1.0) }, + { assertEquals(212.0, powerModel.computePower(0.4), 1.0) }, + { assertEquals(225.0, powerModel.computePower(0.5), 1.0) }, + { assertEquals(243.0, powerModel.computePower(0.6), 1.0) }, + { assertEquals(268.0, powerModel.computePower(0.7), 1.0) }, + { assertEquals(302.0, powerModel.computePower(0.8), 1.0) }, + { assertEquals(345.0, powerModel.computePower(0.9), 1.0) }, + { assertEquals(400.0, powerModel.computePower(1.0), 1.0) }, + { assertEquals(400.0, powerModel.computePower(1.1), 1.0) }, + ) + } + @Suppress("unused") private companion object { @JvmStatic |
