NAMD
Functions | Variables
BackEnd.C File Reference
#include "BackEnd.h"
#include "ProcessorPrivate.h"
#include "common.h"
#include "Node.h"
#include "memusage.h"
#include <new>
#include "Lattice.h"
#include "ComputeMoa.h"
#include "ComputeMsmMsa.h"
#include "main.decl.h"
#include "main.h"
#include "BOCgroup.h"
#include "WorkDistrib.decl.h"
#include "ProxyMgr.decl.h"
#include "PatchMgr.decl.h"
#include "DataExchanger.decl.h"
#include "ReductionMgr.decl.h"
#include "CollectionMgr.decl.h"
#include "CollectionMaster.decl.h"
#include "CollectionMgr.h"
#include "CollectionMaster.h"
#include "BroadcastMgr.decl.h"
#include "LdbCoordinator.decl.h"
#include "Sync.decl.h"
#include <tcl.h>

Go to the source code of this file.

Functions

void _initCharm (int, char **)
 
 CkpvStaticDeclare (int, exitSchedHndlr)
 
void exit_sched (void *msg)
 
static void register_exit_sched (void)
 
void NAMD_new_handler ()
 
void topo_getargs (char **)
 
void cuda_getargs (char **)
 
void cuda_affinity_initialize ()
 
void mic_getargs (char **)
 
void all_init (int argc, char **argv)
 
void after_backend_init (int argc, char **argv)
 
void master_init (int argc, char **argv)
 
void slave_init (int argc, char **argv)
 
void cuda_finalize ()
 

Variables

float cpuTime_start
 
float wallTime_start
 
char * gNAMDBinaryName = NULL
 

Function Documentation

void _initCharm ( int  ,
char **   
)

Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000 by The Board of Trustees of the University of Illinois. All rights reserved.

Referenced by all_init().

void after_backend_init ( int  argc,
char **  argv 
)

Definition at line 54 of file mainfunc.C.

References CHDIR, CWDSIZE, endi(), ScriptTcl::eval(), BackEnd::exit(), GETCWD, iINFO(), iout, ScriptTcl::load(), NAMD_die(), NAMD_err(), Node::Object(), PATHSEP, PATHSEPSTR, ScriptTcl::run(), Node::setScript(), and ScriptTcl::tclmain().

Referenced by main(), and slave_init().

