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 
56 namespace CudaGlobalMaster {
57  inline namespace CUDAGM_NS {
59  }
60 }
61 namespace dlloader {
62  template <typename T>
63  class DLLoader;
64 };
65 
66 class ComputeMgr : public CBase_ComputeMgr
67 {
68 public:
69 
70  ComputeMgr();
71  ~ComputeMgr();
72  void createComputes(ComputeMap *map);
73  void updateComputes(int,CkGroupID);
74  void updateComputes2(CkQdMsg *);
75  void updateComputes3();
76  void splitComputes();
77  void splitComputes2(CkQdMsg *);
78  void updateLocalComputes();
79  void updateLocalComputes2(CkQdMsg *);
80  void updateLocalComputes3();
81  void updateLocalComputes4(CkQdMsg *);
82  void updateLocalComputes5();
84 
85  void sendComputeGlobalConfig(ComputeGlobalConfigMsg *);
86  void recvComputeGlobalConfig(ComputeGlobalConfigMsg *);
92 
97 
102 
104 
105  void recvCudaGlobalMasterCreateMsg(std::vector<std::string> args);
106  void recvCudaGlobalMasterRemoveMsg(std::vector<std::string> args);
107  void recvCudaGlobalMasterUpdateMsg(std::vector<std::string> args);
109  int tcl_error_code, std::vector<std::string> args);
110  std::string getCudaGlobalMasterUpdateResultString(const std::string& client_name) const;
111  int getCudaGlobalMasterUpdateResult(const std::string& client_name) const;
112 #ifdef NODEGROUP_FORCE_REGISTER
113 
114  CthThread stowedThread;
115  std::atomic<int> *suspendCounter;
116 
117  void wakeStowedULTs(GMWakeMsg *m)
118  {
119  // CkPrintf("[%d] wakey thread %d\n",CkMyPe(),CthGetToken(stowedThread)->serialNo);
120  if(CkMyPe()!=m->senderPe)
121  CthAwaken(stowedThread);
122  }
123 
124  void wakeStowedULT()
125  {
126  // CkPrintf("[%d] wakey thread %d\n",CkMyPe(),CthGetToken(stowedThread)->serialNo);
127  CthAwaken(stowedThread);
128  }
129 
131  void stowSuspendULT()
132  {
133  // CkPrintf("[%d] stowSuspend thread %d\n",CkMyPe(),CthGetToken(CthSelf())->serialNo);
134  stowedThread=CthSelf();
135  // last one here wakes everyone up
136  // the fetch_sub gives us the result before the decrement
137  if(suspendCounter->fetch_sub(1)==1)
138  {
139  awakenStowedULTs();
140  }
141  else
142  {
143  // CkPrintf("[%d] size suspendCounter %d:%d\n",CkMyPe(), suspendCounter->load(), CmiMyNodeSize());
144  CthSuspend();
145  }
146  }
147 
149  void awakenStowedULTs()
150  {
151  // CkPrintf("[%d] awakenStowedULTs at counter %d\n",CkMyPe(), suspendCounter->load());
152  int size=CmiMyNodeSize();
153  GMWakeMsg* wakeUp= new GMWakeMsg(CkMyPe());
154  suspendCounter->store(size);
155  thisProxy.wakeStowedULTs(wakeUp);
156  }
157 
158 #endif
159  // Made public in order to access the ComputeGlobal on the node
160  ComputeGlobal *computeGlobalObject; /* node part of global computes */
164  CkCallback callMeBackCB;
165 
166  void sendYieldDevice(int pe);
167  void recvYieldDevice(int pe);
168 
169 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
170  void sendAssignPatchesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
172  void sendSkipPatchesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
174  void sendFinishPatchesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
176  void sendFinishPatchOnPe(int pe, CudaComputeNonbonded* c, int i, PatchID patchID);
178  void sendOpenBoxesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
184  void sendLaunchWork(int pe, CudaComputeNonbonded* c);
186  void sendUnregisterBoxesOnPe(std::vector<int>& pes, CudaComputeNonbonded* c);
188 #ifdef BONDED_CUDA
189  void sendAssignPatchesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
190  void recvAssignPatchesOnPe(ComputeBondedCUDAMsg *msg);
191  void sendMessageEnqueueWork(int pe, ComputeBondedCUDA* c);
192  void recvMessageEnqueueWork(ComputeBondedCUDAMsg *msg);
193  void sendOpenBoxesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
194  void recvOpenBoxesOnPe(ComputeBondedCUDAMsg *msg);
195  void sendLoadTuplesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
196  void recvLoadTuplesOnPe(ComputeBondedCUDAMsg *msg);
197  void sendLaunchWork(int pe, ComputeBondedCUDA* c);
198  void recvLaunchWork(ComputeBondedCUDAMsg *msg);
199  void sendFinishPatchesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
200  void recvFinishPatchesOnPe(ComputeBondedCUDAMsg *msg);
201  void sendFinishReductions(int pe, ComputeBondedCUDA* c);
202  void recvFinishReductions(ComputeBondedCUDAMsg *msg);
203  void sendUnregisterBoxesOnPe(std::vector<int>& pes, ComputeBondedCUDA* c);
204  void recvUnregisterBoxesOnPe(ComputeBondedCUDAMsg *msg);
205 #endif
206 #endif
207 
208 private:
209  void createCompute(ComputeID, ComputeMap *);
210 
211  GlobalMasterServer *masterServerObject; /* master part of global computes */
212  ComputeDPME *computeDPMEObject;
213 
214  ComputeEwald *computeEwaldObject;
215 
216  ComputeNonbondedWorkArrays *computeNonbondedWorkArrays;
217 
218  int skipSplitting;
219  int updateComputesCount;
220  int updateComputesReturnEP;
221  CkGroupID updateComputesReturnChareID;
222 
223  ResizeArray<int> computeFlag;
224 
225  std::vector<std::shared_ptr<dlloader::DLLoader<CudaGlobalMaster::CudaGlobalMasterClient>>> CudaGlobalMasterClientDlloaders;
226  std::map<std::string, std::string> CudaGlobalMasterClientUpdateResultStrings;
227  std::map<std::string, int> CudaGlobalMasterClientUpdateResults;
228 };
229 
230 #endif /* COMPUTEMGR_H */
231 
void recvComputeEwaldData(ComputeEwaldMsg *)
Definition: ComputeMgr.C:1470
void updateLocalComputes()
Definition: ComputeMgr.C:215
void sendYieldDevice(int pe)
Definition: ComputeMgr.C:1768
A class for performing calculations on specific atoms selected by atom serial numbers.
void recvComputeDPMEResults(ComputeDPMEResultsMsg *)
Definition: ComputeMgr.C:1525
void updateLocalComputes5()
Definition: ComputeMgr.C:316
int32 ComputeID
Definition: NamdTypes.h:288
void recvFinishPatchOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1833
void sendMessageEnqueueWork(int pe, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1863
GMWakeMsg(int pe)
Definition: ComputeMgr.h:52
void sendFinishReductions(int pe, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1852
std::string getCudaGlobalMasterUpdateResultString(const std::string &client_name) const
Definition: ComputeMgr.C:1764
void recvComputeConsForceMsg(ComputeConsForceMsg *)
Definition: ComputeMgr.C:1544
void updateLocalComputes3()
Definition: ComputeMgr.C:266
int getCudaGlobalMasterUpdateResult(const std::string &client_name) const
Definition: ComputeMgr.C:1760
void recvMessageEnqueueWork(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1869
void createComputes(ComputeMap *map)
Definition: ComputeMgr.C:1037
void recvLaunchWork(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1880
int computeGlobalResultsMsgSeq
Definition: ComputeMgr.h:162
void updateLocalComputes2(CkQdMsg *)
Definition: ComputeMgr.C:259
void recvAssignPatchesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1793
void doneUpdateLocalComputes()
Definition: ComputeMgr.C:348
void recvCudaGlobalMasterRemoveMsg(std::vector< std::string > args)
Definition: ComputeMgr.C:1648
void recvComputeGlobalConfig(ComputeGlobalConfigMsg *)
int computeGlobalResultsMsgMasterSeq
Definition: ComputeMgr.h:163
void sendComputeEwaldData(ComputeEwaldMsg *)
Definition: ComputeMgr.C:1454
void sendLaunchWork(int pe, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1874
void recvYieldDevice(int pe)
Definition: ComputeMgr.C:1773
void sendComputeGlobalResults(ComputeGlobalResultsMsg *)
Definition: ComputeMgr.C:1369
void sendUnregisterBoxesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1885
void sendFinishPatchesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1811
void recvFinishReductions(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1858
void updateLocalComputes4(CkQdMsg *)
Definition: ComputeMgr.C:298
void recvFinishPatchesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1820
void enableComputeGlobalResults()
Definition: ComputeMgr.C:1407
void recvComputeGlobalResults(ComputeGlobalResultsMsg *)
Definition: ComputeMgr.C:1424
ResizeArray< ComputeGlobalResultsMsg * > computeGlobalResultsMsgs
Definition: ComputeMgr.h:161
void recvComputeDPMEData(ComputeDPMEDataMsg *)
Definition: ComputeMgr.C:1507
void splitComputes()
Definition: ComputeMgr.C:175
ComputeGlobal * computeGlobalObject
Definition: ComputeMgr.h:160
void recvComputeEwaldResults(ComputeEwaldMsg *)
Definition: ComputeMgr.C:1482
void sendComputeDPMEData(ComputeDPMEDataMsg *)
Definition: ComputeMgr.C:1493
void recvComputeGlobalData(ComputeGlobalDataMsg *)
Definition: ComputeMgr.C:1357
void sendComputeDPMEResults(ComputeDPMEResultsMsg *, int)
Definition: ComputeMgr.C:1519
int senderPe
Definition: ComputeMgr.h:51
#define CUDAGM_NS
Definition: common.h:280
void updateComputes2(CkQdMsg *)
Definition: ComputeMgr.C:156
void recvOpenBoxesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1847
void recvUnregisterBoxesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1893
void sendComputeGlobalConfig(ComputeGlobalConfigMsg *)
void recvCudaGlobalMasterCreateMsg(std::vector< std::string > args)
Definition: ComputeMgr.C:1579
void recvSkipPatchesOnPe(CudaComputeNonbondedMsg *msg)
Definition: ComputeMgr.C:1806
void recvCudaGlobalMasterUpdateResultMsg(int tcl_error_code, std::vector< std::string > args)
Definition: ComputeMgr.C:1746
void sendComputeGlobalData(ComputeGlobalDataMsg *)
Definition: ComputeMgr.C:1294
void sendOpenBoxesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1838
void updateComputes3()
Definition: ComputeMgr.C:165
void sendFinishPatchOnPe(int pe, CudaComputeNonbonded *c, int i, PatchID patchID)
Definition: ComputeMgr.C:1825
CkCallback callMeBackCB
Definition: ComputeMgr.h:164
void recvCudaGlobalMasterUpdateMsg(std::vector< std::string > args)
Definition: ComputeMgr.C:1692
int32 PatchID
Definition: NamdTypes.h:287
void updateComputes(int, CkGroupID)
Definition: ComputeMgr.C:142
void sendComputeEwaldResults(ComputeEwaldMsg *)
Definition: ComputeMgr.C:1477
void sendAssignPatchesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1785
void splitComputes2(CkQdMsg *)
Definition: ComputeMgr.C:209
void sendSkipPatchesOnPe(std::vector< int > &pes, CudaComputeNonbonded *c)
Definition: ComputeMgr.C:1798