1 |
package appl.parallel.spmd; |
2 |
|
3 |
import java.awt.Rectangle; |
4 |
import java.rmi.RemoteException; |
5 |
import java.util.HashMap; |
6 |
import java.util.Vector; |
7 |
|
8 |
import org.apache.log4j.LogManager; |
9 |
import org.apache.log4j.Logger; |
10 |
|
11 |
import appl.parallel.ComputingResource; |
12 |
import appl.parallel.client.DataServer; |
13 |
import appl.parallel.data.WritableGridArrayPartition; |
14 |
import appl.parallel.model.AbstractParallelStepModel; |
15 |
import appl.parallel.server.PartitionDataManager; |
16 |
import appl.parallel.spmd.split.DataPartition; |
17 |
import appl.parallel.spmd.split.PartitionInfo; |
18 |
import appl.parallel.spmd.split.SplitMap; |
19 |
import appl.parallel.spmd.split.SplittableResource; |
20 |
|
21 |
/** |
22 |
* This class controls all the parallelization action on the server side and is |
23 |
* the counterpart to {@link SPMDClientController}. It is accessed by the model |
24 |
* developer by retrieving the {@link SPMDServerInterface} from a |
25 |
* {@link SPMDTask}. |
26 |
* |
27 |
* @author Dominik Appl |
28 |
*/ |
29 |
public class SPMDServerController implements SPMDServerInterface { |
30 |
|
31 |
private Logger LOG = LogManager.getLogger(this.getClass().getName()); |
32 |
|
33 |
PartitionDataManager dataManager; |
34 |
|
35 |
private Rectangle localCalculationBounds; |
36 |
|
37 |
private final SplitMap referenceSplitMap; |
38 |
|
39 |
/** |
40 |
* the partition position (used for splitmaps) |
41 |
*/ |
42 |
protected final int mapPosition; |
43 |
|
44 |
/** |
45 |
* Creates a new instance |
46 |
* @param dataManager the partition data server responsible for managing the data on the server |
47 |
* @param referenceResouceID the id of the reference resource |
48 |
*/ |
49 |
public SPMDServerController(PartitionDataManager dataManager, |
50 |
int referenceResouceID) { |
51 |
this.dataManager = dataManager; |
52 |
// if there are any partitions the referenceID should be != -1 |
53 |
if (referenceResouceID != -1) { |
54 |
referenceSplitMap = dataManager.getInfo(referenceResouceID) |
55 |
.getSplitMap(); |
56 |
mapPosition = dataManager.getInfo(referenceResouceID) |
57 |
.getSplitMapPos(); |
58 |
} else { |
59 |
referenceSplitMap = null; |
60 |
mapPosition = 0; |
61 |
} |
62 |
//setting the calculation bounds to the default area |
63 |
localCalculationBounds=referenceSplitMap.getLocalCalculationBounds(mapPosition); |
64 |
} |
65 |
|
66 |
/** |
67 |
* This method sets new calculation bounds. This is used to divide the rasters for |
68 |
* parallel computation on one machine (using multiple cpu's or cpu cores) |
69 |
* |
70 |
* @param newBounds the new calculation bounds |
71 |
*/ |
72 |
public void setLocalCalculationBounds(Rectangle newBounds){ |
73 |
localCalculationBounds = newBounds; |
74 |
} |
75 |
|
76 |
/* (non-Javadoc) |
77 |
* @see appl.parallel.spmd.SPMDServerInterface#getBaseParameter(java.lang.String) |
78 |
*/ |
79 |
public Object getBaseParameter(String parameterName) { |
80 |
Object returnValue = dataManager.getBaseParameter(parameterName); |
81 |
if(returnValue==null) |
82 |
LOG.warn("No value for parameter '" + parameterName + "' found or value was null" ); |
83 |
return returnValue; |
84 |
} |
85 |
|
86 |
|
87 |
|
88 |
|
89 |
/* (non-Javadoc) |
90 |
* @see appl.parallel.spmd.SPMDServerInterface#getLocalCalculationBounds(appl.parallel.spmd.split.DataPartition) |
91 |
*/ |
92 |
public Rectangle getLocalCalculationBounds(DataPartition partition) { |
93 |
return dataManager.getInfo(partition.getRootID()).getSplitMap() |
94 |
.getLocalCalculationBounds(mapPosition); |
95 |
} |
96 |
|
97 |
/* (non-Javadoc) |
98 |
* @see appl.parallel.spmd.SPMDServerInterface#getLocalBounds(appl.parallel.spmd.split.DataPartition) |
99 |
*/ |
100 |
public Rectangle getLocalBounds(DataPartition partition) { |
101 |
PartitionInfo info = dataManager.getInfo(partition.getRootID()); |
102 |
return info.getSplitMap().getLocalBounds(mapPosition); |
103 |
} |
104 |
|
105 |
/* (non-Javadoc) |
106 |
* @see appl.parallel.spmd.SPMDServerInterface#getGlobalBounds(appl.parallel.spmd.split.DataPartition) |
107 |
*/ |
108 |
public Rectangle getGlobalBounds(DataPartition partition) { |
109 |
PartitionInfo info = dataManager.getInfo(partition.getRootID()); |
110 |
return info.getSplitMap().getGlobalBounds(); |
111 |
} |
112 |
|
113 |
/* (non-Javadoc) |
114 |
* @see appl.parallel.spmd.SPMDServerInterface#getLocalCalculationBounds() |
115 |
*/ |
116 |
public Rectangle getLocalCalculationBounds() { |
117 |
return localCalculationBounds; |
118 |
} |
119 |
|
120 |
/* (non-Javadoc) |
121 |
* @see appl.parallel.spmd.SPMDServerInterface#getLocalBounds() |
122 |
*/ |
123 |
public Rectangle getLocalBounds() { |
124 |
return referenceSplitMap.getLocalBounds(mapPosition); |
125 |
} |
126 |
|
127 |
/* (non-Javadoc) |
128 |
* @see appl.parallel.spmd.SPMDServerInterface#getPartition(java.lang.String) |
129 |
*/ |
130 |
public DataPartition getPartition(String name) { |
131 |
DataPartition partition = dataManager.getData(name); |
132 |
if (partition == null) |
133 |
LOG.error("ERROR: The Partition with the name '" + name |
134 |
+ "' was not found or was null"); |
135 |
return partition; |
136 |
} |
137 |
|
138 |
/* (non-Javadoc) |
139 |
* @see appl.parallel.spmd.SPMDServerInterface#getMultiPartition(java.lang.String) |
140 |
*/ |
141 |
public DataPartition[] getMultiPartition(String name) { |
142 |
DataPartition[] partitions = dataManager.getMultiData(name); |
143 |
if (partitions == null) |
144 |
LOG.error("ERROR: The Partition with the name '" + name |
145 |
+ "' was not found or was null"); |
146 |
// if(partitions.length>0) |
147 |
// if(partitions[0] instanceof WritableGridArrayPartition.Float){ |
148 |
// WritableGridArrayPartition[] wgPartitions = new WritableGridArrayPartition[partitions.length]; |
149 |
// System.arraycopy(partitions, 0, wgPartitions, 0, partitions.length); |
150 |
// return (DataPartition[]) wgPartitions; |
151 |
// } |
152 |
return partitions; |
153 |
} |
154 |
|
155 |
/* (non-Javadoc) |
156 |
* @see appl.parallel.spmd.SPMDServerInterface#getMultiData(java.lang.String) |
157 |
*/ |
158 |
public MultiDataObject getMultiData(String name){ |
159 |
MultiDataObject multiDataObject=null; |
160 |
try { |
161 |
multiDataObject = dataManager.getMultiDataObject(name); |
162 |
if(multiDataObject==null) |
163 |
LOG.warn("No Multidataobject with name '" + name + "' found. Returning null!"); |
164 |
} catch (RemoteException e) { |
165 |
// Should never be be called (local call) |
166 |
e.printStackTrace(); |
167 |
} |
168 |
return multiDataObject; |
169 |
} |
170 |
|
171 |
/* (non-Javadoc) |
172 |
* @see appl.parallel.spmd.SPMDServerInterface#getMultiPartition(java.lang.String, int) |
173 |
*/ |
174 |
public DataPartition getMultiPartition(String name, int idx) { |
175 |
DataPartition partition = dataManager.getMultiData(name,idx); |
176 |
if (partition == null) |
177 |
LOG.error("ERROR: The Partition with the name '" + name |
178 |
+ "' was not found or was null"); |
179 |
return partition; |
180 |
} |
181 |
|
182 |
/* (non-Javadoc) |
183 |
* @see appl.parallel.spmd.SPMDServerInterface#getLocalCalcMinX() |
184 |
*/ |
185 |
public int getLocalCalcMinX() { |
186 |
return (int) getLocalCalculationBounds().getX(); |
187 |
} |
188 |
|
189 |
/* (non-Javadoc) |
190 |
* @see appl.parallel.spmd.SPMDServerInterface#getLocalCalcMinY() |
191 |
*/ |
192 |
public int getLocalCalcMinY() { |
193 |
return (int) getLocalCalculationBounds().getY(); |
194 |
} |
195 |
|
196 |
/* (non-Javadoc) |
197 |
* @see appl.parallel.spmd.SPMDServerInterface#getLocalCalcMaxX() |
198 |
*/ |
199 |
public int getLocalCalcMaxX() { |
200 |
return (int) (getLocalCalculationBounds().getX() |
201 |
+ getLocalCalculationBounds().getWidth() - 1); |
202 |
} |
203 |
|
204 |
/* (non-Javadoc) |
205 |
* @see appl.parallel.spmd.SPMDServerInterface#getLocalCalcMaxY() |
206 |
*/ |
207 |
public int getLocalCalcMaxY() { |
208 |
return (int) (getLocalCalculationBounds().getY() |
209 |
+ getLocalCalculationBounds().getHeight() - 1); |
210 |
} |
211 |
|
212 |
/* (non-Javadoc) |
213 |
* @see appl.parallel.spmd.SPMDServerInterface#destroyData(java.lang.Object) |
214 |
*/ |
215 |
public void destroyPartition(String name) { |
216 |
dataManager.removeData(name); |
217 |
} |
218 |
|
219 |
public void destroyMultiPartition(String name,int idx) |
220 |
{ |
221 |
MultiDataObject multiData = this.getMultiData(name); |
222 |
multiData.deleteElement(idx); |
223 |
} |
224 |
|
225 |
} |