54  {
55 #define CWDSIZE 1024
56  char origcwd_buf[CWDSIZE];
57  char currentdir_buf[CWDSIZE];
58 
59  ScriptTcl *script = new ScriptTcl;
60  Node::Object()->setScript(script);
61 
62  for(argc = 0; argv[argc]; ++argc);
63  if ( argc < 2 ) {
64 #if defined(WIN32) && !defined(__CYGWIN__)
65  CkPrintf("\nFATAL ERROR: No simulation config file specified on command line.\n");
66  CkPrintf("\nNOTE: NAMD has no graphical interface and must be run from a command line.\n");
67  int nsleep = 10;
68  CkPrintf("\nSleeping %d seconds before exiting...\n", nsleep);
69  fflush(stdout);
70  sleep(nsleep);
71  CkPrintf("\n");
72 #endif
73  NAMD_die("No simulation config file specified on command line.");
74  }
75  char *origcwd = GETCWD(origcwd_buf,CWDSIZE);
76  if ( ! origcwd ) NAMD_err("getcwd");
77 #ifdef NAMD_TCL
78  for(int i = 1; i < argc; ++i) {
79  if ( strstr(argv[i],"--") == argv[i] ) {
80  char buf[1024];
81  if ( i + 1 == argc ) {
82  sprintf(buf, "missing argument for command line option %s", argv[i]);
83  NAMD_die(buf);
84  }
85  if ( ! strcmp(argv[i],"--tclmain") ) {
86  // pass all remaining arguments to script
87  iout << iINFO << "Command-line argument is";
88  for ( int j=i; j<argc; ++j ) { iout << " " << argv[j]; }
89  iout << "\n" << endi;
90  script->tclmain(argc-i-1,argv+i+1);
91  BackEnd::exit();
92  return;
93  }
94  sprintf(buf, "%s %s", argv[i]+2, argv[i+1]);
95  iout << iINFO << "Command-line argument is --" << buf << "\n" << endi;
96  script->eval(buf);
97  ++i;
98  continue;
99  }
100  char *confFile = argv[i];
101 #else
102  char *confFile = argv[argc-1];
103 #endif
104  iout << iINFO << "Configuration file is " << confFile << "\n" << endi;
105 
106  char *currentdir=confFile;
107  char *tmp;
108  char tmpcurdir[3];
109  for(tmp=confFile;*tmp;++tmp); // find final null
110  for( ; tmp != confFile && *tmp != PATHSEP; --tmp); // find last '/'
111 #if defined(WIN32) && !defined(__CYGWIN__)
112  if (tmp == confFile) {
113  // in case this is under cygwin, search for '/' as well
114  for(tmp=confFile;*tmp;++tmp); // find final null
115  for( ; tmp != confFile && *tmp != '/'; --tmp); // find last '/'
116  }
117 #endif
118  if ( CHDIR(origcwd) ) NAMD_err(origcwd);
119  if ( tmp != confFile )
120  {
121  *tmp = 0; confFile = tmp + 1;
122  if ( CHDIR(currentdir) ) NAMD_err(currentdir);
123  struct stat statBuf;
124  if (stat(confFile, &statBuf)) {
125  char buf[1024];
126  sprintf(buf,"Unable to access config file %s%c%s",currentdir,PATHSEP,confFile);
127  NAMD_die(buf);
128  }
129  iout << iINFO << "Changed directory to " << currentdir << "\n" << endi;
130  currentdir = GETCWD(currentdir_buf,CWDSIZE);
131  if ( ! currentdir ) NAMD_err("getcwd after chdir");
132  }
133  else{
134  if ( *tmp == PATHSEP ){ // config file in / is odd, but it might happen
136  struct stat statBuf;
137  if (stat(confFile, &statBuf)) {
138  char buf[1024];
139  sprintf(buf,"Unable to access config file %s",confFile);
140  NAMD_die(buf);
141  }
142  }else{ // just a config file name, so the path is the current working path
143  struct stat statBuf;
144  if (stat(confFile, &statBuf)) {
145  char buf[1024];
146  if ( confFile[0] == '-' || confFile[0] == '+' ) {
147  sprintf(buf,"Unknown command-line option %s",confFile);
148  } else {
149  sprintf(buf,"Unable to access config file %s",confFile);
150  }
151  NAMD_die(buf);
152  }
153  tmpcurdir[0] = '.';
154  tmpcurdir[1] = PATHSEP;
155  tmpcurdir[2] = 0;
156  currentdir = tmpcurdir;
157  iout << iINFO << "Working in the current directory " << origcwd << "\n" << endi;
158  }
159  }
160 
161 #ifdef MEM_OPT_VERSION
162  int dirlen = strlen(currentdir);
163  gWorkDir = new char[dirlen+1];
164  gWorkDir[dirlen]=0;
165  memcpy(gWorkDir, currentdir, dirlen);
166 #endif
167 
168  currentdir = NULL;
169 
170 #ifdef NAMD_TCL
171  script->load(confFile);
172 #else
173  script->run(confFile);
174 #endif
175 
176 #ifdef NAMD_TCL
177 }
178  script->run();
179 #endif
180 
181  BackEnd::exit();
182 }
static Node * Object()
Definition: Node.h:86
std::ostream & iINFO(std::ostream &s)
Definition: InfoStream.C:81
void NAMD_err(const char *err_msg)
Definition: common.C:106
void load(char *scriptFile)
Definition: ScriptTcl.C:2304
static void exit(int status=0)
Definition: BackEnd.C:276
std::ostream & endi(std::ostream &s)
Definition: InfoStream.C:54
#define iout
Definition: InfoStream.h:51
#define CHDIR
Definition: mainfunc.C:24
#define PATHSEP
Definition: mainfunc.C:26
void run()
Definition: ScriptTcl.C:2321
void setScript(ScriptTcl *s)
Definition: Node.h:191
#define CWDSIZE
void NAMD_die(const char *err_msg)
Definition: common.C:85
void tclmain(int, char **)
Definition: ScriptTcl.C:2287
void eval(char *script)
Definition: ScriptTcl.C:2247
#define PATHSEPSTR
Definition: mainfunc.C:27
#define GETCWD
Definition: mainfunc.C:25
void all_init ( int  argc,
char **  argv 
)

