NAMD
PmeSolver.h
Go to the documentation of this file.
1 #ifndef PMESOLVER_H
2 #define PMESOLVER_H
3 #include <vector>
4 #include "ReductionMgr.h"
5 #include "PatchMap.h"
6 #include "PmeSolverUtil.h"
7 #include "PmeSolver.decl.h"
8 
9 #include <array>
10 
11 class PmePencilXYZMap : public CBase_PmePencilXYZMap {
12 public:
13  PmePencilXYZMap(int pe) : pe(pe) {
14  }
15  //PmePencilXYZMap(CkMigrateMessage *m) {}
16  int registerArray(CkArrayIndex& numElements, CkArrayID aid) {
17  return 0;
18  }
19  virtual int procNum(int, const CkArrayIndex& idx) {
20  return pe;
21  }
22  virtual void populateInitial(int, CkArrayOptions &, void *msg, CkArrMgr *mgr) {
23  if (pe == CkMyPe()) {
24  if ( ! msg ) NAMD_bug("PmePencilXYZMap::populateInitial, multiple pencils on a pe?");
25  mgr->insertInitial(CkArrayIndex1D(0), msg);
26  msg = NULL;
27  }
28  mgr->doneInserting();
29  if (msg != NULL) CkFreeMsg(msg);
30  }
31 private:
32  const int pe;
33 };
34 
35 class PmePencilXMap : public CBase_PmePencilXMap {
36 public:
37  PmePencilXMap(int ia, int ib, int width, const std::vector<int>& pes) : ia(ia), ib(ib), width(width), pes(pes) {}
38  int registerArray(CkArrayIndex& numElements, CkArrayID aid) {
39  return 0;
40  }
41  virtual int procNum(int, const CkArrayIndex& idx) {
42  int ind = idx.data()[ia] + idx.data()[ib] * width;
43  if (ind < 0 || ind >= pes.size())
44  NAMD_bug("PmePencilXMap::procNum, index out of bounds");
45  return pes[ind];
46  }
47  virtual void populateInitial(int, CkArrayOptions &, void *msg, CkArrMgr *mgr) {
48  for (int i=0;i < pes.size();i++) {
49  if (pes[i] == CkMyPe()) {
50  if ( msg == NULL ) NAMD_bug("PmePencilXMap::populateInitial, multiple pencils on a pe?");
51  CkArrayIndex3D ai(0,0,0);
52  ai.data()[ib] = i / width;
53  ai.data()[ia] = i % width;
54  //fprintf(stderr, "Pe %d i %d at %d %d\n", pes[i], i, ai.data()[ia], ai.data()[ib]);
55  if ( procNum(0,ai) != CkMyPe() ) NAMD_bug("PmePencilXMap::populateInitial, map is inconsistent");
56  mgr->insertInitial(ai,msg);
57  msg = NULL;
58  }
59  }
60  mgr->doneInserting();
61  if (msg != NULL) CkFreeMsg(msg);
62  }
63 private:
64  // Index of CkArrayIndex data()
65  const int ia, ib;
66  // Width of the 2D array in pes
67  const int width;
68  // List of Pes. Index is given by pes[i + j*width]
69  const std::vector<int> pes;
70 };
71 
72 class PmePencilXYMap : public CBase_PmePencilXYMap {
73 public:
74  PmePencilXYMap(const std::vector<int>& pes) : pes(pes) {}
75  int registerArray(CkArrayIndex& numElements, CkArrayID aid) {
76  return 0;
77  }
78  virtual int procNum(int, const CkArrayIndex& idx) {
79  int ind = idx.data()[2];
80  if (ind < 0 || ind >= pes.size())
81  NAMD_bug("PmePencilXYMap::procNum, index out of bounds");
82  return pes[ind];
83  }
84  virtual void populateInitial(int, CkArrayOptions &, void *msg, CkArrMgr *mgr) {
85  for (int i=0;i < pes.size();i++) {
86  if (pes[i] == CkMyPe()) {
87  if ( msg == NULL ) NAMD_bug("PmePencilXYMap::populateInitial, multiple pencils on a pe?");
88  CkArrayIndex3D ai(0,0,0);
89  ai.data()[2] = i;
90  if ( procNum(0,ai) != CkMyPe() ) NAMD_bug("PmePencilXYMap::populateInitial, map is inconsistent");
91  mgr->insertInitial(ai, msg);
92  msg = NULL;
93  }
94  }
95  mgr->doneInserting();
96  if (msg != NULL) CkFreeMsg(msg);
97  }
98 private:
99  // List of Pes.
100  const std::vector<int> pes;
101 };
102 
103 class PmeStartMsg : public CMessage_PmeStartMsg {
104 public:
105  std::array<float*, NUM_GRID_MAX> dataGrid;
106  std::array<int, NUM_GRID_MAX> dataSizes;
107  std::array<bool, NUM_GRID_MAX> enabledGrid;
108  int device;
109 };
110 
111 class PmeRunMsg : public CMessage_PmeRunMsg {
112 public:
117 };
118 
119 class PmeDoneMsg : public CMessage_PmeDoneMsg {
120 public:
121  PmeDoneMsg(int i, int j) : i(i), j(j) {}
122  int i, j;
123 };
124 
125 class PmeBlockMsg : public CMessage_PmeBlockMsg {
126 public:
127  float2 *data;
128  int dataSize;
129  int x, y, z;
133  unsigned int grid;
135 };
136 
137 class PmePencilXYZ : public CBase_PmePencilXYZ {
138 public:
139  PmePencilXYZ_SDAG_CODE
140  PmePencilXYZ();
141  PmePencilXYZ(CkMigrateMessage *m);
142  virtual ~PmePencilXYZ();
143  void skip();
144 protected:
147  // CHC: multiple grids
149  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
150  std::array<PmeKSpaceCompute*, NUM_GRID_MAX> pmeKSpaceComputes;
151  // prevent race conditions when gathering energies
152  // It is the same as forceReady
153  std::array<int, NUM_GRID_MAX> energyReady;
154 // CmiNodeLock multipleGridLock;
157  virtual void backwardDone();
158  void submitReductions(unsigned int iGrid);
159 private:
160  void forwardFFT();
161  void backwardFFT();
162  void forwardDone();
163  void initFFT(PmeStartMsg *msg);
164  SubmitReduction* reduction;
165 #ifdef NODEGROUP_FORCE_REGISTER
166 // #if false
167  NodeReduction *nodeReduction;
168 #endif
169 
170 };
171 
172 class PmePencilXY : public CBase_PmePencilXY {
173 public:
174  PmePencilXY_SDAG_CODE
175  PmePencilXY();
176  PmePencilXY(CkMigrateMessage *m);
177  virtual ~PmePencilXY();
178 protected:
182  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
183  std::array<PmeTranspose*, NUM_GRID_MAX> pmeTransposes;
184  std::vector<int> blockSizes;
187  void initBlockSizes();
188  int imsg;
189 private:
190  void forwardFFT();
191  void backwardFFT();
192  void initFFT(PmeStartMsg *msg);
193  virtual void forwardDone();
194  virtual void backwardDone();
195  virtual void recvDataFromZ(PmeBlockMsg *msg);
196  virtual void start(const CkCallback &);
197 
198 };
199 
200 class PmePencilX : public CBase_PmePencilX {
201 public:
202  PmePencilX_SDAG_CODE
203  PmePencilX();
204  PmePencilX(CkMigrateMessage *m);
205  virtual ~PmePencilX();
206 protected:
210  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
211  std::array<PmeTranspose*, NUM_GRID_MAX> pmeTransposes;
212  std::vector<int> blockSizes;
215  void initBlockSizes();
216  int imsg;
217 private:
218  void forwardFFT();
219  void backwardFFT();
220  void initFFT(PmeStartMsg *msg);
221  virtual void forwardDone();
222  virtual void backwardDone();
223  virtual void recvDataFromY(PmeBlockMsg *msg);
224  virtual void start(const CkCallback &);
225 
226 };
227 
228 class PmePencilY : public CBase_PmePencilY {
229 public:
230  PmePencilY_SDAG_CODE
231  PmePencilY();
232  PmePencilY(CkMigrateMessage *m);
233  virtual ~PmePencilY();
234 protected:
238  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
239  std::array<PmeTranspose*, NUM_GRID_MAX> pmeTransposes;
240  std::vector<int> blockSizes;
243  void initBlockSizes();
244  int imsg;
245 private:
246  void forwardFFT();
247  void backwardFFT();
248  void initFFT(PmeStartMsg *msg);
249  virtual void forwardDone();
250  virtual void backwardDone();
251  virtual void recvDataFromX(PmeBlockMsg *msg);
252  virtual void recvDataFromZ(PmeBlockMsg *msg);
253  virtual void start(const CkCallback &);
254 
255 };
256 
257 class PmePencilZ : public CBase_PmePencilZ {
258 public:
259  PmePencilZ_SDAG_CODE
260  PmePencilZ();
261  PmePencilZ(CkMigrateMessage *m);
262  virtual ~PmePencilZ();
263  void skip();
264 protected:
268  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
269  std::array<PmeTranspose*, NUM_GRID_MAX> pmeTransposes;
270  std::array<PmeKSpaceCompute*, NUM_GRID_MAX> pmeKSpaceComputes;
271  std::array<int, NUM_GRID_MAX> energyReady;
272  std::vector<int> blockSizes;
275  void initBlockSizes();
276  void submitReductions(unsigned int iGrid);
277  int imsg;
278 private:
279  void forwardFFT();
280  void backwardFFT();
281  void forwardDone();
282  void initFFT(PmeStartMsg *msg);
283  virtual void backwardDone();
284  virtual void recvDataFromY(PmeBlockMsg *msg);
285  virtual void start(const CkCallback &);
286 
287  SubmitReduction* reduction;
288 #ifdef NODEGROUP_FORCE_REGISTER
289 // #if false
290  NodeReduction *nodeReduction;
291 #endif
292 
293 };
294 
295 // #define CK_TEMPLATES_ONLY
296 // #include "PmeSolver.def.h"
297 // #undef CK_TEMPLATES_ONLY
298 
299 #endif // PMESOLVER_H
bool doEnergy
Definition: PmeSolver.h:130
virtual ~PmePencilXYZ()
Definition: PmeSolver.C:51
PmeDoneMsg(int i, int j)
Definition: PmeSolver.h:121
std::array< PmeKSpaceCompute *, NUM_GRID_MAX > pmeKSpaceComputes
Definition: PmeSolver.h:270
Lattice lattice
Definition: PmeSolver.h:273
bool doEnergy
Definition: PmeSolver.h:266
int numStrayAtoms
Definition: PmeSolver.h:114
PmePencilXYMap(const std::vector< int > &pes)
Definition: PmeSolver.h:74
std::vector< int > blockSizes
Definition: PmeSolver.h:272
bool doVirial
Definition: PmeSolver.h:180
int registerArray(CkArrayIndex &numElements, CkArrayID aid)
Definition: PmeSolver.h:16
virtual int procNum(int, const CkArrayIndex &idx)
Definition: PmeSolver.h:41
virtual ~PmePencilXY()
Definition: PmeSolver.C:320
bool doVirial
Definition: PmeSolver.h:113
virtual void backwardDone()
Definition: PmeSolver.C:97
int registerArray(CkArrayIndex &numElements, CkArrayID aid)
Definition: PmeSolver.h:75
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:182
void submitReductions(unsigned int iGrid)
Definition: PmeSolver.C:101
int numStrayAtoms
Definition: PmeSolver.h:186
int simulationStep
Definition: PmeSolver.h:267
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:183
virtual void populateInitial(int, CkArrayOptions &, void *msg, CkArrMgr *mgr)
Definition: PmeSolver.h:22
Lattice lattice
Definition: PmeSolver.h:155
PmePencilX_SDAG_CODE PmePencilX()
Definition: PmeSolver.C:422
int numStrayAtoms
Definition: PmeSolver.h:156
float2 * data
Definition: PmeSolver.h:127
std::vector< int > blockSizes
Definition: PmeSolver.h:240
PmeGrid pmeGrid
Definition: PmeSolver.h:179
bool doVirial
Definition: PmeSolver.h:266
int simulationStep
Definition: PmeSolver.h:181
std::vector< int > blockSizes
Definition: PmeSolver.h:212
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:211
int dataSize
Definition: PmeSolver.h:128
virtual ~PmePencilY()
Definition: PmeSolver.C:524
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:210
std::array< int, NUM_GRID_MAX > dataSizes
Definition: PmeSolver.h:106
std::array< float *, NUM_GRID_MAX > dataGrid
Definition: PmeSolver.h:105
bool doVirial
Definition: PmeSolver.h:236
bool doVirial
Definition: PmeSolver.h:146
bool doVirial
Definition: PmeSolver.h:208
void initBlockSizes()
Definition: PmeSolver.C:475
std::array< int, NUM_GRID_MAX > energyReady
Definition: PmeSolver.h:153
PmePencilXMap(int ia, int ib, int width, const std::vector< int > &pes)
Definition: PmeSolver.h:37
int numStrayAtoms
Definition: PmeSolver.h:242
virtual int procNum(int, const CkArrayIndex &idx)
Definition: PmeSolver.h:19
bool doEnergy
Definition: PmeSolver.h:236
PmeGrid pmeGrid
Definition: PmeSolver.h:265
PmeGrid pmeGrid
Definition: PmeSolver.h:145
int numStrayAtoms
Definition: PmeSolver.h:131
std::array< PmeKSpaceCompute *, NUM_GRID_MAX > pmeKSpaceComputes
Definition: PmeSolver.h:150
void NAMD_bug(const char *err_msg)
Definition: common.C:195
void initBlockSizes()
Definition: PmeSolver.C:559
PmePencilXY_SDAG_CODE PmePencilXY()
Definition: PmeSolver.C:303
virtual int procNum(int, const CkArrayIndex &idx)
Definition: PmeSolver.h:78
std::vector< int > blockSizes
Definition: PmeSolver.h:184
PmePencilXYZ_SDAG_CODE PmePencilXYZ()
Definition: PmeSolver.C:22
bool doEnergy
Definition: PmeSolver.h:146
Lattice lattice
Definition: PmeSolver.h:213
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:239
std::array< int, NUM_GRID_MAX > energyReady
Definition: PmeSolver.h:271
PmePencilZ_SDAG_CODE PmePencilZ()
Definition: PmeSolver.C:594
int registerArray(CkArrayIndex &numElements, CkArrayID aid)
Definition: PmeSolver.h:38
int simulationStep
Definition: PmeSolver.h:148
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:149
int simulationStep
Definition: PmeSolver.h:237
int numStrayAtoms
Definition: PmeSolver.h:274
PmePencilXYZMap(int pe)
Definition: PmeSolver.h:13
void skip()
Definition: PmeSolver.C:273
Lattice lattice
Definition: PmeSolver.h:241
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:238
unsigned int grid
Definition: PmeSolver.h:133
virtual ~PmePencilX()
Definition: PmeSolver.C:440
bool doVirial
Definition: PmeSolver.h:130
bool doEnergy
Definition: PmeSolver.h:208
Lattice lattice
Definition: PmeSolver.h:116
bool doEnergy
Definition: PmeSolver.h:180
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:269
void submitReductions(unsigned int iGrid)
Definition: PmeSolver.C:688
int simulationStep
Definition: PmeSolver.h:134
virtual void populateInitial(int, CkArrayOptions &, void *msg, CkArrMgr *mgr)
Definition: PmeSolver.h:47
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:268
void initBlockSizes()
Definition: PmeSolver.C:665
int simulationStep
Definition: PmeSolver.h:209
Lattice lattice
Definition: PmeSolver.h:185
std::array< bool, NUM_GRID_MAX > enabledGrid
Definition: PmeSolver.h:107
virtual void populateInitial(int, CkArrayOptions &, void *msg, CkArrMgr *mgr)
Definition: PmeSolver.h:84
int simulationStep
Definition: PmeSolver.h:115
void initBlockSizes()
Definition: PmeSolver.C:359
PmePencilY_SDAG_CODE PmePencilY()
Definition: PmeSolver.C:506
virtual ~PmePencilZ()
Definition: PmeSolver.C:622
PmeGrid pmeGrid
Definition: PmeSolver.h:235
PmeGrid pmeGrid
Definition: PmeSolver.h:207
Lattice lattice
Definition: PmeSolver.h:132
bool doEnergy
Definition: PmeSolver.h:113
int numStrayAtoms
Definition: PmeSolver.h:214
void skip()
Definition: PmeSolver.C:865