NAMD
ComputeMgr.h
Go to the documentation of this file.
1 
7 #ifndef COMPUTEMGR_H
8 #define COMPUTEMGR_H
9 
10 #include "charm++.h"
11 #include "main.h"
12 #include <new>
13 
14 #include "NamdTypes.h"
15 #include "BOCgroup.h"
16 
17 #include "ResizeArray.h"
18 
19 #include "GlobalMaster.h"
20 #include "GlobalMasterServer.h"
21 #include "ComputeMgr.decl.h"
22 
23 class Compute;
24 class ComputeMap;
25 class CkQdMsg;
26 
27 class ComputeGlobal;
28 class ComputeGlobalConfigMsg;
31 
32 class ComputeDPME;
33 class ComputeDPMEDataMsg;
36 
37 class ComputeEwald;
38 class ComputeEwaldMsg;
39 
40 class FinishWorkMsg;
41 
43 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
45 #ifdef BONDED_CUDA
46 class ComputeBondedCUDA;
47 #endif
48 #endif
49 class GMWakeMsg : public CMessage_GMWakeMsg{
50 public:
51  int senderPe;
52  GMWakeMsg(int pe): senderPe(pe)
53  {}
54 };
55 
57 namespace dlloader {
58  template <typename T>
59  class DLLoader;
60 };
61 
62 class ComputeMgr : public CBase_ComputeMgr
63 {
64 public:
65 
66  ComputeMgr();
67  ~ComputeMgr();
68  void createComputes(ComputeMap *map);
69  void updateComputes(int,CkGroupID);
70  void updateComputes2(CkQdMsg *);
71  void updateComputes3();
72  void splitComputes();
73  void splitComputes2(CkQdMsg *);
74  void updateLocalComputes();
75  void updateLocalComputes2(CkQdMsg *);
76  void updateLocalComputes3();
77  void updateLocalComputes4(CkQdMsg *);
78  void updateLocalComputes5();
80 
81  void sendComputeGlobalConfig(ComputeGlobalConfigMsg *);
82  void recvComputeGlobalConfig(ComputeGlobalConfigMsg *);
88 
93 
98 
100 
101  void recvCudaGlobalMasterCreateMsg(std::vector<std::string> args);
102  void recvCudaGlobalMasterRemoveMsg(std::vector<std::string> args);
103  void recvCudaGlobalMasterUpdateMsg(std::vector<std::string> args);
104  void recvCudaGlobalMasterUpdateResultMsg(std::vector<std::string> args);
105  std::string getCudaGlobalMasterUpdateResult(const std::string& client_name) const;
106 #ifdef NODEGROUP_FORCE_REGISTER
107 
108  CthThread stowedThread;
109  std::atomic<int> *suspendCounter;
110 
111  void wakeStowedULTs(GMWakeMsg *m)
112  {
113  // CkPrintf("[%d] wakey thread %d\n",CkMyPe(),CthGetToken(stowedThread)->serialNo);
114  if(CkMyPe()!=m->senderPe)
115  CthAwaken(stowedThread);
116  }
117 
118  void wakeStowedULT()
119  {
120  // CkPrintf("[%d] wakey thread %d\n",CkMyPe(),CthGetToken(stowedThread)->serialNo);
121  CthAwaken(stowedThread);
122  }
123 
125  void stowSuspendULT()
126  {
127  // CkPrintf("[%d] stowSuspend thread %d\n",CkMyPe(),CthGetToken(CthSelf())->serialNo);
128  stowedThread=CthSelf();
129  // last one here wakes everyone up
130  // the fetch_sub gives us the result before the decrement
131  if(suspendCounter->fetch_sub(1)==1)
132  {
133  awakenStowedULTs();
134  }
135  else
136  {
137  // CkPrintf("[%d] size suspendCounter %d:%d\n",CkMyPe(), suspendCounter->load(), CmiMyNodeSize());
138  CthSuspend();
139  }
140  }
141 
143  void awakenStowedULTs()
144  {
145  // CkPrintf("[%d] awakenStowedULTs at counter %d\n",CkMyPe(), suspendCounter->load());
146  int size=CmiMyNodeSize();
147  GMWakeMsg* wakeUp= new GMWakeMsg(CkMyPe());
148  suspendCounter->store(size);
149  thisProxy.wakeStowedULTs(wakeUp);
150  }
151 
152 #endif
153  // Made public in order to access the ComputeGlobal on the node
154  ComputeGlobal *computeGlobalObject; /* node part of global computes */
158  CkCallback callMeBackCB;
159 
160  void sendYieldDevice(int pe);
161  void recvYieldDevice(int pe);
162 
163 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
164  void sendAssignPatchesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
166  void sendSkipPatchesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
168  void sendFinishPatchesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
170  void sendFinishPatchOnPe(int pe, CudaComputeNonbonded* c, int i, PatchID patchID);
172  void sendOpenBoxesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
178  void sendLaunchWork(int pe, CudaComputeNonbonded* c);
180  void sendUnregisterBoxesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
182 #ifdef BONDED_CUDA
183  void sendAssignPatchesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
184  void recvAssignPatchesOnPe(ComputeBondedCUDAMsg *msg);
185  void sendMessageEnqueueWork(int pe, ComputeBondedCUDA* c);
186  void recvMessageEnqueueWork(ComputeBondedCUDAMsg *msg);
187  void sendOpenBoxesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
188  void recvOpenBoxesOnPe(ComputeBondedCUDAMsg *msg);
189  void sendLoadTuplesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
190  void recvLoadTuplesOnPe(ComputeBondedCUDAMsg *msg);
191  void sendLaunchWork(int pe, ComputeBondedCUDA* c);
192  void recvLaunchWork(ComputeBondedCUDAMsg *msg);
193  void sendFinishPatchesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
194  void recvFinishPatchesOnPe(ComputeBondedCUDAMsg *msg);
195  void sendFinishReductions(int pe, ComputeBondedCUDA* c);
196  void recvFinishReductions(ComputeBondedCUDAMsg *msg);
197  void sendUnregisterBoxesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
198  void recvUnregisterBoxesOnPe(ComputeBondedCUDAMsg *msg);
199 #endif
200 #endif
201 
202 private:
203  void createCompute(ComputeID, ComputeMap *);
204 
205  GlobalMasterServer *masterServerObject; /* master part of global computes */
206  ComputeDPME *computeDPMEObject;
207 
208  ComputeEwald *computeEwaldObject;
209 
210  ComputeNonbondedWorkArrays *computeNonbondedWorkArrays;
211 
212  int skipSplitting;
213  int updateComputesCount;
214  int updateComputesReturnEP;
215  CkGroupID updateComputesReturnChareID;
216 
217  ResizeArray<int> computeFlag;
218 
219  std::vector<std::shared_ptr<dlloader::DLLoader<CudaGlobalMasterClient>>> CudaGlobalMasterClientDlloaders;
220  std::map<std::string, std::string> CudaGlobalMasterClientUpdateResults;
221 };
222 
223 #endif /* COMPUTEMGR_H */
224 
void recvComputeEwaldData(ComputeEwaldMsg *)
Definition: ComputeMgr.C:1376
void updateLocalComputes()
Definition: ComputeMgr.C:213
void sendYieldDevice(int pe)
Definition: ComputeMgr.C:1664
void recvComputeDPMEResults(ComputeDPMEResultsMsg *)
Definition: ComputeMgr.C:1431
void recvCudaGlobalMasterUpdateResultMsg(std::vector< std::string > args)
Definition: ComputeMgr.C:1647
void updateLocalComputes5()
Definition: ComputeMgr.C:314
int32 ComputeID
Definition: NamdTypes.h:278
void recvFinishPatchOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1729
void sendMessageEnqueueWork(int pe, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1759
GMWakeMsg(int pe)
Definition: ComputeMgr.h:52
void sendFinishReductions(int pe, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1748
void recvComputeConsForceMsg(ComputeConsForceMsg *)
Definition: ComputeMgr.C:1450
A class for performing calculations on specific atoms selected by atom serial numbers.
void updateLocalComputes3()
Definition: ComputeMgr.C:264
void recvMessageEnqueueWork(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1765
std::string getCudaGlobalMasterUpdateResult(const std::string &client_name) const
Definition: ComputeMgr.C:1660
void createComputes(ComputeMap *map)
Definition: ComputeMgr.C:973
void recvLaunchWork(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1776
int computeGlobalResultsMsgSeq
Definition: ComputeMgr.h:156
void updateLocalComputes2(CkQdMsg *)
Definition: ComputeMgr.C:257
void recvAssignPatchesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1689
void doneUpdateLocalComputes()
Definition: ComputeMgr.C:346
void recvCudaGlobalMasterRemoveMsg(std::vector< std::string > args)
Definition: ComputeMgr.C:1554
void recvComputeGlobalConfig(ComputeGlobalConfigMsg *)
int computeGlobalResultsMsgMasterSeq
Definition: ComputeMgr.h:157
void sendComputeEwaldData(ComputeEwaldMsg *)
Definition: ComputeMgr.C:1360
void sendLaunchWork(int pe, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1770
void recvYieldDevice(int pe)
Definition: ComputeMgr.C:1669
void sendComputeGlobalResults(ComputeGlobalResultsMsg *)
Definition: ComputeMgr.C:1275
void sendUnregisterBoxesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1781
void sendFinishPatchesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1707
void recvFinishReductions(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1754
void updateLocalComputes4(CkQdMsg *)
Definition: ComputeMgr.C:296
void recvFinishPatchesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1716
void enableComputeGlobalResults()
Definition: ComputeMgr.C:1313
void recvComputeGlobalResults(ComputeGlobalResultsMsg *)
Definition: ComputeMgr.C:1330
ResizeArray< ComputeGlobalResultsMsg * > computeGlobalResultsMsgs
Definition: ComputeMgr.h:155
void recvComputeDPMEData(ComputeDPMEDataMsg *)
Definition: ComputeMgr.C:1413
void splitComputes()
Definition: ComputeMgr.C:173
ComputeGlobal * computeGlobalObject
Definition: ComputeMgr.h:154
void recvComputeEwaldResults(ComputeEwaldMsg *)
Definition: ComputeMgr.C:1388
void sendComputeDPMEData(ComputeDPMEDataMsg *)
Definition: ComputeMgr.C:1399
void recvComputeGlobalData(ComputeGlobalDataMsg *)
Definition: ComputeMgr.C:1263
void sendComputeDPMEResults(ComputeDPMEResultsMsg *, int)
Definition: ComputeMgr.C:1425
int senderPe
Definition: ComputeMgr.h:51
void updateComputes2(CkQdMsg *)
Definition: ComputeMgr.C:154
void recvOpenBoxesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1743
void recvUnregisterBoxesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1789
void sendComputeGlobalConfig(ComputeGlobalConfigMsg *)
void recvCudaGlobalMasterCreateMsg(std::vector< std::string > args)
Definition: ComputeMgr.C:1485
void recvSkipPatchesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1702
void sendComputeGlobalData(ComputeGlobalDataMsg *)
Definition: ComputeMgr.C:1200
void sendOpenBoxesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1734
void updateComputes3()
Definition: ComputeMgr.C:163
void sendFinishPatchOnPe(int pe, CudaComputeNonbonded *c, int i, PatchID patchID)
Definition: ComputeMgr.C:1721
CkCallback callMeBackCB
Definition: ComputeMgr.h:158
void recvCudaGlobalMasterUpdateMsg(std::vector< std::string > args)
Definition: ComputeMgr.C:1598
int32 PatchID
Definition: NamdTypes.h:277
void updateComputes(int, CkGroupID)
Definition: ComputeMgr.C:140
void sendComputeEwaldResults(ComputeEwaldMsg *)
Definition: ComputeMgr.C:1383
void sendAssignPatchesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1681
void splitComputes2(CkQdMsg *)
Definition: ComputeMgr.C:207
void sendSkipPatchesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1694