Definition at line 99 of file BackEnd.C.

References _initCharm(), cuda_affinity_initialize(), cuda_getargs(), mic_getargs(), NAMD_new_handler(), ProcessorPrivateInit(), register_exit_sched(), and topo_getargs().

Referenced by master_init(), and slave_init().

100 {
101 #if defined(WIN32) && !defined(__CYGWIN__) && !defined(__MINGW_H)
102  _set_new_handler(NAMD_new_handler);
103 #else
104  std::set_new_handler(NAMD_new_handler);
105 #endif
108  CmiGetArgFlag(argv, "+idlepoll"); // remove +idlepoll if it's still there
109  topo_getargs(argv);
110 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
111  cuda_getargs(argv);
112  argc = CmiGetArgc(argv);
113 #endif
114 #ifdef NAMD_MIC
115  CmiGetArgFlag(argv, "+idlepoll"); // remove +idlepoll if it's still there
116  mic_getargs(argv);
117  argc = CmiGetArgc(argv);
118 #endif
119 #ifdef NAMD_AVXTILES
120  avxTilesCommandLineDisable = CmiGetArgFlag(argv, "+notiles");
121 #endif
122 
123 #ifdef NAMD_CUDA
124  // launch CUDA runtime threads before affinity is set by _initCharm
125  // _initCharm contains a node barrier so there is no race here
126  if(CmiMyRank()==0){
128  }
129 #endif
130 
131  _initCharm(argc, argv); // message main Chare
132 
133 //#if 0 // moved to WorkDistrib
134 //#ifdef NAMD_CUDA
135 // if ( CkMyPe() < CkNumPes() ) cuda_initialize();
136 //#endif
137 //#ifdef NAMD_MIC
138 // if ( CkMyPe() < CkNumPes() ) mic_initialize();
139 //#endif
140 //#endif
141 }
void NAMD_new_handler()
Definition: BackEnd.C:77
void cuda_getargs(char **)
Definition: DeviceCUDA.C:55
void ProcessorPrivateInit(void)
void mic_getargs(char **)
void topo_getargs(char **)
Definition: WorkDistrib.C:90
void _initCharm(int, char **)
static void register_exit_sched(void)
Definition: BackEnd.C:61
void cuda_affinity_initialize()
Definition: CudaUtils.C:33
CkpvStaticDeclare ( int  ,
exitSchedHndlr   
)
void cuda_affinity_initialize ( )

Definition at line 33 of file CudaUtils.C.

References dummy().

Referenced by all_init().

33  {
34  int devcnt = 0;
35  cudaError_t err = cudaGetDeviceCount(&devcnt);
36  if ( devcnt == 1 ) { // only one device so it must be ours
37  int *dummy;
38  if ( err == cudaSuccess ) err = cudaSetDevice(0);
39  if ( err == cudaSuccess ) err = cudaSetDeviceFlags(cudaDeviceMapHost);
40  if ( err == cudaSuccess ) err = cudaMalloc(&dummy, 4);
41  }
42  if ( err != cudaSuccess ) {
43  char host[128];
44  gethostname(host, 128); host[127] = 0;
45  fprintf(stderr,"CUDA initialization error on %s: %s\n", host, cudaGetErrorString(err));
46  }
47 }
void dummy()
void cuda_finalize ( )

Definition at line 30 of file DeviceCUDA.C.

Referenced by BackEnd::exit().

