23 : nGlobal_(globalDimensionSize), indexBegin_(), dimensionSizes_(), globalIndex_(),
24 vecGlobalIndex_(), serverType_(serType), nServer_(nServer), positionDimensionDistributed_(1)
37 return ((1 == gridDimension) ? 0 : 1);
50 int positionDimensionDistributed)
60 if (doComputeGlobalIndex)
64 std::vector<int> currentIndex(dim);
66 for (
int idxServer = 0; idxServer <
nServer_; ++idxServer)
68 size_t ssize = 1, idx = 0;
72 std::vector<int> idxLoop(dim,0);
78 for (
int idxDim = 0; idxDim < dim-1; ++idxDim)
87 for (
int idxDim = 1; idxDim < dim; ++idxDim) currentIndex[idxDim] = idxLoop[idxDim] +
indexBegin_[idxServer][idxDim];
89 size_t mulDim, globalIndex;
90 for (
int j = 0; j < innerLoopSize; ++j)
95 for (
int k = 1; k < dim; ++k)
98 globalIndex += currentIndex[k] * mulDim;
103 idxLoop[0] += innerLoopSize;
116 int positionDimensionDistributed)
130 size_t indexBegin = indexBeginEnd.first;
131 size_t indexEnd = indexBeginEnd.second;
132 if (indexBegin > indexEnd)
133 ERROR(
"CServerDistributionDescription::computeServerGlobalIndexInRange",
134 <<
"Index begin is larger than index end");
139 std::vector<int> currentIndex(dim);
141 for (
int idxServer = 0; idxServer < nBand; ++idxServer)
143 size_t ssize = 1, idx = 0;
146 std::vector<int> idxLoop(dim,0);
151 for (
int idxDim = 0; idxDim < dim-1; ++idxDim)
160 for (
int idxDim = 1; idxDim < dim; ++idxDim) currentIndex[idxDim] = idxLoop[idxDim] +
indexBegin_[idxServer][idxDim];
162 size_t mulDim, globalIndex;
163 for (
int j = 0; j < innerLoopSize; ++j)
168 for (
int k = 1; k < dim; ++k)
171 globalIndex += (currentIndex[k])*mulDim;
173 if ((indexBegin <= globalIndex) && (globalIndex <= indexEnd))
177 idxLoop[0] += innerLoopSize;
182 std::vector<int> zeroIndexServer(
nServer_-nBand);
183 for (
int idxServer = nBand; idxServer <
nServer_; ++idxServer)
184 zeroIndexServer[idxServer-nBand] = idxServer;
186 return zeroIndexServer;
202 int positionDimensionDistributed)
213 int nbElement = axisDomainOrder.numElements();
214 indexServerOnElement.
resize(nbElement);
216 std::vector<int> idxMap(nbElement);
217 for (
int i = 0; i < nbElement; ++i)
220 if (2 == axisDomainOrder(i)) idx += 2;
221 else if (1 == axisDomainOrder(i)) idx += 1;
225 for (
int idxServer = 0; idxServer < nBand; ++idxServer)
227 std::vector<int> elementDimension(4);
228 for (
int i = 0; i < nbElement; ++i)
231 if (2 == axisDomainOrder(i))
234 elementDimension[0] =
indexBegin_[idxServer][idxMap[i]];
235 elementDimension[1] =
indexBegin_[idxServer][idxMap[i]+1];
240 else if (1 == axisDomainOrder(i))
243 elementDimension[0] =
indexBegin_[idxServer][idxMap[i]];
244 elementDimension[1] = 0;
246 elementDimension[3] = 1;
251 elementDimension[0] = 0;
252 elementDimension[1] = 0;
253 elementDimension[2] = 1;
254 elementDimension[3] = 1;
257 int rangeBegin, rangeSize;
260 size_t globalIndexElement;
261 idx = 0;
int idxRange = 0;
262 for (
int k = 0; k < elementDimension[3]; ++k)
263 for (
int l = 0; l < elementDimension[2]; ++l)
265 globalIndexElement = (l+elementDimension[0]) + (k+elementDimension[1])*elementDimension[2];
266 if ((rangeBegin <= idx) && (idxRange < rangeSize))
268 indexServerOnElement[i][globalIndexElement].push_back(idxServer);
277 std::vector<int> zeroIndexServer(
nServer_-nBand);
278 for (
int idxServer = nBand; idxServer <
nServer_; ++idxServer)
279 zeroIndexServer[idxServer-nBand] = idxServer;
281 return zeroIndexServer;
300 if (rangeProcSize < clientSize)
303 for (
int idx = 0; idx < clientSize; ++idx)
305 if (idx == clientRank)
307 rangeBegin = rangeIndex;
311 if (rangeIndex == rangeProcSize) rangeIndex = 0;
316 int range, indexBegin = 0;
317 for (
int i = 0; i < clientSize; ++i)
319 range = rangeProcSize / clientSize;
320 if (i < (rangeProcSize%clientSize)) ++range;
321 if (i == clientRank)
break;
324 rangeBegin = indexBegin;
338 ERROR(
"CServerDistributionDescription::computeBandDistribution(int nServer, int positionDimensionDistributed)",
339 <<
"Position of distributed dimension is invalid" << std::endl
341 <<
"Dimension " << dim)
346 for (
int i = 0; i< nServer; ++i)
354 std::vector<int> njRangeBegin(nServer,0);
355 std::vector<int> njRangeEnd(nServer,0);
358 nGlobTemp =
nGlobal_[positionDistributed];
359 int nbBand = std::min(nGlobTemp, nServer);
361 for (
int i = 0; i < nbBand; ++i)
363 if (0 < i) njRangeBegin[i] = njRangeEnd[i-1];
364 njRangeSize = nGlobTemp / nbBand;
365 if (i < nGlobTemp%nbBand) ++njRangeSize;
366 njRangeEnd[i] = njRangeSize + njRangeBegin[i];
368 njRangeEnd[nbBand-1] = nGlobTemp;
370 for (
int i = nbBand; i < nServer; ++i)
372 njRangeBegin[i] = njRangeEnd[i] = 0;
375 for (
int i = 0; i < nServer; ++i)
377 for (
int j = 0; j < dim; ++j)
379 if (positionDistributed != j)
414 ERROR(
"CServerDistributionDescription::computeBandDistribution(int nServer, int positionDimensionDistributed)",
415 <<
"Position of distributed dimension is invalid" << std::endl
417 <<
"Dimension " << dim)
422 for (
int i = 0; i< nServer; ++i)
431 nGlobTemp =
nGlobal_[positionDistributed];
435 for (
int i = 0; i < nServer; ++i)
437 for (
int j = 0; j < dim; ++j)
439 if (positionDistributed != j)
int getDimensionDistributed()
int computeRootDistribution(int nServer, int positionDimensionDistributed=1)
Compute global index of servers with root distribution : only root server will received data...
std::vector< int > computeServerGlobalIndexInRange(const std::pair< size_t, size_t > &indexBeginEnd, int positionDimensionDistributed=1)
Compute global index assigned to a server with a range.E.g: if a grid has 100 points and there are 2 ...
std::vector< std::vector< int > > getServerDimensionSizes() const
Get size of each dimension on distributed server.
Description of index distribution on server(s).
std::vector< std::vector< int > > getServerIndexBegin() const
Get index begin of each dimension on distributed server.
const std::vector< CArray< size_t, 1 > > & getGlobalIndex() const
Get global index on distributed server.
ServerDistributionType serverType_
Number of server.
int positionDimensionDistributed_
CATCH CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar *scalarDestination, CScalar *scalarSource, CReduceScalarToScalar *algo ERROR)("CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar* scalarDestination, CScalar* scalarSource, CReduceScalarToScalar* algo)",<< "Operation must be defined."<< "Scalar source "<< scalarSource->getId()<< std::endl<< "Scalar destination "<< scalarDestination->getId())
std::unordered_map< size_t, int > globalIndex_
Type of distribution on server side.
void computeRangeProcIndex(int clientRank, int clientSize, int rangeProcSize, int &rangeBegin, int &rangeSize)
Compute a range of index on server which a client holds For a range of index on a specific server...
virtual ~CServerDistributionDescription()
std::vector< std::vector< int > > indexBegin_
Begin index of each dimension.
void computeServerDistribution(bool doComputeGlobalIndex=false, int positionDimensionDistributed=1)
Compute pre-defined global index distribution of server(s).
int nServer_
Position of dimension distributed on server side (by default, the second dimension) ...
std::vector< std::vector< int > > dimensionSizes_
Size of each dimension.
const std::unordered_map< size_t, int > & getGlobalIndexRange() const
Get global index calculated by computeServerGlobalIndexInRange.
std::vector< int > nGlobal_
Global size of each dimension.
CServerDistributionDescription(const std::vector< int > &globalDimensionSize, int nServer, ServerDistributionType serType=BAND_DISTRIBUTION)
std::vector< int > computeServerGlobalByElement(std::vector< std::unordered_map< size_t, std::vector< int > > > &indexServerOnElement, int rank, int clientSize, const CArray< int, 1 > &axisDomainOrder, int positionDimensionDistributed=1)
Compute the global index of grid elements (domain, axis) and their associated server rank...
static int defaultDistributedDimension(int gridDimension, ServerDistributionType serType=BAND_DISTRIBUTION)
int computeBandDistribution(int nServer, int positionDimensionDistributed=1)
Compute global index of servers with band distribution.
std::vector< CArray< size_t, 1 > > vecGlobalIndex_
In case we need only global index of one server with specific rank.