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 
166 };
167 
168 class PmePencilXY : public CBase_PmePencilXY {
169 public:
170  PmePencilXY_SDAG_CODE
171  PmePencilXY();
172  PmePencilXY(CkMigrateMessage *m);
173  virtual ~PmePencilXY();
174 protected:
178  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
179  std::array<PmeTranspose*, NUM_GRID_MAX> pmeTransposes;
180  std::vector<int> blockSizes;
183  void initBlockSizes();
184  int imsg;
185 private:
186  void forwardFFT();
187  void backwardFFT();
188  void initFFT(PmeStartMsg *msg);
189  virtual void forwardDone();
190  virtual void backwardDone();
191  virtual void recvDataFromZ(PmeBlockMsg *msg);
192  virtual void start(const CkCallback &);
193 
194 };
195 
196 class PmePencilX : public CBase_PmePencilX {
197 public:
198  PmePencilX_SDAG_CODE
199  PmePencilX();
200  PmePencilX(CkMigrateMessage *m);
201  virtual ~PmePencilX();
202 protected:
206  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
207  std::array<PmeTranspose*, NUM_GRID_MAX> pmeTransposes;
208  std::vector<int> blockSizes;
211  void initBlockSizes();
212  int imsg;
213 private:
214  void forwardFFT();
215  void backwardFFT();
216  void initFFT(PmeStartMsg *msg);
217  virtual void forwardDone();
218  virtual void backwardDone();
219  virtual void recvDataFromY(PmeBlockMsg *msg);
220  virtual void start(const CkCallback &);
221 
222 };
223 
224 class PmePencilY : public CBase_PmePencilY {
225 public:
226  PmePencilY_SDAG_CODE
227  PmePencilY();
228  PmePencilY(CkMigrateMessage *m);
229  virtual ~PmePencilY();
230 protected:
234  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
235  std::array<PmeTranspose*, NUM_GRID_MAX> pmeTransposes;
236  std::vector<int> blockSizes;
239  void initBlockSizes();
240  int imsg;
241 private:
242  void forwardFFT();
243  void backwardFFT();
244  void initFFT(PmeStartMsg *msg);
245  virtual void forwardDone();
246  virtual void backwardDone();
247  virtual void recvDataFromX(PmeBlockMsg *msg);
248  virtual void recvDataFromZ(PmeBlockMsg *msg);
249  virtual void start(const CkCallback &);
250 
251 };
252 
253 class PmePencilZ : public CBase_PmePencilZ {
254 public:
255  PmePencilZ_SDAG_CODE
256  PmePencilZ();
257  PmePencilZ(CkMigrateMessage *m);
258  virtual ~PmePencilZ();
259  void skip();
260 protected:
264  std::array<FFTCompute*, NUM_GRID_MAX> fftComputes;
265  std::array<PmeTranspose*, NUM_GRID_MAX> pmeTransposes;
266  std::array<PmeKSpaceCompute*, NUM_GRID_MAX> pmeKSpaceComputes;
267  std::array<int, NUM_GRID_MAX> energyReady;
268  std::vector<int> blockSizes;
271  void initBlockSizes();
272  void submitReductions(unsigned int iGrid);
273  int imsg;
274 private:
275  void forwardFFT();
276  void backwardFFT();
277  void forwardDone();
278  void initFFT(PmeStartMsg *msg);
279  virtual void backwardDone();
280  virtual void recvDataFromY(PmeBlockMsg *msg);
281  virtual void start(const CkCallback &);
282 
283  SubmitReduction* reduction;
284 
285 };
286 
287 // #define CK_TEMPLATES_ONLY
288 // #include "PmeSolver.def.h"
289 // #undef CK_TEMPLATES_ONLY
290 
291 #endif // PMESOLVER_H
bool doEnergy
Definition: PmeSolver.h:130
virtual ~PmePencilXYZ()
Definition: PmeSolver.C:45
PmeDoneMsg(int i, int j)
Definition: PmeSolver.h:121
std::array< PmeKSpaceCompute *, NUM_GRID_MAX > pmeKSpaceComputes
Definition: PmeSolver.h:266
Lattice lattice
Definition: PmeSolver.h:269
bool doEnergy
Definition: PmeSolver.h:262
int numStrayAtoms
Definition: PmeSolver.h:114
PmePencilXYMap(const std::vector< int > &pes)
Definition: PmeSolver.h:74
std::vector< int > blockSizes
Definition: PmeSolver.h:268
bool doVirial
Definition: PmeSolver.h:176
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:293
bool doVirial
Definition: PmeSolver.h:113
virtual void backwardDone()
Definition: PmeSolver.C:91
int registerArray(CkArrayIndex &numElements, CkArrayID aid)
Definition: PmeSolver.h:75
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:178
void submitReductions(unsigned int iGrid)
Definition: PmeSolver.C:95
int numStrayAtoms
Definition: PmeSolver.h:182
int simulationStep
Definition: PmeSolver.h:263
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:179
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:395
int numStrayAtoms
Definition: PmeSolver.h:156
float2 * data
Definition: PmeSolver.h:127
std::vector< int > blockSizes
Definition: PmeSolver.h:236
PmeGrid pmeGrid
Definition: PmeSolver.h:175
bool doVirial
Definition: PmeSolver.h:262
int simulationStep
Definition: PmeSolver.h:177
std::vector< int > blockSizes
Definition: PmeSolver.h:208
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:207
int dataSize
Definition: PmeSolver.h:128
virtual ~PmePencilY()
Definition: PmeSolver.C:497
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:206
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:232
bool doVirial
Definition: PmeSolver.h:146
bool doVirial
Definition: PmeSolver.h:204
void initBlockSizes()
Definition: PmeSolver.C:448
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:238
virtual int procNum(int, const CkArrayIndex &idx)
Definition: PmeSolver.h:19
bool doEnergy
Definition: PmeSolver.h:232
PmeGrid pmeGrid
Definition: PmeSolver.h:261
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:532
PmePencilXY_SDAG_CODE PmePencilXY()
Definition: PmeSolver.C:276
virtual int procNum(int, const CkArrayIndex &idx)
Definition: PmeSolver.h:78
std::vector< int > blockSizes
Definition: PmeSolver.h:180
PmePencilXYZ_SDAG_CODE PmePencilXYZ()
Definition: PmeSolver.C:22
bool doEnergy
Definition: PmeSolver.h:146
Lattice lattice
Definition: PmeSolver.h:209
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:235
std::array< int, NUM_GRID_MAX > energyReady
Definition: PmeSolver.h:267
PmePencilZ_SDAG_CODE PmePencilZ()
Definition: PmeSolver.C:567
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:233
int numStrayAtoms
Definition: PmeSolver.h:270
PmePencilXYZMap(int pe)
Definition: PmeSolver.h:13
void skip()
Definition: PmeSolver.C:246
Lattice lattice
Definition: PmeSolver.h:237
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:234
unsigned int grid
Definition: PmeSolver.h:133
virtual ~PmePencilX()
Definition: PmeSolver.C:413
bool doVirial
Definition: PmeSolver.h:130
bool doEnergy
Definition: PmeSolver.h:204
Lattice lattice
Definition: PmeSolver.h:116
bool doEnergy
Definition: PmeSolver.h:176
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:265
void submitReductions(unsigned int iGrid)
Definition: PmeSolver.C:655
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:264
void initBlockSizes()
Definition: PmeSolver.C:632
int simulationStep
Definition: PmeSolver.h:205
Lattice lattice
Definition: PmeSolver.h:181
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:332
PmePencilY_SDAG_CODE PmePencilY()
Definition: PmeSolver.C:479
virtual ~PmePencilZ()
Definition: PmeSolver.C:589
PmeGrid pmeGrid
Definition: PmeSolver.h:231
PmeGrid pmeGrid
Definition: PmeSolver.h:203
Lattice lattice
Definition: PmeSolver.h:132
bool doEnergy
Definition: PmeSolver.h:113
int numStrayAtoms
Definition: PmeSolver.h:210
void skip()
Definition: PmeSolver.C:811