30  {
31  int ndevs = 0;
32  cudaGetDeviceCount(&ndevs);
33  for ( int dev=0; dev < ndevs; ++dev ) {
34  cudaSetDevice(dev);
35  cudaDeviceReset();
36  }
37 }
void cuda_getargs ( char **  )

Definition at line 55 of file DeviceCUDA.C.

References cuda_args, cuda_args_t::devicelist, cuda_args_t::devicesperreplica, cuda_args_t::ignoresharing, cuda_args_t::mergegrids, NAMD_die(), cuda_args_t::nomergegrids, cuda_args_t::nostreaming, and cuda_args_t::usedevicelist.

Referenced by all_init().

55  {
57  cuda_args.usedevicelist = CmiGetArgStringDesc(argv, "+devices", &cuda_args.devicelist,
58  "comma-delimited list of CUDA device numbers such as 0,2,1,2");
60  CmiGetArgInt(argv, "+devicesperreplica", &cuda_args.devicesperreplica);
61  if ( cuda_args.devicesperreplica < 0 ) NAMD_die("Devices per replica must be positive\n");
62  cuda_args.ignoresharing = CmiGetArgFlag(argv, "+ignoresharing");
63  cuda_args.mergegrids = CmiGetArgFlag(argv, "+mergegrids");
64  cuda_args.nomergegrids = CmiGetArgFlag(argv, "+nomergegrids");
65  if ( cuda_args.mergegrids && cuda_args.nomergegrids ) NAMD_die("Do not specify both +mergegrids and +nomergegrids");
66  cuda_args.nostreaming = CmiGetArgFlag(argv, "+nostreaming");
67 }
int devicesperreplica
Definition: DeviceCUDA.C:46
int nomergegrids
Definition: DeviceCUDA.C:49
static __thread cuda_args_t cuda_args
Definition: DeviceCUDA.C:53
int usedevicelist
Definition: DeviceCUDA.C:45
int mergegrids
Definition: DeviceCUDA.C:48
int nostreaming
Definition: DeviceCUDA.C:50
void NAMD_die(const char *err_msg)
Definition: common.C:85
int ignoresharing
Definition: DeviceCUDA.C:47
char * devicelist
Definition: DeviceCUDA.C:44
void exit_sched ( void msg)

Definition at line 55 of file BackEnd.C.

Referenced by register_exit_sched().

56 {
57  // CmiPrintf("Exiting scheduler on %d\n",CmiMyPe());
58  CsdExitScheduler();
59 }
void master_init ( int  argc,
char **  argv 
)

Definition at line 167 of file BackEnd.C.

References all_init(), BOCgroup::broadcastMgr, BOCgroup::collectionMgr, BOCgroup::computeCUDAMgr, BOCgroup::computeExtMgr, BOCgroup::computeFmmSerialMgr, BOCgroup::computeGBISserMgr, BOCgroup::computeMgr, BOCgroup::computeMsmMgr, BOCgroup::computeMsmMsaMgr, BOCgroup::computeMsmSerialMgr, BOCgroup::computePmeCUDAMgr, BOCgroup::computeQMMgr, cpuTime_start, BOCgroup::dataExchanger, GroupInitMsg::group, BOCgroup::ioMgr, BOCgroup::ldbCoordinator, SlaveInitMsg::master, BOCgroup::multicastMgr, BOCgroup::nodePmeMgr, BOCgroup::patchMgr, BOCgroup::proxyMgr, BOCgroup::reductionMgr, BOCgroup::sync, wallTime_start, and BOCgroup::workDistrib.

Referenced by BackEnd::init(), and slave_init().

