ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/parallel/Communicator.hpp
(Generate patch)

Comparing branches/development/src/parallel/Communicator.hpp (file contents):
Revision 1551 by gezelter, Thu Apr 28 18:38:21 2011 UTC vs.
Revision 1593 by gezelter, Fri Jul 15 21:35:14 2011 UTC

# Line 103 | Line 103 | namespace OpenMD{
103    };
104    
105    
106 <  template<communicatorType D, typename T>
106 >  template<communicatorType D>
107    class Communicator {
108    public:
109      
110 <    Communicator<D, T>(int nObjects) {
110 >    Communicator<D>() {
111        
112        int nProc = MPI::COMM_WORLD.Get_size();
113        int myRank = MPI::COMM_WORLD.Get_rank();
114 <
114 >      
115        int nColumnsMax = (int) sqrt(RealType(nProc));
116  
117        int nColumns;
# Line 123 | Line 123 | namespace OpenMD{
123        rowIndex_ = myRank / nColumns;      
124        columnIndex_ = myRank % nColumns;
125  
126 +      cerr << "rowIndex = " << rowIndex_ << "\t colIndex = " << columnIndex_ << "\n";
127        switch(D) {
128        case Row :
129          myComm = MPI::COMM_WORLD.Split(rowIndex_, 0);
# Line 133 | Line 134 | namespace OpenMD{
134        case Global:
135          myComm = MPI::COMM_WORLD.Split(myRank, 0);
136        }
136        
137      int nCommProcs = myComm.Get_size();
137  
138 <      counts.reserve(nCommProcs);
139 <      displacements.reserve(nCommProcs);
138 >    }
139 >    
140 >    MPI::Intracomm getComm() { return myComm; }
141 >    
142 >  private:
143 >    int rowIndex_;
144 >    int columnIndex_;
145 >    MPI::Intracomm myComm;
146 >  };
147 >  
148  
149 +  template<typename T>
150 +  class Plan {
151 +  public:
152 +    
153 +    Plan<T>(MPI::Intracomm comm, int nObjects) {
154 +      myComm = comm;
155 +      int nCommProcs = myComm.Get_size();
156 +      
157 +      counts.resize(nCommProcs, 0);
158 +      displacements.resize(nCommProcs, 0);
159 +      
160        planSize_ = MPITraits<T>::Length() * nObjects;
161 <
161 >      
162        myComm.Allgather(&planSize_, 1, MPI::INT, &counts[0], 1, MPI::INT);
163 <
163 >      
164        displacements[0] = 0;
165        for (int i = 1; i < nCommProcs; i++) {
166          displacements[i] = displacements[i-1] + counts[i-1];
149        size_ += counts[i-1];
167        }
168  
169        size_ = 0;
# Line 158 | Line 175 | namespace OpenMD{
175      
176      void gather(vector<T>& v1, vector<T>& v2) {
177        
178 +      // an assert would be helpful here to make sure the vectors are the
179 +      // correct geometry
180 +      
181        myComm.Allgatherv(&v1[0],
182                          planSize_,
183                          MPITraits<T>::Type(),
# Line 165 | Line 185 | namespace OpenMD{
185                          &counts[0],
186                          &displacements[0],
187                          MPITraits<T>::Type());      
188 <    }
188 >    }      
189      
170    
171    
190      void scatter(vector<T>& v1, vector<T>& v2) {
191 <      
191 >      // an assert would be helpful here to make sure the vectors are the
192 >      // correct geometry
193 >            
194        myComm.Reduce_scatter(&v1[0], &v2[0], &counts[0],
195                              MPITraits<T>::Type(), MPI::SUM);
196      }
# Line 181 | Line 201 | namespace OpenMD{
201      
202    private:
203      int planSize_;     ///< how many are on local proc
184    int rowIndex_;
185    int columnIndex_;
204      int size_;
205      vector<int> counts;
206      vector<int> displacements;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines