From 7ffa97502d2725c1fe0a84677a654a5ea12cb454 Mon Sep 17 00:00:00 2001 From: Dante Niewenhuis Date: Mon, 22 Apr 2024 14:32:53 +0200 Subject: Updated the power models and added tests (#222) * Updated the power models and added tests * Updated test topologies --- .../simulator/compute/power/CpuPowerModels.java | 30 ++++++++++++++++------ 1 file changed, 22 insertions(+), 8 deletions(-) (limited to 'opendc-simulator/opendc-simulator-compute/src/main/java') 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 -- cgit v1.2.3