NAMD
CudaPmeSolver.h
Go to the documentation of this file.
1 #ifndef CUDAPMESOLVER_H
2 #define CUDAPMESOLVER_H
3 #include "PmeSolver.h"
4 #include "CudaPmeSolver.decl.h"
5 
6 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
7 class CudaPmeXYZInitMsg : public CMessage_CudaPmeXYZInitMsg {
8 public:
11 };
12 
13 class CudaPmeXYInitMsg : public CMessage_CudaPmeXYInitMsg {
14 public:
15  CudaPmeXYInitMsg(PmeGrid& pmeGrid, CProxy_CudaPmePencilXY& pmePencilXY, CProxy_CudaPmePencilZ& pmePencilZ,
16  CProxy_PmePencilXYMap& xyMap, CProxy_PmePencilXMap& zMap) :
19  CProxy_CudaPmePencilXY pmePencilXY;
20  CProxy_CudaPmePencilZ pmePencilZ;
21  CProxy_PmePencilXMap zMap;
22  CProxy_PmePencilXYMap xyMap;
23 };
24 
25 class CudaPmeXInitMsg : public CMessage_CudaPmeXInitMsg {
26 public:
28  CProxy_CudaPmePencilX& pmePencilX, CProxy_CudaPmePencilY& pmePencilY, CProxy_CudaPmePencilZ& pmePencilZ,
29  CProxy_PmePencilXMap& xMap, CProxy_PmePencilXMap& yMap, CProxy_PmePencilXMap& zMap) :
31  xMap(xMap), yMap(yMap), zMap(zMap) {}
33  CProxy_CudaPmePencilX pmePencilX;
34  CProxy_CudaPmePencilY pmePencilY;
35  CProxy_CudaPmePencilZ pmePencilZ;
36  CProxy_PmePencilXMap xMap;
37  CProxy_PmePencilXMap yMap;
38  CProxy_PmePencilXMap zMap;
39 };
40 
41 class InitDeviceMsg : public CMessage_InitDeviceMsg {
42 public:
43  InitDeviceMsg(CProxy_ComputePmeCUDADevice deviceProxy) : deviceProxy(deviceProxy) {}
44  CProxy_ComputePmeCUDADevice deviceProxy;
45 };
46 
47 class InitDeviceMsg2 : public CMessage_InitDeviceMsg2 {
48 public:
49  InitDeviceMsg2(int deviceID, cudaStream_t stream, CProxy_ComputePmeCUDAMgr mgrProxy, CProxy_ComputePmeCUDADevice deviceProxy) :
51  int deviceID;
52  cudaStream_t stream;
53  CProxy_ComputePmeCUDAMgr mgrProxy;
54  CProxy_ComputePmeCUDADevice deviceProxy;
55 };
56 
57 class CudaPmePencilXYZ : public CBase_CudaPmePencilXYZ {
58 public:
60  CudaPmePencilXYZ(CkMigrateMessage *m) {}
61  void initialize(CudaPmeXYZInitMsg *msg);
63  void energyAndVirialDone(unsigned int iGrid);
64 private:
65  void backwardDone();
66  CProxy_ComputePmeCUDADevice deviceProxy;
67 };
68 
69 // CHC: struct DeviceBuffer is not trivial but only standard-layout (I don't know whether this struct needs to be compatible with memcpy)
70 struct DeviceBuffer {
71  DeviceBuffer(int deviceID, bool isPeerDevice, std::array<float2*, NUM_GRID_MAX> dataGrid) : deviceID(deviceID), isPeerDevice(isPeerDevice), dataGrid(dataGrid) {}
73  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
74  dataGrid[iGrid] = NULL;
75  }
76  }
78  int deviceID;
79  cudaEvent_t event;
80  // adding std::array here should not affect its standard-layout
81  std::array<float2*, NUM_GRID_MAX> dataGrid;
82 };
83 
84 // The shallow copy constructor is intentionally used
85 class DeviceDataMsg : public CMessage_DeviceDataMsg {
86 public:
87  DeviceDataMsg(int i, cudaEvent_t event, std::array<float2*, NUM_GRID_MAX> dataGrid) : i(i), event(event), dataGrid(dataGrid) {}
88  DeviceDataMsg(int i, cudaEvent_t event) : i(i), event(event) {
89  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
90  dataGrid[iGrid] = NULL;
91  }
92  }
93  int i;
94  cudaEvent_t event;
95  // When copying, we only copy the pointer address itself, not the data
96  std::array<float2*, NUM_GRID_MAX> dataGrid;
97 };
98 
99 class CudaPmePencilXY : public CBase_CudaPmePencilXY {
100 public:
101  CudaPmePencilXY_SDAG_CODE
102  CudaPmePencilXY() : numGetDeviceBuffer(0), eventCreated(false) {}
103  CudaPmePencilXY(CkMigrateMessage *m) : numGetDeviceBuffer(0), eventCreated(false) {}
105  void initialize(CudaPmeXYInitMsg *msg);
106  void initializeDevice(InitDeviceMsg *msg);
107 private:
108  void forwardDone();
109  void backwardDone();
110  void recvDataFromZ(PmeBlockMsg *msg);
111  void start(const CkCallback &);
112  void setDeviceBuffers();
113  std::array<float2*, NUM_GRID_MAX> getData(const int i, const bool sameDevice);
114  int deviceID;
115  cudaStream_t stream;
116  cudaEvent_t event;
117  bool eventCreated;
118  int imsgZ;
119  int numDeviceBuffers;
120  int numGetDeviceBuffer;
121  std::vector<DeviceBuffer> deviceBuffers;
122  CProxy_ComputePmeCUDADevice deviceProxy;
123  CProxy_CudaPmePencilZ pmePencilZ;
124  CProxy_PmePencilXMap zMap;
125 };
126 
127 class CudaPmePencilX : public CBase_CudaPmePencilX {
128 public:
129  CudaPmePencilX_SDAG_CODE
130  CudaPmePencilX() : numGetDeviceBuffer(0), eventCreated(false) {}
131  CudaPmePencilX(CkMigrateMessage *m) : numGetDeviceBuffer(0), eventCreated(false) {}
132  ~CudaPmePencilX();
133  void initialize(CudaPmeXInitMsg *msg);
134  void initializeDevice(InitDeviceMsg *msg);
135 private:
136  void forwardDone();
137  void backwardDone();
138  void recvDataFromY(PmeBlockMsg *msg);
139  void start(const CkCallback &);
140  void setDeviceBuffers();
141  std::array<float2*, NUM_GRID_MAX> getData(const int i, const bool sameDevice);
142  int deviceID;
143  cudaStream_t stream;
144  cudaEvent_t event;
145  bool eventCreated;
146  int imsgY;
147  int numDeviceBuffers;
148  int numGetDeviceBuffer;
149  std::vector<DeviceBuffer> deviceBuffers;
150  CProxy_ComputePmeCUDADevice deviceProxy;
151  CProxy_CudaPmePencilY pmePencilY;
152  CProxy_PmePencilXMap yMap;
153 };
154 
155 class CudaPmePencilY : public CBase_CudaPmePencilY {
156 public:
157  CudaPmePencilY_SDAG_CODE
158  CudaPmePencilY() : numGetDeviceBufferZ(0), numGetDeviceBufferX(0), eventCreated(false) {}
159  CudaPmePencilY(CkMigrateMessage *m) : numGetDeviceBufferZ(0), numGetDeviceBufferX(0), eventCreated(false) {}
160  ~CudaPmePencilY();
161  void initialize(CudaPmeXInitMsg *msg);
162  void initializeDevice(InitDeviceMsg2 *msg);
163 private:
164  void forwardDone();
165  void backwardDone();
166  void recvDataFromX(PmeBlockMsg *msg);
167  void recvDataFromZ(PmeBlockMsg *msg);
168  void start(const CkCallback &);
169  void setDeviceBuffers();
170  std::array<float2*, NUM_GRID_MAX> getDataForX(const int i, const bool sameDevice);
171  std::array<float2*, NUM_GRID_MAX> getDataForZ(const int i, const bool sameDevice);
172  int deviceID;
173  cudaStream_t stream;
174  cudaEvent_t event;
175  bool eventCreated;
176  int imsgZ, imsgX;
177  int imsgZZ, imsgXX;
178  int numGetDeviceBufferZ;
179  int numGetDeviceBufferX;
180  int numDeviceBuffersZ;
181  int numDeviceBuffersX;
182  std::vector<DeviceBuffer> deviceBuffersZ;
183  std::vector<DeviceBuffer> deviceBuffersX;
184  CProxy_CudaPmePencilX pmePencilX;
185  CProxy_CudaPmePencilZ pmePencilZ;
186  CProxy_PmePencilXMap xMap;
187  CProxy_PmePencilXMap zMap;
188 };
189 
190 class CudaPmePencilZ : public CBase_CudaPmePencilZ {
191 public:
192  CudaPmePencilZ_SDAG_CODE
193  CudaPmePencilZ() : numGetDeviceBufferY(0), numGetDeviceBufferXY(0), eventCreated(false) {}
194  CudaPmePencilZ(CkMigrateMessage *m) : numGetDeviceBufferY(0), numGetDeviceBufferXY(0), eventCreated(false) {}
195  ~CudaPmePencilZ();
196  void initialize(CudaPmeXInitMsg *msg);
197  void initialize(CudaPmeXYInitMsg *msg);
198  void initializeDevice(InitDeviceMsg2 *msg);
199  void energyAndVirialDone(unsigned int iGrid);
200 private:
201  void backwardDone();
202  void recvDataFromY(PmeBlockMsg *msg);
203  void start(const CkCallback &);
204  void setDeviceBuffers();
205  std::array<float2*, NUM_GRID_MAX> getData(const int i, const bool sameDevice);
206  int deviceID;
207  cudaStream_t stream;
208  cudaEvent_t event;
209  bool eventCreated;
210  int imsgY;
211  int numDeviceBuffers;
212  int numGetDeviceBufferY;
213  std::vector<DeviceBuffer> deviceBuffers;
214  CProxy_CudaPmePencilY pmePencilY;
215  CProxy_PmePencilXMap yMap;
216 
217  bool useXYslab;
218  int numGetDeviceBufferXY;
219  CProxy_CudaPmePencilXY pmePencilXY;
220  CProxy_PmePencilXYMap xyMap;
221 };
222 
223 #endif // NAMD_CUDA
224 #endif //CUDAPMESOLVER_H
CProxy_PmePencilXMap zMap
Definition: CudaPmeSolver.h:21
void initialize(CudaPmeXInitMsg *msg)
void initialize(CudaPmeXYInitMsg *msg)
Definition: CudaPmeSolver.C:70
CudaPmePencilXYZ(CkMigrateMessage *m)
Definition: CudaPmeSolver.h:60
DeviceDataMsg(int i, cudaEvent_t event)
Definition: CudaPmeSolver.h:88
DeviceDataMsg(int i, cudaEvent_t event, std::array< float2 *, NUM_GRID_MAX > dataGrid)
Definition: CudaPmeSolver.h:87
CProxy_PmePencilXYMap xyMap
Definition: CudaPmeSolver.h:22
CProxy_ComputePmeCUDADevice deviceProxy
Definition: CudaPmeSolver.h:54
CudaPmePencilZ_SDAG_CODE CudaPmePencilZ()
CProxy_CudaPmePencilZ pmePencilZ
Definition: CudaPmeSolver.h:35
DeviceBuffer(int deviceID, bool isPeerDevice, std::array< float2 *, NUM_GRID_MAX > dataGrid)
Definition: CudaPmeSolver.h:71
CudaPmePencilX_SDAG_CODE CudaPmePencilX()
CProxy_PmePencilXMap xMap
Definition: CudaPmeSolver.h:36
void energyAndVirialDone(unsigned int iGrid)
CProxy_CudaPmePencilX pmePencilX
Definition: CudaPmeSolver.h:33
const unsigned int NUM_GRID_MAX
Definition: PmeSolverUtil.h:9
void initializeDevice(InitDeviceMsg2 *msg)
CProxy_ComputePmeCUDADevice deviceProxy
Definition: CudaPmeSolver.h:44
void initialize(CudaPmeXInitMsg *msg)
CudaPmeXYInitMsg(PmeGrid &pmeGrid, CProxy_CudaPmePencilXY &pmePencilXY, CProxy_CudaPmePencilZ &pmePencilZ, CProxy_PmePencilXYMap &xyMap, CProxy_PmePencilXMap &zMap)
Definition: CudaPmeSolver.h:15
CudaPmePencilXY(CkMigrateMessage *m)
cudaEvent_t event
Definition: CudaPmeSolver.h:94
void initializeDevice(InitDeviceMsg *msg)
Definition: CudaPmeSolver.C:87
CProxy_PmePencilXMap zMap
Definition: CudaPmeSolver.h:38
void initializeDevice(InitDeviceMsg *msg)
InitDeviceMsg2(int deviceID, cudaStream_t stream, CProxy_ComputePmeCUDAMgr mgrProxy, CProxy_ComputePmeCUDADevice deviceProxy)
Definition: CudaPmeSolver.h:49
CudaPmePencilY_SDAG_CODE CudaPmePencilY()
InitDeviceMsg(CProxy_ComputePmeCUDADevice deviceProxy)
Definition: CudaPmeSolver.h:43
DeviceBuffer(int deviceID, bool isPeerDevice)
Definition: CudaPmeSolver.h:72
void initializeDevice(InitDeviceMsg2 *msg)
CProxy_CudaPmePencilZ pmePencilZ
Definition: CudaPmeSolver.h:20
void energyAndVirialDone(unsigned int iGrid)
Definition: CudaPmeSolver.C:61
CudaPmePencilY(CkMigrateMessage *m)
cudaStream_t stream
Definition: CudaPmeSolver.h:52
void initialize(CudaPmeXYZInitMsg *msg)
Definition: CudaPmeSolver.C:18
CProxy_CudaPmePencilY pmePencilY
Definition: CudaPmeSolver.h:34
void initialize(CudaPmeXInitMsg *msg)
void initializeDevice(InitDeviceMsg *msg)
Definition: CudaPmeSolver.C:26
CProxy_CudaPmePencilXY pmePencilXY
Definition: CudaPmeSolver.h:19
CProxy_ComputePmeCUDAMgr mgrProxy
Definition: CudaPmeSolver.h:53
CudaPmePencilX(CkMigrateMessage *m)
std::array< float2 *, NUM_GRID_MAX > dataGrid
Definition: CudaPmeSolver.h:81
CudaPmeXInitMsg(PmeGrid &pmeGrid, CProxy_CudaPmePencilX &pmePencilX, CProxy_CudaPmePencilY &pmePencilY, CProxy_CudaPmePencilZ &pmePencilZ, CProxy_PmePencilXMap &xMap, CProxy_PmePencilXMap &yMap, CProxy_PmePencilXMap &zMap)
Definition: CudaPmeSolver.h:27
std::array< float2 *, NUM_GRID_MAX > dataGrid
Definition: CudaPmeSolver.h:96
cudaEvent_t event
Definition: CudaPmeSolver.h:79
CudaPmeXYZInitMsg(PmeGrid &pmeGrid)
Definition: CudaPmeSolver.h:9
CudaPmePencilXY_SDAG_CODE CudaPmePencilXY()
CProxy_PmePencilXMap yMap
Definition: CudaPmeSolver.h:37
CudaPmePencilZ(CkMigrateMessage *m)