Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

BackEnd.C

Go to the documentation of this file.
00001 
00007 #include "BackEnd.h"
00008 #include "ProcessorPrivate.h"
00009 #include "common.h"
00010 #include "Node.h"
00011 #include "memusage.h"
00012 
00013 #include <new>
00014 #if defined(WIN32) && !defined(__CYGWIN__)
00015 #include <new.h>
00016 #endif
00017 
00018 #ifdef USE_COMM_LIB
00019 #include "ComlibManager.h"
00020 #endif
00021 
00022 #include "main.decl.h"
00023 #include "main.h"
00024 #include "BOCgroup.h"
00025 #include "WorkDistrib.decl.h"
00026 #include "ProxyMgr.decl.h"
00027 #include "PatchMgr.decl.h"
00028 #include "ComputeMgr.decl.h"
00029 #include "ReductionMgr.decl.h"
00030 #include "CollectionMgr.decl.h"
00031 #include "CollectionMaster.decl.h"
00032 #include "CollectionMgr.h"
00033 #include "CollectionMaster.h"
00034 #include "BroadcastMgr.decl.h"
00035 #include "LdbCoordinator.decl.h"
00036 #include "Sync.decl.h"
00037 
00038 extern void _initCharm(int, char**);
00039 
00040 float cpuTime_start;
00041 float wallTime_start;
00042 
00043 CpvStaticDeclare(int,exitSchedHndlr);
00044 
00045 extern "C" void exit_sched(void* msg)
00046 {
00047   //  CmiPrintf("Exiting scheduler on %d\n",CmiMyPe());
00048   CsdExitScheduler();
00049 }
00050 
00051 static void register_exit_sched(void)
00052 {
00053   CpvInitialize(int,exitSchedHndlr);
00054   CpvAccess(exitSchedHndlr) = CmiRegisterHandler((CmiHandler)exit_sched);
00055 }
00056 
00057 void BackEnd::ExitSchedOn(int pe)
00058 {
00059   void* msg = CmiAlloc(CmiMsgHeaderSizeBytes);
00060   CmiSetHandler(msg,CpvAccess(exitSchedHndlr));
00061   CmiSyncSendAndFree(pe,CmiMsgHeaderSizeBytes,(char *)msg);
00062 }
00063 
00064 #if defined(WIN32) && !defined(__CYGWIN__)
00065 int NAMD_new_handler(size_t) {
00066 #else
00067 void NAMD_new_handler() {
00068 #endif
00069   char tmp[100];
00070   sprintf(tmp,"Memory allocation failed on processor %d.",CmiMyPe());
00071   NAMD_die(tmp);
00072 #if defined(WIN32) && !defined(__CYGWIN__)
00073   return 0;
00074 #endif
00075 }
00076 
00077 // called on all procs
00078 void all_init(int argc, char **argv)
00079 {
00080 #if defined(WIN32) && !defined(__CYGWIN__)
00081   _set_new_handler(NAMD_new_handler);
00082 #else
00083   std::set_new_handler(NAMD_new_handler);
00084 #endif
00085   ProcessorPrivateInit();
00086   register_exit_sched();
00087   _initCharm(argc, argv);  // message main Chare
00088 }
00089 
00090 // called on slave procs
00091 void slave_init(int argc, char **argv)
00092 {
00093   all_init(argc, argv);
00094   if (CkMyRank() < CkMyNodeSize())      // skip the communication thread
00095     CsdScheduler(-1);
00096 }
00097 
00098 // called by main on one or all procs
00099 void BackEnd::init(int argc, char **argv) {
00100   ConverseInit(argc, argv, slave_init, 1, 1);  // calls slave_init on others
00101   cpuTime_start = CmiCpuTimer();
00102   wallTime_start = CmiWallTimer();
00103   if ( CmiMyPe() ) {
00104     slave_init(argc, argv);  // for procs that call main
00105     ConverseExit();  // should never return
00106   }
00107   all_init(argc, argv);
00108 
00109   // Create branch-office chares
00110   BOCgroup group;
00111   group.workDistrib = CProxy_WorkDistrib::ckNew();
00112   group.proxyMgr = CProxy_ProxyMgr::ckNew();
00113   group.patchMgr = CProxy_PatchMgr::ckNew();
00114   group.computeMgr = CProxy_ComputeMgr::ckNew();
00115   group.reductionMgr = CProxy_ReductionMgr::ckNew();
00116   group.computePmeMgr = CProxy_ComputePmeMgr::ckNew();
00117   group.computeExtMgr = CProxy_ComputeExtMgr::ckNew();
00118   group.sync = CProxy_Sync::ckNew();
00119 
00120 #if CHARM_VERSION > 050402
00121 #ifdef MEM_OPT_VERSION
00122   MasterHandlerInitMsg *initmsg8 = new MasterHandlerInitMsg;
00123   //initmsg8->master = collectionMaster;
00124   CkChareID collectionMasterHanlder = CProxy_CollectionMasterHandler::ckNew(initmsg8, 0);
00125 #else
00126   CkChareID collectionMaster = CProxy_CollectionMaster::ckNew(0);
00127 #endif
00128 #else
00129   CProxy_CollectionMaster coll(0);
00130   CkChareID collectionMaster = coll.ckGetChareId();
00131 #endif
00132 
00133   SlaveInitMsg *initmsg7 = new SlaveInitMsg;
00134 #ifndef MEM_OPT_VERSION
00135   initmsg7->master = collectionMaster;
00136 #endif
00137   group.collectionMgr = CProxy_CollectionMgr::ckNew(initmsg7);
00138   group.broadcastMgr = CProxy_BroadcastMgr::ckNew();
00139   group.ldbCoordinator = CProxy_LdbCoordinator::ckNew();
00140   GroupInitMsg *msg = new GroupInitMsg;
00141   msg->group = group;
00142   CProxy_Node::ckNew(msg);
00143 
00144 }
00145 
00146 // called on proc 0 by front end
00147 void BackEnd::exit(void) {
00148   float cpuTime = CmiCpuTimer() - cpuTime_start;
00149   float wallTime = CmiWallTimer() - wallTime_start;
00150   CmiPrintf("==========================================\n"
00151         "WallClock: %f  CPUTime: %f  Memory: %d kB\n",
00152         wallTime,cpuTime,memusage()/1024);
00153   int i;
00154   for(i=1; i < CmiNumPes(); i++)
00155     ExitSchedOn(i);
00156   ConverseExit();
00157 }
00158 
00159 // start scheduler
00160 void BackEnd::suspend(void) {
00161   CsdScheduler(-1);
00162 }
00163 
00164 // start quiescence detection to return to front end
00165 void BackEnd::awaken(void) {
00166   Node::Object()->enableExitScheduler();
00167 }
00168 
00169 // start QD and scheduler
00170 void BackEnd::barrier(void) {
00171   awaken();
00172   suspend();
00173 }
00174 

Generated on Sun Jul 6 04:07:41 2008 for NAMD by  doxygen 1.3.9.1