167  {
168  cpuTime_start = CmiCpuTimer();
169  wallTime_start = CmiWallTimer();
170  if ( CmiMyPe() ) {
171  all_init(argc, argv);
172  CsdScheduler(-1);
173  ConverseExit(); // should never return
174  }
175 
176  all_init(argc, argv);
177 
178  // Create branch-office chares
179  BOCgroup group;
180  group.workDistrib = CProxy_WorkDistrib::ckNew();
181  group.proxyMgr = CProxy_ProxyMgr::ckNew();
182  group.patchMgr = CProxy_PatchMgr::ckNew();
183  group.computeMgr = CProxy_ComputeMgr::ckNew();
184  group.reductionMgr = CProxy_ReductionMgr::ckNew();
185  // group.computePmeMgr set in constructor during startup
186  group.nodePmeMgr = CProxy_NodePmeMgr::ckNew();
187 #if defined(NAMD_CUDA) || defined(NAMD_HIP)
188  group.computePmeCUDAMgr = CProxy_ComputePmeCUDAMgr::ckNew();
189  group.computeCUDAMgr = CProxy_ComputeCUDAMgr::ckNew();
190 #endif
191 #ifdef OPENATOM_VERSION
192  group.computeMoaMgr = CProxy_ComputeMoaMgr::ckNew();
193 #endif // OPENATOM_VERSION
194  group.computeExtMgr = CProxy_ComputeExtMgr::ckNew();
195  group.computeQMMgr = CProxy_ComputeQMMgr::ckNew();
196  group.computeGBISserMgr = CProxy_ComputeGBISserMgr::ckNew();
197  group.computeFmmSerialMgr = CProxy_ComputeFmmSerialMgr::ckNew();
198  group.computeMsmSerialMgr = CProxy_ComputeMsmSerialMgr::ckNew();
199 #ifdef CHARM_HAS_MSA
200  group.computeMsmMsaMgr = CProxy_ComputeMsmMsaMgr::ckNew();
201 #endif
202  group.computeMsmMgr = CProxy_ComputeMsmMgr::ckNew();
203  // Charm CkMulticast library module
204  group.multicastMgr = CProxy_CkMulticastMgr::ckNew();
205 #ifdef MEM_OPT_VERSION
206  group.ioMgr=CProxy_ParallelIOMgr::ckNew();
207 #endif
208 
209  group.sync = CProxy_Sync::ckNew();
210 
211  #ifdef USE_NODEPATCHMGR
212  group.nodeProxyMgr = CProxy_NodeProxyMgr::ckNew();
213  #endif
214 
215 #if CMK_SMP && USE_CKLOOP
216  group.ckLoop = CkLoop_Init();
217 #endif
218 
219  CkChareID collectionMaster = CProxy_CollectionMaster::ckNew(0);
220  SlaveInitMsg *initmsg7 = new SlaveInitMsg;
221  initmsg7->master = collectionMaster;
222  group.collectionMgr = CProxy_CollectionMgr::ckNew(initmsg7);
223 
224  group.broadcastMgr = CProxy_BroadcastMgr::ckNew();
225  group.ldbCoordinator = CProxy_LdbCoordinator::ckNew();
226 
227  group.dataExchanger = CProxy_DataExchanger::ckNew();
228 
229  GroupInitMsg *msg = new GroupInitMsg;
230  msg->group = group;
231  CkGroupID node = CProxy_Node::ckNew(msg);
232 
233  CkStartQD(CkCallback(CkIndex_Node::exitScheduler(), CkMyPe(), node));
234  CsdScheduler(-1);
235 }
CkGroupID broadcastMgr
Definition: BOCgroup.h:42
CkChareID master
Definition: CollectionMgr.h:23
BOCgroup group
Definition: Node.h:68
CkGroupID patchMgr
Definition: BOCgroup.h:19
void all_init(int argc, char **argv)
Definition: BackEnd.C:99
CkGroupID computeMsmMsaMgr
Definition: BOCgroup.h:37
CkGroupID workDistrib
Definition: BOCgroup.h:18
float cpuTime_start
Definition: BackEnd.C:50
CkGroupID computeMgr
Definition: BOCgroup.h:21
CkGroupID computeCUDAMgr
Definition: BOCgroup.h:26
CkGroupID computePmeCUDAMgr
Definition: BOCgroup.h:25
CkGroupID computeMsmSerialMgr
Definition: BOCgroup.h:36
float wallTime_start
Definition: BackEnd.C:51
CkGroupID dataExchanger
Definition: BOCgroup.h:55
CkGroupID collectionMgr
Definition: BOCgroup.h:41
CkGroupID computeMsmMgr
Definition: BOCgroup.h:38
CkGroupID computeExtMgr
Definition: BOCgroup.h:32
CkGroupID multicastMgr
Definition: BOCgroup.h:39
CkGroupID proxyMgr
Definition: BOCgroup.h:20
CkGroupID ldbCoordinator
Definition: BOCgroup.h:43
CkGroupID nodePmeMgr
Definition: BOCgroup.h:23
CkGroupID computeGBISserMgr
Definition: BOCgroup.h:34
CkGroupID ioMgr
Definition: BOCgroup.h:46
CkGroupID sync
Definition: BOCgroup.h:44
CkGroupID computeFmmSerialMgr
Definition: BOCgroup.h:35
CkGroupID computeQMMgr
Definition: BOCgroup.h:33
CkGroupID reductionMgr
Definition: BOCgroup.h:40
void mic_getargs ( char **  )

