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
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
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);
00088 }
00089
00090
00091 void slave_init(int argc, char **argv)
00092 {
00093 all_init(argc, argv);
00094 if (CkMyRank() < CkMyNodeSize())
00095 CsdScheduler(-1);
00096 }
00097
00098
00099 void BackEnd::init(int argc, char **argv) {
00100 ConverseInit(argc, argv, slave_init, 1, 1);
00101 cpuTime_start = CmiCpuTimer();
00102 wallTime_start = CmiWallTimer();
00103 if ( CmiMyPe() ) {
00104 slave_init(argc, argv);
00105 ConverseExit();
00106 }
00107 all_init(argc, argv);
00108
00109
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
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
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
00160 void BackEnd::suspend(void) {
00161 CsdScheduler(-1);
00162 }
00163
00164
00165 void BackEnd::awaken(void) {
00166 Node::Object()->enableExitScheduler();
00167 }
00168
00169
00170 void BackEnd::barrier(void) {
00171 awaken();
00172 suspend();
00173 }
00174