ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/parallel/Parallel.hpp
Revision: 1538
Committed: Tue Jan 11 18:58:12 2011 UTC (14 years, 3 months ago) by chuckv
File size: 7105 byte(s)
Log Message:
Adding parallel classes...

File Contents

# User Rev Content
1 chuckv 1538
2     #ifndef PARALLEL_PARALLEL_HPP
3     #define PARALLEL_PARALLEL_HPP
4     #include <vector>
5     #include <string>
6    
7     //#include <protomol/type/Real.h>
8     //#include <protomol/parallel/ParallelType.h>
9    
10     namespace OpenMD {
11     class ScalarStructure;
12     class Vector3DBlock;
13     class GenericTopology;
14    
15     //____ Parallel
16     class Parallel {
17    
18     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19     // Constructors, destructors, assignment
20     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21     private:
22     Parallel();
23     ~Parallel();
24     Parallel(const Parallel &) {}
25    
26     Parallel &operator=(const Parallel &) {return *this;}
27    
28     public:
29     static void init(int &argc, char ** &argv); ///< MPI_Init and sets id and
30     ///< number of process.
31     static void finalize(); ///< MPI_Finialize.
32    
33     static bool initialized() {return myInitialized;}
34    
35     static bool finalized() {return myFinalized;}
36    
37     static bool ok() {return myInitialized && !myFinalized;}
38    
39     static int getId() {return myId;}
40    
41     static int getMasterId() {return myMasterId;}
42    
43     static int getNum() {return myNum;}
44    
45     static int getAvailableId() {return myAvailableId;}
46    
47     static int getAvailableNum() {return myAvailableNum;}
48    
49     static bool isParallel() {return myIsParallel;}
50    
51     static bool iAmMaster() {return myIAmMaster;}
52    
53     static bool iAmSlave() {return myIAmSlave;}
54    
55    
56     public:
57    
58     /**
59     * Broadcast a Vector3DBlock from the master to the rest.
60     * Handles also the case if the receiving nodes have an emty
61     * (other size) Vector3DBlock.
62     */
63     static void bcast(Vector3DBlock *coords);
64     static void bcast(int &n);
65    
66     /**
67     * Does the preprocessing, clearing the energies and forces for
68     * all nodes except the master.
69     */
70     static void distribute(ScalarStructure *energy, Vector3DBlock *coords);
71    
72     /**
73     * Does a reduction and a broadcast, such that all
74     * nodes have the correct summed energies and forces locally.
75     */
76     static void reduce(ScalarStructure *energy, Vector3DBlock *coords);
77    
78     /// Takes care of sending a Vector3DBlock to a single node.
79     static void send(Vector3DBlock *vect, int address);
80    
81     /// Recieves a Vector3DBlock from a node.
82     static void recv(Vector3DBlock *vect, int address);
83    
84     /// Sends a Vector3DBlock, to one node, and overwrites it with one recieved
85     /// from another node
86     static void sendrecv_replace(Vector3DBlock *Vect, int sendaddr,
87     int recvaddr);
88    
89     /// Sends a Real (or array of Reals) from one node to another
90     static void send(RealType *data, int num, int address);
91    
92     /// Recieves a Real (or array of Reals) from another node
93     static void recv(RealType *data, int num, int address);
94    
95     /// Sends one real and receives another real from one or two nodes (sends
96     /// to one, recieves to the other)
97     static void sendrecv(Real *senddata, int sendnum, int sendaddr,
98     Real *recvdata, int recvnum,
99     int recvaddr);
100    
101     /// Sends a Real (or array of Reals) to one node and overwrites it with
102     /// data from another node.
103     static void sendrecv_replace(Real *data, int num, int sendaddr,
104     int recvaddr);
105    
106     /// Gathers a vector of Reals from the compute nodes and stores it in an
107     /// array.
108     static void gather(Real *data, int num, Real *data_array, int address);
109    
110     /// Gathers a vector of Reals from the compute nodes and stores it in an
111     /// array, distributed to all the nodes.
112     static void allgather(Real *data, int num, Real *data_array);
113    
114     // Partitioning
115     public:
116     /// Returns the number of packages over all forces.
117     static unsigned int getNumberOfPackages(unsigned int n);
118    
119     public:
120     /// true if the actual work package should computed, false skip it
121     static bool next();
122    
123     static void resetNext() {myNext = 0; myNextRange[0] = 0; myNextRange[1] = 0;
124     myWorkState = getWorkState();}
125    
126     static void resetNext(const std::vector<int> &blocks);
127    
128     public:
129     /// Disables MPI on the current node
130     static void isolateNode();
131    
132     /// Enables MPI on the current node
133     static void integrateNode();
134    
135     private:
136     static void kill();
137     static Parallel &instance();
138     static bool ok(const std::string &err);
139     static WorkState getWorkState();
140     static void nextMaster();
141    
142     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
143     // My data members
144     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
145     public:
146     static const bool isMPI;
147     private:
148     static bool myInitialized; ///< If Parallel is initialized
149     static bool myFinalized; // /<If Parallel is finalized
150     static int myId; ///< Actual id of the node, [0,1,...,N-1]
151     static int myMasterId; ///< Id of the master
152     static int myNum; ///< Number of nodes, N
153     static int myAvailableId; ///< Actual master-slave id, -1 for the master
154     static int myAvailableNum; ///< Available number of nodes for computation
155     static bool myIsParallel; ///< If environment has more that 1 node
156     static bool myIAmMaster; ///< If this node is master
157     static bool myIAmSlave; ///< If this node is slave/worker
158     static ParallelType myMode; ///< Parallelization scheme
159     static WorkState myWorkState; ///< Actual work state
160    
161     static int myPipeSize; ///< Number of add. work packages to push to
162     ///< slaves
163     static bool myUseBarrier; ///< Flag to signal usage of MPI_Barrier
164     static int myMaxPackages; ///< Number of max. packages per node per force
165    
166     static int *myBuffer; ///< Bsend buffer
167     static int myNext; ///< Counter of next() calls
168     static int myNextRange[2]; ///< Actual work package to work on [from,to]
169     static std::vector<int> myDone; ///< Master, keeps track of slave
170     ///< have got already their work
171     static std::vector<int> myBlockList; ///< List of of the force
172     ///< partitioning
173    
174     static int myRecv; ///< Number of outstanding receives
175     static int myI; ///< Index of the actual work package (only
176     ///< master)
177     static int myP; ///< Node number
178    
179     static Parallel *obj; ///< Instance
180    
181     static bool myIsolated; ///< Saves isolation state
182     static int myOldId; ///< Saves processor id when switching MPI off
183     static int myOldNum; ///< Saves number of processors when switching
184     ///< MPI off
185     static ParallelType myOldMode; ///< Saves parallelization scheme when
186     ///< switching MPI off
187     };
188     //____ INLINES
189     }
190     #endif /* PARAMETER_H */