1 | package test.rewolucja.energy.profile; |
---|
2 | |
---|
3 | import gridsim.GridSimTags; |
---|
4 | import gridsim.gssim.GssimTags; |
---|
5 | |
---|
6 | import java.util.Arrays; |
---|
7 | import java.util.Collections; |
---|
8 | import java.util.HashMap; |
---|
9 | import java.util.List; |
---|
10 | import java.util.Map; |
---|
11 | |
---|
12 | import schedframe.resources.PowerState; |
---|
13 | import schedframe.resources.units.CpuSpeed; |
---|
14 | import schedframe.scheduling.utils.ResourceParameterName; |
---|
15 | import test.rewolucja.energy.EnergyEvent; |
---|
16 | import test.rewolucja.energy.EnergyEventType; |
---|
17 | import test.rewolucja.energy.extension.EnergyExtension; |
---|
18 | import test.rewolucja.extensions.ExtensionType; |
---|
19 | import test.rewolucja.resources.ResourceStatus; |
---|
20 | import test.rewolucja.resources.physical.implementation.CPU; |
---|
21 | |
---|
22 | public class CPUPowerProfile extends AbstractPowerProfile{ |
---|
23 | |
---|
24 | protected CPU cpu; |
---|
25 | protected PState pState; |
---|
26 | |
---|
27 | public CPUPowerProfile(){ |
---|
28 | powerState = PowerState.ON; |
---|
29 | pState = getSupportedPStates().get(PStateType.P0); |
---|
30 | } |
---|
31 | |
---|
32 | public void visit(CPU p){ |
---|
33 | cpu = p; |
---|
34 | energyExtension = (EnergyExtension) cpu.getExtensionList().getExtension(ExtensionType.ENERGY_EXTENSION); |
---|
35 | } |
---|
36 | |
---|
37 | public boolean setPowerState(PowerState state){ |
---|
38 | if(!supportPowerState(state)) |
---|
39 | return false; |
---|
40 | powerState = state; |
---|
41 | |
---|
42 | if(state == PowerState.OFF){ |
---|
43 | cpu.setStatus(ResourceStatus.NOTAVAILABLE); |
---|
44 | } |
---|
45 | else if(state == PowerState.ON){ |
---|
46 | cpu.setStatus(ResourceStatus.FREE); |
---|
47 | } |
---|
48 | |
---|
49 | cpu.handleEvent(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, cpu.getName())); |
---|
50 | return true; |
---|
51 | } |
---|
52 | |
---|
53 | |
---|
54 | public double getPowerConsumption(PowerState state) { |
---|
55 | if(powerState == PowerState.OFF) |
---|
56 | return 0; |
---|
57 | else if(powerState == PowerState.ON){ |
---|
58 | if(cpu.getStatus() == ResourceStatus.BUSY) |
---|
59 | return getPState().getPower(); |
---|
60 | else if(cpu.getStatus() == ResourceStatus.FREE) |
---|
61 | return getPState().getPower()/1.25; |
---|
62 | } |
---|
63 | return 1; |
---|
64 | } |
---|
65 | |
---|
66 | |
---|
67 | public boolean supportPowerState(PowerState state) { |
---|
68 | switch(state){ |
---|
69 | case ON: |
---|
70 | return true; |
---|
71 | case OFF: |
---|
72 | return true; |
---|
73 | default: return false; |
---|
74 | } |
---|
75 | } |
---|
76 | |
---|
77 | public List<PowerState> getSupportedPowerStates() { |
---|
78 | return Arrays.asList(new PowerState[]{PowerState.ON, PowerState.OFF}); |
---|
79 | } |
---|
80 | |
---|
81 | |
---|
82 | public double getFrequency() { |
---|
83 | return pState.getFrequency(); |
---|
84 | } |
---|
85 | |
---|
86 | public boolean setFrequency(double freq) { |
---|
87 | for(PStateType pStateType: getSupportedPStates().keySet()){ |
---|
88 | if(getSupportedPStates().get(pStateType).getFrequency() == freq){ |
---|
89 | setPState(pStateType); |
---|
90 | return true; |
---|
91 | } |
---|
92 | } |
---|
93 | return false; |
---|
94 | } |
---|
95 | |
---|
96 | public PState getPState(){ |
---|
97 | return pState; |
---|
98 | } |
---|
99 | |
---|
100 | public boolean setPState(PStateType pStateType){ |
---|
101 | PState newPState = getSupportedPStates().get(pStateType); |
---|
102 | if(newPState != null) |
---|
103 | { |
---|
104 | double factor = pState.getFrequency()/newPState.getFrequency(); |
---|
105 | pState = newPState; |
---|
106 | CpuSpeed speed = (CpuSpeed )cpu.getResourceCharacteristic().getResourceUnits().get(ResourceParameterName.CPUSPEED).get(0); |
---|
107 | //speed.setAmount((int)pState.getFrequency()); |
---|
108 | |
---|
109 | cpu.handleEvent(new EnergyEvent(EnergyEventType.FREQUENCY_CHANGED, cpu.getName())); |
---|
110 | cpu.getLogicalResource().sendInternal(GridSimTags.SCHEDULE_NOW, GssimTags.UPDATE, cpu.getName()); |
---|
111 | return true; |
---|
112 | } |
---|
113 | return false; |
---|
114 | } |
---|
115 | |
---|
116 | public Map<PStateType, PState> getSupportedPStates(){ |
---|
117 | return DefaultModel.getConfiguration(); |
---|
118 | } |
---|
119 | |
---|
120 | private static class DefaultModel{ |
---|
121 | private static Map<PStateType, PState> pStates; |
---|
122 | static { |
---|
123 | Map<PStateType, PState> pStatesMap = new HashMap<PStateType, PState>(); |
---|
124 | pStatesMap.put(PStateType.P0, new PState(PStateType.P0, 3000, 0, 350)); |
---|
125 | pStatesMap.put(PStateType.P1, new PState(PStateType.P1, 2660, 0, 343)); |
---|
126 | pStatesMap.put(PStateType.P2, new PState(PStateType.P2, 2330, 0, 337)); |
---|
127 | pStatesMap.put(PStateType.P3, new PState(PStateType.P3, 2000, 0, 330)); |
---|
128 | pStates = Collections.unmodifiableMap(pStatesMap); |
---|
129 | } |
---|
130 | |
---|
131 | public static Map<PStateType, PState> getConfiguration(){ |
---|
132 | return pStates; |
---|
133 | } |
---|
134 | } |
---|
135 | } |
---|
136 | |
---|