Referenced by all_init().

void NAMD_new_handler ( )

Definition at line 77 of file BackEnd.C.

References NAMD_die().

Referenced by all_init().

77  {
78 #endif
79  char tmp[100];
80  sprintf(tmp,"Memory allocation failed on processor %d.",CmiMyPe());
81  NAMD_die(tmp);
82 #if defined(WIN32) && !defined(__CYGWIN__) && !defined(__MINGW_H)
83  return 0;
84 #endif
85 }
void NAMD_die(const char *err_msg)
Definition: common.C:85
static void register_exit_sched ( void  )
static

Definition at line 61 of file BackEnd.C.

References exit_sched().

Referenced by all_init().

62 {
63  CkpvInitialize(int,exitSchedHndlr);
64  CkpvAccess(exitSchedHndlr) = CmiRegisterHandler((CmiHandler)exit_sched);
65 }
void exit_sched(void *msg)
Definition: BackEnd.C:55
void slave_init ( int  argc,
char **  argv 
)

Definition at line 147 of file BackEnd.C.

References after_backend_init(), all_init(), and master_init().

Referenced by BackEnd::init().

148 {
149 #if CMK_SMP
150  //the original main thread could now be a comm thread
151  //and a slave thread could now be the main thread,
152  //so we have to do the master initialization here
153  if(CmiMyRank()==0){
154  master_init(argc, argv);
155  if(CmiMyPe()==0)
156  after_backend_init(argc, argv);
157  return;
158  }
159 #endif
160 
161  all_init(argc, argv);
162 
163  if (CkMyRank() < CkMyNodeSize()) // skip the communication thread
164  CsdScheduler(-1);
165 }
void after_backend_init(int argc, char **argv)
Definition: mainfunc.C:54
void all_init(int argc, char **argv)
Definition: BackEnd.C:99
void master_init(int argc, char **argv)
Definition: BackEnd.C:167
void topo_getargs ( char **  )

Definition at line 90 of file WorkDistrib.C.

References build_ordering(), and randtopo.

Referenced by all_init().

90  {
91  randtopo = CmiGetArgFlag(argv, "+randtopo");
92  if ( CkMyPe() >= CkNumPes() ) return;
93 #if CCD_COND_FN_EXISTS
94  CcdCallOnCondition(CcdTOPOLOGY_AVAIL, (CcdCondFn)build_ordering, (void*)0);
95 #else
96  CcdCallOnCondition(CcdTOPOLOGY_AVAIL, (CcdVoidFn)build_ordering, (void*)0);
97 #endif
98 }
static int randtopo
Definition: WorkDistrib.C:84
static void build_ordering(void *)
Definition: WorkDistrib.C:86

Variable Documentation

float cpuTime_start

Definition at line 50 of file BackEnd.C.

Referenced by BackEnd::exit(), and master_init().

char* gNAMDBinaryName = NULL

Definition at line 237 of file BackEnd.C.

float wallTime_start

Definition at line 51 of file BackEnd.C.

Referenced by BackEnd::exit(), and master_init().