NAMD
BackEnd.C
Go to the documentation of this file.
1 
7 #include "BackEnd.h"
8 #include "ProcessorPrivate.h"
9 #include "common.h"
10 #include "Node.h"
11 #include "memusage.h"
12 
13 #include <new>
14 #if defined(WIN32) && !defined(__CYGWIN__)
15 #include <new.h>
16 #endif
17 
18 #include "Lattice.h"
19 #include "ComputeMoa.h"
20 #include "ComputeMsmMsa.h" // needed for MsmMsaData definition
21 #include "main.decl.h"
22 #include "main.h"
23 #include "BOCgroup.h"
24 #include "WorkDistrib.decl.h"
25 #include "ProxyMgr.decl.h"
26 #include "PatchMgr.decl.h"
27 #include "DataExchanger.decl.h"
28 #ifdef CHARM_HAS_MSA
29 #include "ComputeMgr.decl.h"
30 #endif
31 #include "ReductionMgr.decl.h"
32 #include "CollectionMgr.decl.h"
33 #include "CollectionMaster.decl.h"
34 #include "CollectionMgr.h"
35 #include "CollectionMaster.h"
36 #include "BroadcastMgr.decl.h"
37 #include "LdbCoordinator.decl.h"
38 #include "Sync.decl.h"
39 #include "PatchData.decl.h"
40 #include "GlobalGPUMgr.decl.h"
41 #include "SynchronousCollectives.decl.h"
42 
43 #ifdef MEM_OPT_VERSION
44 #include "ParallelIOMgr.decl.h"
45 #endif
46 
47 #ifdef NAMD_TCL
48 #include <tcl.h>
49 #endif
50 
51 extern void _initCharm(int, char**);
52 
55 
56 CkpvStaticDeclare(int,exitSchedHndlr);
57 
58 extern "C" void exit_sched(void* msg)
59 {
60  // CmiPrintf("Exiting scheduler on %d\n",CmiMyPe());
61  CsdExitScheduler();
62 }
63 
64 static void register_exit_sched(void)
65 {
66  CkpvInitialize(int,exitSchedHndlr);
67  CkpvAccess(exitSchedHndlr) = CmiRegisterHandler((CmiHandler)exit_sched);
68 }
69 
71 {
72  void* msg = CmiAlloc(CmiMsgHeaderSizeBytes);
73  CmiSetHandler(msg,CkpvAccess(exitSchedHndlr));
74  CmiSyncSendAndFree(pe,CmiMsgHeaderSizeBytes,(char *)msg);
75 }
76 
77 #if defined(WIN32) && !defined(__CYGWIN__) && !defined(__MINGW_H)
78 int NAMD_new_handler(size_t) {
79 #else
81 #endif
82  char tmp[100];
83  sprintf(tmp,"Memory allocation failed on processor %d.",CmiMyPe());
84  NAMD_die(tmp);
85 #if defined(WIN32) && !defined(__CYGWIN__) && !defined(__MINGW_H)
86  return 0;
87 #endif
88 }
89 
90 void topo_getargs(char**);
91 void cuda_getargs(char**);
92 // void cuda_initialize();
94 void mic_getargs(char**);
95 // void mic_initialize();
96 #ifdef NAMD_AVXTILES
97 // For "+notiles" commandline option to disable "Tiles" algorithm
98 int avxTilesCommandLineDisable = 0;
99 #endif
100 
101 // called on all procs
102 void all_init(int argc, char **argv)
103 {
104 #if defined(WIN32) && !defined(__CYGWIN__) && !defined(__MINGW_H)
105  _set_new_handler(NAMD_new_handler);
106 #else
107  std::set_new_handler(NAMD_new_handler);
108 #endif
111  CmiGetArgFlag(argv, "+idlepoll"); // remove +idlepoll if it's still there
112  topo_getargs(argv);
113 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
114  cuda_getargs(argv);
115  argc = CmiGetArgc(argv);
116 #endif
117 #ifdef NAMD_MIC
118  CmiGetArgFlag(argv, "+idlepoll"); // remove +idlepoll if it's still there
119  mic_getargs(argv);
120  argc = CmiGetArgc(argv);
121 #endif
122 #ifdef NAMD_AVXTILES
123  avxTilesCommandLineDisable = CmiGetArgFlag(argv, "+notiles");
124 #endif
125 
126 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
127  // launch CUDA runtime threads before affinity is set by _initCharm
128  // _initCharm contains a node barrier so there is no race here
129  if(CmiMyRank()==0){
131  }
132 #endif
133 
134  _initCharm(argc, argv); // message main Chare
135 
136 //#if 0 // moved to WorkDistrib
137 //#ifdef NAMD_CUDA
138 // if ( CkMyPe() < CkNumPes() ) cuda_initialize();
139 //#endif
140 //#ifdef NAMD_MIC
141 // if ( CkMyPe() < CkNumPes() ) mic_initialize();
142 //#endif
143 //#endif
144 }
145 
146 extern void after_backend_init(int argc, char **argv);
147 void master_init(int argc, char **argv);
148 
149 // called on slave procs
150 void slave_init(int argc, char **argv)
151 {
152 #if CMK_SMP
153  //the original main thread could now be a comm thread
154  //and a slave thread could now be the main thread,
155  //so we have to do the master initialization here
156  if(CmiMyRank()==0){
157  master_init(argc, argv);
158  if(CmiMyPe()==0)
159  after_backend_init(argc, argv);
160  return;
161  }
162 #endif
163 
164  all_init(argc, argv);
165 
166  if (CkMyRank() < CkMyNodeSize()) // skip the communication thread
167  CsdScheduler(-1);
168 }
169 
170 void master_init(int argc, char **argv){
171  cpuTime_start = CmiCpuTimer();
172  wallTime_start = CmiWallTimer();
173  if ( CmiMyPe() ) {
174  all_init(argc, argv);
175  CsdScheduler(-1);
176  ConverseExit(); // should never return
177  }
178 
179  all_init(argc, argv);
180 
181  // Create branch-office chares
182  BOCgroup group;
183  group.workDistrib = CProxy_WorkDistrib::ckNew();
184  group.proxyMgr = CProxy_ProxyMgr::ckNew();
185  group.patchMgr = CProxy_PatchMgr::ckNew();
186  group.computeMgr = CProxy_ComputeMgr::ckNew();
187  group.reductionMgr = CProxy_ReductionMgr::ckNew();
188  // group.computePmeMgr set in constructor during startup
189  group.nodePmeMgr = CProxy_NodePmeMgr::ckNew();
190 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
191  group.patchData = CProxy_PatchData::ckNew();
192  group.computePmeCUDAMgr = CProxy_ComputePmeCUDAMgr::ckNew();
193  group.computeCUDAMgr = CProxy_ComputeCUDAMgr::ckNew();
194 #endif
195 #ifdef OPENATOM_VERSION
196  group.computeMoaMgr = CProxy_ComputeMoaMgr::ckNew();
197 #endif // OPENATOM_VERSION
198  group.computeExtMgr = CProxy_ComputeExtMgr::ckNew();
199  group.computeQMMgr = CProxy_ComputeQMMgr::ckNew();
200  group.computeGBISserMgr = CProxy_ComputeGBISserMgr::ckNew();
201  group.computeFmmSerialMgr = CProxy_ComputeFmmSerialMgr::ckNew();
202  group.computeMsmSerialMgr = CProxy_ComputeMsmSerialMgr::ckNew();
203  group.computeLjPmeSerialMgr = CProxy_ComputeLjPmeSerialMgr::ckNew();
204 #ifdef CHARM_HAS_MSA
205  group.computeMsmMsaMgr = CProxy_ComputeMsmMsaMgr::ckNew();
206 #endif
207  group.computeMsmMgr = CProxy_ComputeMsmMgr::ckNew();
208  // Charm CkMulticast library module
209  group.multicastMgr = CProxy_CkMulticastMgr::ckNew();
210 #ifdef MEM_OPT_VERSION
211  group.ioMgr=CProxy_ParallelIOMgr::ckNew();
212 #endif
213 
214  group.sync = CProxy_Sync::ckNew();
215 
216  #ifdef USE_NODEPATCHMGR
217  group.nodeProxyMgr = CProxy_NodeProxyMgr::ckNew();
218  #endif
219 
220 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
221  group.globalGPUMgr = CProxy_GlobalGPUMgr::ckNew();
222  group.synchronousCollectives = CProxy_SynchronousCollectives::ckNew();
223 #endif
224 
225 #if CMK_SMP && USE_CKLOOP
226  group.ckLoop = CkLoop_Init();
227 #endif
228 
229  CkChareID collectionMaster = CProxy_CollectionMaster::ckNew(0);
230  SlaveInitMsg *initmsg7 = new SlaveInitMsg;
231  initmsg7->master = collectionMaster;
232  group.collectionMgr = CProxy_CollectionMgr::ckNew(initmsg7);
233 
234  group.broadcastMgr = CProxy_BroadcastMgr::ckNew();
235  group.ldbCoordinator = CProxy_LdbCoordinator::ckNew();
236 
237  group.dataExchanger = CProxy_DataExchanger::ckNew();
238 
239  GroupInitMsg *msg = new GroupInitMsg;
240  msg->group = group;
241  CkGroupID node = CProxy_Node::ckNew(msg);
242 
243  CkStartQD(CkCallback(CkIndex_Node::exitScheduler(), CkMyPe(), node));
244  CsdScheduler(-1);
245 }
246 
247 char *gNAMDBinaryName = NULL;
248 // called by main on one or all procs
249 void BackEnd::init(int argc, char **argv) {
250 
251  gNAMDBinaryName = argv[0]+strlen(argv[0])-1;
252  while(gNAMDBinaryName != argv[0]){
253  if(*gNAMDBinaryName=='/' || *gNAMDBinaryName=='\\'){
254  gNAMDBinaryName++;
255  break;
256  }
257  gNAMDBinaryName--;
258  }
259 
260 #if defined(NAMD_CUDA) || defined(NAMD_HIP) || defined(NAMD_MIC)
261  // look for but don't remove +idlepoll on command line
262  int idlepoll = 0;
263  for ( int i = 0; i < argc; ++i ) {
264  if ( 0==strcmp(argv[i],"+idlepoll") ) {
265  idlepoll = 1;
266  break;
267  }
268  }
269 #endif
270 
271  ConverseInit(argc, argv, slave_init, 1, 1); // calls slave_init on others
272 
273 // idlepoll only matters for non-smp UDP layer
274 #if (defined(NAMD_CUDA) || defined(NAMD_HIP) || defined(NAMD_MIC)) && CMK_NET_VERSION && CMK_SHARED_VARS_UNAVAILABLE && CMK_WHEN_PROCESSOR_IDLE_USLEEP && ! CMK_USE_IBVERBS && ! CMK_USE_TCP
275  if ( ! idlepoll ) {
276  NAMD_die("Please add +idlepoll to command line for proper performance.");
277  }
278 #endif
279 
280  master_init(argc, argv);
281 }
282 
283 // called on proc 0 by front end
284 void BackEnd::exit(int status) {
285  float cpuTime = CmiCpuTimer() - cpuTime_start;
286  float wallTime = CmiWallTimer() - wallTime_start;
287  CmiPrintf("====================================================\n\n"
288  "WallClock: %f CPUTime: %f Memory: %f MB\n",
289  wallTime, cpuTime, memusage_MB());
290 #ifdef NAMD_TCL
291  Tcl_Finalize();
292 #endif
293 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
294 #ifdef __APPLE__
295 #if 0 && CMK_MULTICORE
296  CmiPrintf("EXITING ABNORMALLY TO AVOID HANGING CUDA RUNTIME THREADS\n");
297  ::exit(0);
298 #endif
299 #endif
300 #endif
301 #ifdef NAMD_MIC
302 #if 0 && CMK_MULTICORE
303  CmiPrintf("EXITING ABNORMALLY TO AVOID HANGING MIC OFFLOAD THREADS\n");
304 #pragma offload target(mic)
305  {
306  ::exit(0);
307  }
308 #endif
309 #endif
310 #if CHARM_VERSION < 61000
311  CkExit();
312 #else
313  CkExit(status);
314 #endif
315 }
316 
317 // start scheduler
318 void BackEnd::suspend(void) {
319  CsdScheduler(-1);
320 }
321 
322 // start quiescence detection to return to front end
323 void BackEnd::awaken(void) {
325 }
326 
327 // start QD and scheduler
328 void BackEnd::barrier(void) {
329  awaken();
330  suspend();
331 }
static Node * Object()
Definition: Node.h:86
CkGroupID broadcastMgr
Definition: BOCgroup.h:45
CkChareID master
Definition: CollectionMgr.h:23
static void awaken(void)
Definition: BackEnd.C:323
static void ExitSchedOn(int pe)
Definition: BackEnd.C:70
void after_backend_init(int argc, char **argv)
Definition: mainfunc.C:55
BOCgroup group
Definition: Node.h:68
CkGroupID patchMgr
Definition: BOCgroup.h:20
void all_init(int argc, char **argv)
Definition: BackEnd.C:102
void NAMD_new_handler()
Definition: BackEnd.C:80
void cuda_getargs(char **)
Definition: DeviceCUDA.C:69
CkGroupID computeLjPmeSerialMgr
Definition: BOCgroup.h:39
static void exit(int status=0)
Definition: BackEnd.C:284
CkGroupID computeMsmMsaMgr
Definition: BOCgroup.h:40
CkGroupID patchData
Definition: BOCgroup.h:28
static void suspend(void)
Definition: BackEnd.C:318
CkGroupID workDistrib
Definition: BOCgroup.h:19
char * gNAMDBinaryName
Definition: BackEnd.C:247
static void init(int argc, char **argv)
Definition: BackEnd.C:249
void master_init(int argc, char **argv)
Definition: BackEnd.C:170
float cpuTime_start
Definition: BackEnd.C:53
CkGroupID computeMgr
Definition: BOCgroup.h:22
CkGroupID computeCUDAMgr
Definition: BOCgroup.h:27
CkGroupID computePmeCUDAMgr
Definition: BOCgroup.h:26
CkGroupID computeMsmSerialMgr
Definition: BOCgroup.h:38
float wallTime_start
Definition: BackEnd.C:54
double memusage_MB()
Definition: memusage.h:13
CkGroupID dataExchanger
Definition: BOCgroup.h:58
CkGroupID collectionMgr
Definition: BOCgroup.h:44
CkGroupID computeMsmMgr
Definition: BOCgroup.h:41
CkGroupID computeExtMgr
Definition: BOCgroup.h:34
CkGroupID multicastMgr
Definition: BOCgroup.h:42
void enableExitScheduler(void)
Definition: Node.C:1439
void ProcessorPrivateInit(void)
CkGroupID proxyMgr
Definition: BOCgroup.h:21
CkGroupID ldbCoordinator
Definition: BOCgroup.h:46
CkGroupID synchronousCollectives
Definition: BOCgroup.h:60
CkGroupID nodePmeMgr
Definition: BOCgroup.h:24
CkGroupID computeGBISserMgr
Definition: BOCgroup.h:36
void NAMD_die(const char *err_msg)
Definition: common.C:147
void exit_sched(void *msg)
Definition: BackEnd.C:58
void mic_getargs(char **)
CkGroupID ioMgr
Definition: BOCgroup.h:49
void topo_getargs(char **)
Definition: WorkDistrib.C:93
static void barrier(void)
Definition: BackEnd.C:328
CkGroupID globalGPUMgr
Definition: BOCgroup.h:59
void _initCharm(int, char **)
static void register_exit_sched(void)
Definition: BackEnd.C:64
CkGroupID sync
Definition: BOCgroup.h:47
void slave_init(int argc, char **argv)
Definition: BackEnd.C:150
CkGroupID computeFmmSerialMgr
Definition: BOCgroup.h:37
void cuda_affinity_initialize()
Definition: CudaUtils.C:55
CkpvStaticDeclare(int, exitSchedHndlr)
CkGroupID computeQMMgr
Definition: BOCgroup.h:35
CkGroupID reductionMgr
Definition: BOCgroup.h:43