package test.thermal.recs.plugins.energy; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; import schedframe.resources.computing.Node; import schedframe.resources.computing.Core; import schedframe.resources.computing.Processor; import schedframe.resources.computing.profiles.energy.ResourceEvent; import schedframe.resources.devices.PhysicalResource; import schedframe.resources.units.PEUnit; import schedframe.resources.units.ProcessingElements; import schedframe.resources.units.ResourceUnit; import schedframe.resources.units.ResourceUnitName; import schedframe.resources.units.StandardResourceUnitName; import schedframe.scheduling.manager.tasks.JobRegistry; import test.thermal.recs.utils.AppType; import test.thermal.recs.utils.TaskToApp; import dcworms.schedframe.scheduling.ExecTask; import dcworms.schedframe.scheduling.Executable; public class RecsNodeModelEEP extends RecsNodeBaseEEP{ private static String POWER_DATA_FILE_NAME = "src/test/thermal/recs/data/power_data.properties"; private static String LOAD_DATA_FILE_NAME = "src/test/thermal/recs/data/load.properties"; private ResourceBundle loadBundle; private ResourceBundle powBundle; private TaskToApp taskToApp = new TaskToApp(); static int HIT = 0; static int MISSED = 0; public double estimatePowerConsumption(ResourceEvent event, JobRegistry jobRegistry, PhysicalResource resource) { double powerConsumption = 0; Node node = (Node) resource; try { if(jobRegistry.getRunningTasks().size() > 0) { powerConsumption = powerConsumption + getMeasuredPower(createQuery(jobRegistry.getRunningTasks().get(0))); } else { for(Processor cpu: node.getProcessors()){ try{ //powerConsumption = powerConsumption + cpu.getPowerInterface().getRecentPowerUsage().getValue(); } catch (Exception e){ } } try { powerConsumption = powerConsumption + node.getPowerInterface().getPowerConsumption(node.getPowerInterface().getPowerState()); } catch (NoSuchFieldException e) { } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return powerConsumption; } private String getApplicationType(ExecTask task){ AppType appType = taskToApp.getAppType(task); return appType.toString(); } protected String createQuery(ExecTask task) { Executable exec = (Executable)task; Map allocatedResources = exec.getAllocatedResources().getLast().getResourceUnits(); PEUnit peUnit = (PEUnit) allocatedResources.get(StandardResourceUnitName.PE); String query = getApplicationType(task) + "." + getNodeCategory(peUnit) + "." + getFrequency(peUnit) + "." + getCoreCnt(task); return query; } private String getNodeCategory(PEUnit peUnit){ ProcessingElements pe = (ProcessingElements) peUnit; if(pe.get(0) instanceof Node) return ((Node)pe.get(0)).getCategory(); if(pe.get(0) instanceof Processor) return ((Processor)pe.get(0)).getParent().getCategory(); Core core = (Core)pe.get(0); return core.getParent().getParent().getCategory(); } private int getFrequency(PEUnit peUnit){ ProcessingElements pe = (ProcessingElements) peUnit; if(pe.get(0) instanceof Node) return Double.valueOf(((Node)pe.get(0)).getProcessors().get(0).getPowerInterface().getFrequency()).intValue(); if(pe.get(0) instanceof Processor) return Double.valueOf(((Processor)pe.get(0)).getPowerInterface().getFrequency()).intValue(); Core core = (Core)pe.get(0); Processor proc = (Processor) core.getParent(); double freq = proc.getPowerInterface().getFrequency(); return Double.valueOf(freq).intValue(); } private int getCoreCnt(ExecTask task){ double cpuReq; try { cpuReq = task.getCpuCntRequest(); } catch (NoSuchFieldException e) { cpuReq = 1; } return Double.valueOf(cpuReq).intValue(); } private double getAppLoad(ExecTask task){ double appLoad = taskToApp.getAppLoad(task); return appLoad; } protected double getMeasuredPowerOld(String query) throws FileNotFoundException, IOException{ HashMap> knownCoreCntMap = new HashMap>(); Integer [] knownCoreCntI = {1, 3, 5, 7}; List knonwCoreCntListI = Arrays.asList(knownCoreCntI); knownCoreCntMap.put("Intel_i7", knonwCoreCntListI); Integer [] knownCoreCntA = {1, 3}; List knonwCoreCntListA = Arrays.asList(knownCoreCntA); knownCoreCntMap.put("Atom_D510", knonwCoreCntListA); Integer [] knownCoreCntAF = {1}; List knonwCoreCntListAF = Arrays.asList(knownCoreCntAF); knownCoreCntMap.put("AMD_Fusion", knonwCoreCntListAF); ResourceBundle powBundle = getPowBundle(); double measuredPower = 0; int coreCnt = Double.valueOf(query.split("\\.")[3]).intValue(); List knonwCoreCntList = knownCoreCntMap.get(query.split("\\.")[1]); if(!knonwCoreCntList.contains(coreCnt)){ double coreBelow = 0; double coreAbove = 0; for(int i = 0; i < knonwCoreCntList.size(); i++){ if(coreCnt > knonwCoreCntList.get(i)){ coreBelow = knonwCoreCntList.get(i); coreAbove = knonwCoreCntList.get(i+1); } } String queryBelow = query.split("\\.")[0] + "." + query.split("\\.")[1] + "." + query.split("\\.")[2] + "." + Double.valueOf(coreBelow).intValue(); String queryAbove = query.split("\\.")[0] + "." + query.split("\\.")[1] + "." + query.split("\\.")[2] + "." + Double.valueOf(coreAbove).intValue(); System.out.println(queryBelow); System.out.println(queryAbove); double measuredBelow = Double.valueOf(powBundle.getString(queryBelow)).doubleValue(); double measuredAbove = Double.valueOf(powBundle.getString(queryAbove)).doubleValue(); double a = (measuredAbove - measuredBelow)/(coreAbove/8 - coreBelow/8); double b = measuredAbove - a * coreAbove/8; measuredPower = a * coreCnt/8 + b; MISSED++; System.out.println("m:" + MISSED); } else { HIT++; System.out.println("h:" + HIT); measuredPower = Double.valueOf(powBundle.getString(query)).doubleValue(); } return measuredPower; } protected double getMeasuredPower(String query) throws FileNotFoundException, IOException{ HashMap> knownCoreCntMap = new HashMap>(); Integer [] knownCoreCntI = {1, 8}; List knonwCoreCntListI = Arrays.asList(knownCoreCntI); knownCoreCntMap.put("Intel_i7", knonwCoreCntListI); Integer [] knownCoreCntA = {1, 4}; List knonwCoreCntListA = Arrays.asList(knownCoreCntA); knownCoreCntMap.put("Atom_D510", knonwCoreCntListA); Integer [] knownCoreCntAF = {1, 2}; List knonwCoreCntListAF = Arrays.asList(knownCoreCntAF); knownCoreCntMap.put("AMD_Fusion", knonwCoreCntListAF); ResourceBundle powBundle = getPowBundle(); double measuredPower = 0; int coreCnt = Double.valueOf(query.split("\\.")[3]).intValue(); List knonwCoreCntList = knownCoreCntMap.get(query.split("\\.")[1]); if(!knonwCoreCntList.contains(coreCnt)){ //double queryLoad = (double) coreCnt / 8; double queryLoad = getLoad(query); double loadBelow = 0; double loadAbove = 0; if(query.split("\\.")[1].equals("Intel_i7")){ loadBelow = 1; loadAbove = 8; } else if(query.split("\\.")[1].equals("Atom_D510")){ loadBelow = 1; loadAbove = 4; } else if(query.split("\\.")[1].equals("AMD_Fusion")){ loadBelow = 1; loadAbove = 2; } String queryBelow = query.split("\\.")[0] + "." + query.split("\\.")[1] + "." + query.split("\\.")[2] + "." + 1; String queryAbove = null; if(query.split("\\.")[1].equals("Intel_i7")) queryAbove = query.split("\\.")[0] + "." + query.split("\\.")[1] + "." + query.split("\\.")[2] + "." + 8; else if(query.split("\\.")[1].equals("Atom_D510")) queryAbove = query.split("\\.")[0] + "." + query.split("\\.")[1] + "." + query.split("\\.")[2] + "." + 4; else if(query.split("\\.")[1].equals("AMD_Fusion")) queryAbove = query.split("\\.")[0] + "." + query.split("\\.")[1] + "." + query.split("\\.")[2] + "." + 2; System.out.println(queryBelow); System.out.println(queryAbove); loadAbove = getLoad(queryAbove); loadBelow = getLoad(queryBelow); double measuredBelow = Double.valueOf(powBundle.getString(queryBelow)).doubleValue(); double measuredAbove = Double.valueOf(powBundle.getString(queryAbove)).doubleValue(); double a = (measuredAbove - measuredBelow)/(loadAbove - loadBelow); double b = measuredAbove - a * loadAbove; measuredPower = a * queryLoad + b; MISSED++; System.out.println("m:" + MISSED); } else { HIT++; System.out.println("h:" + HIT); measuredPower = Double.valueOf(powBundle.getString(query)).doubleValue(); } return measuredPower; } private ResourceBundle getPowBundle() throws FileNotFoundException, IOException{ if(powBundle == null){ powBundle = new PropertyResourceBundle(new FileInputStream(POWER_DATA_FILE_NAME)); } return powBundle; } protected double getLoad(String query) throws FileNotFoundException, IOException{ ResourceBundle loadBundle = getLoadBundle(); return Double.valueOf(loadBundle.getString(query)).doubleValue(); } private ResourceBundle getLoadBundle() throws FileNotFoundException, IOException{ if(loadBundle == null){ loadBundle = new PropertyResourceBundle(new FileInputStream(LOAD_DATA_FILE_NAME)); } return loadBundle; } }