source: XIOS/dev/dev_olga/src/distribution_server.cpp @ 983

Last change on this file since 983 was 930, checked in by mhnguyen, 8 years ago

Improving the performance of on server side

+) Replace searching algorithm for global-local index with a better one

Test
+) On Curie
+) Work correct

File size: 4.5 KB
Line 
1/*!
2   \file distribution_server.cpp
3   \author Ha NGUYEN
4   \since 13 Jan 2015
5   \date 10 Sep 2016
6
7   \brief Index distribution on server side.
8 */
9#include "distribution_server.hpp"
10#include "utils.hpp"
11
12namespace xios {
13
14CDistributionServer::CDistributionServer(int rank, int dims, const CArray<size_t,1>& globalIndex)
15  : CDistribution(rank, dims, globalIndex), nGlobal_(), nZoomSize_(), nZoomBegin_(), globalLocalIndexMap_()
16{
17}
18
19CDistributionServer::CDistributionServer(int rank, const std::vector<int>& nZoomBegin,
20                                         const std::vector<int>& nZoomSize, const std::vector<int>& nGlobal)
21  : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_()
22{
23  createGlobalIndex();
24}
25
26CDistributionServer::CDistributionServer(int rank, const std::vector<int>& nZoomBegin,
27                                         const std::vector<int>& nZoomSize,
28                                         const std::vector<int>& nZoomBeginGlobal,
29                                         const std::vector<int>& nGlobal)
30  : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(nZoomBeginGlobal),
31    nZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_()
32{
33  createGlobalIndex();
34}
35
36CDistributionServer::~CDistributionServer()
37{
38}
39
40/*!
41  Create global index on server side
42  Like the similar function on client side, this function serves on creating global index
43for data written by the server. The global index is used to calculating local index of data
44written on each server
45*/
46void CDistributionServer::createGlobalIndex()
47{
48  size_t idx = 0, ssize = 1;
49  for (int i = 0; i < nZoomSize_.size(); ++i) ssize *= nZoomSize_[i];
50
51  this->globalIndex_.resize(ssize);
52  std::vector<int> idxLoop(this->getDims(),0);
53  std::vector<int> currentIndex(this->getDims());
54  int innerLoopSize = nZoomSize_[0];
55
56  globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor()));
57  while (idx<ssize)
58  {
59    for (int i = 0; i < this->dims_-1; ++i)
60    {
61      if (idxLoop[i] == nZoomSize_[i])
62      {
63        idxLoop[i] = 0;
64        ++idxLoop[i+1];
65      }
66    }
67
68    for (int i = 1; i < this->dims_; ++i)  currentIndex[i] = idxLoop[i] + nZoomBegin_[i];
69
70    size_t mulDim, globalIndex;
71    for (int i = 0; i < innerLoopSize; ++i)
72    {
73      mulDim = 1;
74      globalIndex = i + nZoomBegin_[0];
75
76      for (int k = 1; k < this->dims_; ++k)
77      {
78        mulDim *= nGlobal_[k-1];
79        globalIndex += (currentIndex[k])*mulDim;
80      }
81      globalLocalIndexMap_[globalIndex] = idx;
82      this->globalIndex_(idx) = globalIndex;
83
84      ++idx;
85    }
86    idxLoop[0] += innerLoopSize;
87  }
88}
89
90/*!
91  Compute local index for writing data on server
92  \param [in] globalIndex global index received from client
93  \return local index of written data
94*/
95CArray<size_t,1> CDistributionServer::computeLocalIndex(const CArray<size_t,1>& globalIndex)
96{
97  int ssize = globalIndex.numElements();
98  CArray<size_t,1> localIndex(ssize);
99  GlobalLocalMap::const_iterator ite = globalLocalIndexMap_.end(), it;
100  for (int idx = 0; idx < ssize; ++idx)
101  {
102    it = globalLocalIndexMap_.find(globalIndex(idx));
103    if (ite != it)
104      localIndex(idx) = it->second;
105  }
106
107  return localIndex;
108}
109
110/*!
111  Compute local index for writing data on server
112  \param [in] globalIndex Global index received from client
113*/
114void CDistributionServer::computeLocalIndex(CArray<size_t,1>& globalIndex)
115{
116  int ssize = globalIndex.numElements();
117  CArray<size_t,1> localIndex(ssize);
118  GlobalLocalMap::const_iterator ite = globalLocalIndexMap_.end(), it;
119  for (int idx = 0; idx < ssize; ++idx)
120  {
121    it = globalLocalIndexMap_.find(globalIndex(idx));
122    if (ite != it)
123      localIndex(idx) = it->second;
124  }
125
126  globalIndex.reference(localIndex);
127}
128
129/*!
130  Transforms local indexes owned by the server into global indexes
131  \param [in/out] indexes on input, local indexes of the server,
132                          on output, the corresponding global indexes
133*/
134void CDistributionServer::computeGlobalIndex(CArray<int,1>& indexes) const
135{
136  for (int i = 0; i < indexes.numElements(); ++i)
137  {
138    indexes(i) = globalIndex_(indexes(i));
139  }
140}
141
142
143const std::vector<int>& CDistributionServer::getZoomBeginGlobal() const
144{
145  return nZoomBeginGlobal_;
146}
147
148const std::vector<int>& CDistributionServer::getZoomBeginServer() const
149{
150  return nZoomBegin_;
151}
152
153const std::vector<int>& CDistributionServer::getZoomSizeServer() const
154{
155  return nZoomSize_;
156}
157} // namespace xios
Note: See TracBrowser for help on using the repository browser.