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

Comparing branches/development/src/parallel/Communicator.hpp (file contents):
Revision 1589 by gezelter, Sun Jul 10 16:05:34 2011 UTC vs.
Revision 1874 by gezelter, Wed May 15 15:09:35 2013 UTC

# Line 2 | Line 2
2   * @file Communicator.hpp
3   * @author Charles Vardeman <cvardema.at.nd.edu>
4   * @date 08/18/2010
5 * @time 11:56am
5   * @version 1.0
6   *
7   * @section LICENSE
# Line 42 | Line 41
41   *                                                                      
42   * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
43   * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
44 < * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).          
45 < * [4]  Vardeman & Gezelter, in progress (2009).                        
44 > * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).          
45 > * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
46 > * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
47   */
48  
49   #ifndef PARALLEL_COMMUNICATOR_HPP
# Line 71 | Line 71 | namespace OpenMD{
71      static int Length() { return 1; };
72    };
73    
74 <  template<> inline MPI::Datatype MPITraits<int>::Type() { return MPI_INT; }
75 <  template<> inline MPI::Datatype MPITraits<RealType>::Type() { return MPI_REALTYPE; }
74 >  template<> inline MPI::Datatype MPITraits<int>::Type() { return MPI::INT; }
75 >  template<> inline MPI::Datatype MPITraits<RealType>::Type() { return MPI::REALTYPE; }
76  
77    template<class T, unsigned int Dim>
78    class MPITraits< Vector<T, Dim> > {
# Line 88 | Line 88 | namespace OpenMD{
88      static int Length() {return 3;}
89    };
90  
91 <  template<class T, unsigned int Row, unsigned int Col>
92 <  class MPITraits< RectMatrix<T, Row, Col> > {
91 >  template<class T, unsigned int R, unsigned int C>
92 >  class MPITraits< RectMatrix<T, R, C> > {
93    public:
94      static MPI::Datatype Type() { return MPITraits<T>::Type(); }
95 <    static int Length() {return Row * Col;}
95 >    static int Length() {return R * C;}
96    };
97  
98    template<class T>
# 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 119 | Line 119 | namespace OpenMD{
119          if (nProc % i == 0) nColumns = i;        
120        }
121          
122 <      int nRows = nProc / nColumns;
122 >      // int nRows = nProc / nColumns;
123        rowIndex_ = myRank / nColumns;      
124        columnIndex_ = myRank % nColumns;
125  
# Line 133 | Line 133 | namespace OpenMD{
133        case Global:
134          myComm = MPI::COMM_WORLD.Split(myRank, 0);
135        }
136        
137      int nCommProcs = myComm.Get_size();
136  
137 +    }
138 +    
139 +    MPI::Intracomm getComm() { return myComm; }
140 +    
141 +  private:
142 +    int rowIndex_;
143 +    int columnIndex_;
144 +    MPI::Intracomm myComm;
145 +  };
146 +  
147 +
148 +  template<typename T>
149 +  class Plan {
150 +  public:
151 +    
152 +    Plan<T>(MPI::Intracomm comm, int nObjects) {
153 +      myComm = comm;
154 +      int nCommProcs = myComm.Get_size();
155 +      
156        counts.resize(nCommProcs, 0);
157        displacements.resize(nCommProcs, 0);
158 <
158 >      
159        planSize_ = MPITraits<T>::Length() * nObjects;
160 <
160 >      
161        myComm.Allgather(&planSize_, 1, MPI::INT, &counts[0], 1, MPI::INT);
162 <
162 >      
163        displacements[0] = 0;
164        for (int i = 1; i < nCommProcs; i++) {
165          displacements[i] = displacements[i-1] + counts[i-1];
# Line 156 | Line 173 | namespace OpenMD{
173  
174      
175      void gather(vector<T>& v1, vector<T>& v2) {
176 <
176 >      
177        // an assert would be helpful here to make sure the vectors are the
178        // correct geometry
179        
# Line 167 | Line 184 | namespace OpenMD{
184                          &counts[0],
185                          &displacements[0],
186                          MPITraits<T>::Type());      
187 <    }
187 >    }      
188      
172    
173    
189      void scatter(vector<T>& v1, vector<T>& v2) {
190        // an assert would be helpful here to make sure the vectors are the
191        // correct geometry
192 <      
192 >            
193        myComm.Reduce_scatter(&v1[0], &v2[0], &counts[0],
194                              MPITraits<T>::Type(), MPI::SUM);
195      }
# Line 185 | Line 200 | namespace OpenMD{
200      
201    private:
202      int planSize_;     ///< how many are on local proc
188    int rowIndex_;
189    int columnIndex_;
203      int size_;
204      vector<int> counts;
205      vector<int> displacements;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines