Changeset 865 for XIOS/trunk/src/server_distribution_description.cpp
- Timestamp:
- 06/09/16 11:33:08 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/server_distribution_description.cpp
r843 r865 97 97 Compute global index assigned to a server with a range.E.g: if a grid has 100 points and 98 98 there are 2 servers, the first one takes index from 0 to 49, the second has index from 50 to 99 99 100 99 \param [in] indexBeginEnd begining and ending index of range 100 \param [in] positionDimensionDistributed dimension of server on which we make the cut. 101 101 */ 102 102 void CServerDistributionDescription::computeServerGlobalIndexInRange(const std::pair<size_t, size_t>& indexBeginEnd, … … 161 161 } 162 162 } 163 163 } 164 165 /*! 166 Compute the global index of grid elements (domain, axis) and their associated server rank. 167 Each client knows the general distribution of servers and from which they can compute the pieces of information to hold 168 \param [out] indexServerOnElement global index of each element as well as the corresponding server which contains these indices 169 \param [in] clientRank rank of client 170 \param [in] clientSize number of client 171 \param [in] axisDomainOrder the order of element in grid (true for domain, false for axis) 172 \param [in] positionDimensionDistributed dimension of server on which we make the cut. 173 */ 174 void CServerDistributionDescription::computeServerGlobalByElement(std::vector<boost::unordered_map<size_t,std::vector<int> > >& indexServerOnElement, 175 int clientRank, 176 int clientSize, 177 const CArray<bool,1>& axisDomainOrder, 178 int positionDimensionDistributed) 179 { 180 switch (serverType_) { 181 case BAND_DISTRIBUTION: 182 computeBandDistribution(nServer_, positionDimensionDistributed); 183 break; 184 default: 185 break; 186 } 187 188 int nbElement = axisDomainOrder.numElements(); 189 indexServerOnElement.resize(nbElement); 190 int idx = 0; 191 std::vector<int> idxMap(nbElement); 192 for (int i = 0; i < nbElement; ++i) 193 { 194 idxMap[i] = idx; 195 if (true == axisDomainOrder(i)) idx += 2; 196 else ++idx; 197 } 198 199 for (int idxServer = 0; idxServer < nServer_; ++idxServer) 200 { 201 std::vector<int> elementDimension(4); 202 for (int i = 0; i < nbElement; ++i) 203 { 204 int elementSize = 1; 205 if (axisDomainOrder(i)) 206 { 207 elementSize *= dimensionSizes_[idxServer][idxMap[i]] * dimensionSizes_[idxServer][idxMap[i]+1]; 208 elementDimension[0] = indexBegin_[idxServer][idxMap[i]]; 209 elementDimension[1] = indexBegin_[idxServer][idxMap[i]+1]; 210 elementDimension[2] = dimensionSizes_[idxServer][idxMap[i]]; 211 elementDimension[3] = dimensionSizes_[idxServer][idxMap[i]+1]; 212 } 213 214 else 215 { 216 elementSize *= dimensionSizes_[idxServer][idxMap[i]]; 217 elementDimension[0] = indexBegin_[idxServer][idxMap[i]]; 218 elementDimension[1] = 0; 219 elementDimension[2] = dimensionSizes_[idxServer][idxMap[i]]; 220 elementDimension[3] = 1; 221 } 222 223 int rangeBegin, rangeSize; 224 computeRangeProcIndex(clientRank, clientSize, elementSize, rangeBegin, rangeSize); 225 226 size_t globalIndexElement; 227 idx = 0; int idxRange = 0; 228 for (int k = 0; k < elementDimension[3]; ++k) 229 for (int l = 0; l < elementDimension[2]; ++l) 230 { 231 globalIndexElement = (l+elementDimension[0]) + (k+elementDimension[1])*elementDimension[2]; 232 if ((rangeBegin <= idx) && (idxRange < rangeSize)) 233 { 234 indexServerOnElement[i][globalIndexElement].push_back(idxServer); 235 ++idxRange; 236 } 237 ++idx; 238 } 239 } 240 } 241 } 242 243 /*! 244 Compute a range of index on server which a client holds 245 For a range of index on a specific server, each client can hold a piece of the index range 246 If the range size is smaller than the number of client, there are some clients holding the same index 247 \param [in] clientRank rank of client 248 \param [in] clientSize number of client 249 \param [in] rangeProcSize index range size 250 \param [out] rangeBegin begin of range index a client holds 251 \param [out] rangeSize size of range index a client holds 252 */ 253 void CServerDistributionDescription::computeRangeProcIndex(int clientRank, 254 int clientSize, 255 int rangeProcSize, 256 int& rangeBegin, 257 int& rangeSize) 258 { 259 if (rangeProcSize < clientSize) 260 { 261 int rangeIndex = 0; 262 for (int idx = 0; idx < clientSize; ++idx) 263 { 264 if (idx == clientRank) 265 { 266 rangeBegin = rangeIndex; 267 rangeSize = 1; 268 } 269 ++rangeIndex; 270 if (rangeIndex == rangeProcSize) rangeIndex = 0; 271 } 272 return; 273 } 274 275 int range, indexBegin = 0; 276 for (int i = 0; i < clientSize; ++i) 277 { 278 range = rangeProcSize / clientSize; 279 if (i < (rangeProcSize%clientSize)) ++range; 280 if (i == clientRank) break; 281 indexBegin += range; 282 } 283 rangeBegin = indexBegin; 284 rangeSize = range; 164 285 } 165 286
Note: See TracChangeset
for help on using the changeset viewer.