void LBMachineUtil::StatsOn() { const double cur_wall = CkWallTimer(); #if CMK_LB_CPUTIMER const double cur_cpu = CkCpuTimer(); #endif if (state == off) { #if ! CMK_BIGSIM_CHARM cancel_idleStart=CcdCallOnConditionKeep( CcdPROCESSOR_BEGIN_IDLE,(CcdVoidFn)staticIdleStart,(void *)this); cancel_idleEnd=CcdCallOnConditionKeep( CcdPROCESSOR_END_IDLE,(CcdVoidFn)staticIdleEnd,(void *)this); #endif state = on; } if (start_totalwall != -1.) { total_walltime += (cur_wall - start_totalwall); #if CMK_LB_CPUTIMER total_cputime += (cur_cpu - start_totalcpu); #endif } start_totalwall = cur_wall; #if CMK_LB_CPUTIMER start_totalcpu = cur_cpu; #endif }
/** * Initialize the callback containers */ void CcdModuleInit(void) { int i; double curTime; CpvInitialize(ccd_heap_elem*, ccd_heap); CpvInitialize(ccd_cond_callbacks, conds); CpvInitialize(ccd_periodic_callbacks, pcb); CpvInitialize(int, ccd_heaplen); CpvInitialize(int, ccd_heapmaxlen); CpvInitialize(int, _ccd_numchecks); CpvAccess(ccd_heaplen) = 0; CpvAccess(ccd_heapmaxlen) = MAXTIMERHEAPENTRIES; CpvAccess(ccd_heap) = (ccd_heap_elem*) malloc(sizeof(ccd_heap_elem)*2*(MAXTIMERHEAPENTRIES + 1)); _MEMCHECK(CpvAccess(ccd_heap)); for(i=0; i<MAXNUMCONDS; i++) { init_cblist(&(CpvAccess(conds).condcb[i]), CBLIST_INIT_LEN); init_cblist(&(CpvAccess(conds).condcb_keep[i]), CBLIST_INIT_LEN); } CpvAccess(_ccd_numchecks) = 1; CpvAccess(pcb).nSkip = 1; curTime=CmiWallTimer(); CpvAccess(pcb).lastCheck = curTime; for (i=0; i<CCD_PERIODIC_MAX; i++) CpvAccess(pcb).nextCall[i]=curTime+periodicCallInterval[i]; CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE,CcdCallBacksReset,0); CcdCallOnConditionKeep(CcdPROCESSOR_END_IDLE,CcdCallBacksReset,0); }
static void MachinePostCommonInitForLAPI(int everReturn) { /** * In SMP, the machine layer usually has one comm thd, and it is * designed to be responsible for all network communication. So * if there's no dedicated processor for the comm thread, it has * to share a proc with a worker thread. In this scenario, * the worker thread needs to yield for some time to give CPU * time to comm thread. However, in current configuration, we * will always dedicate one proc for the comm thd, therefore, * such yielding scheme is not necessary. Besides, avoiding * this yielding scheme improves performance because worker * thread doesn't need to yield and will be more responsive to * incoming messages. So, we will always use CmiNotifyIdle * instead. * * --Chao Mei */ /* Not registering any Idle-state related functions right now!! */ #if 0 && CMK_SMP s=CmiNotifyGetState(); CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE,(CcdVoidFn)CmiNotifyBeginIdle,(void *)s); CcdCallOnConditionKeep(CcdPROCESSOR_STILL_IDLE,(CcdVoidFn)CmiNotifyStillIdle,(void *)s); #else CcdCallOnConditionKeep(CcdPROCESSOR_STILL_IDLE,(CcdVoidFn)CmiNotifyIdle,NULL); #if !CMK_SMP || CMK_SMP_NO_COMMTHD /* If there's comm thread, then comm thd is responsible for advancing comm */ if (!CsvAccess(lapiInterruptMode)) { CcdCallOnConditionKeep(CcdPERIODIC_10ms, (CcdVoidFn)AdvanceCommunicationForLAPI, NULL); } #endif #endif }
CmiStartFn mymain(int argc, char** argv) { if(CmiMyRank() == CmiMyNodeSize()) return 0; CpvInitialize(int,msgSize); CpvInitialize(int,cycleNum); CpvInitialize(int,sizeNum); CpvAccess(sizeNum) = 1; CpvAccess(msgSize)= CmiMsgHeaderSizeBytes + 8; CpvInitialize(int,exitHandler); CpvAccess(exitHandler) = CmiRegisterHandler((CmiHandler) exitHandlerFunc); CpvInitialize(int,node0Handler); CpvAccess(node0Handler) = CmiRegisterHandler((CmiHandler) node0HandlerFunc); CpvInitialize(int,node1Handler); CpvAccess(node1Handler) = CmiRegisterHandler((CmiHandler) node1HandlerFunc); CpvInitialize(int,ackHandler); CpvAccess(ackHandler) = CmiRegisterHandler((CmiHandler) ackHandlerFunc); CpvInitialize(double,startTime); CpvInitialize(double,endTime); CpvInitialize(double, IdleStartTime); CpvInitialize(double, IdleTime); CpvInitialize(int,ackCount); CpvAccess(ackCount) = 0; CpvInitialize(int,twoway); CpvAccess(twoway) = 0; CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE, ApplIdleStart, NULL); CcdCallOnConditionKeep(CcdPROCESSOR_END_IDLE, ApplIdleEnd, NULL); if(argc > 1) CpvAccess(twoway) = atoi(argv[1]); if(CmiMyPe() == 0) { if(!CpvAccess(twoway)) CmiPrintf("Starting Pingpong with oneway traffic \n"); else CmiPrintf("Starting Pingpong with twoway traffic\n"); } if ((CmiMyPe() < CmiNumPes()/2) || CpvAccess(twoway)) startPingpong(); return 0; }
void CcsInit(char **argv) { CpvInitialize(CkHashtable_c, ccsTab); CpvAccess(ccsTab) = CkCreateHashtable_string(sizeof(CcsHandlerRec),5); CpvInitialize(CcsImplHeader *, ccsReq); CpvAccess(ccsReq) = NULL; _ccsHandlerIdx = CmiRegisterHandler((CmiHandler)req_fw_handler); #if CMK_BIGSIM_CHARM CpvInitialize(int, _bgCcsHandlerIdx); CpvAccess(_bgCcsHandlerIdx) = 0; CpvInitialize(int, _bgCcsAck); CpvAccess(_bgCcsAck) = 0; #endif CpvInitialize(int, cmiArgDebugFlag); CpvInitialize(char *, displayArgument); CpvInitialize(int, cpdSuspendStartup); CpvAccess(cmiArgDebugFlag) = 0; CpvAccess(displayArgument) = NULL; CpvAccess(cpdSuspendStartup) = 0; CcsBuiltinsInit(argv); rep_fw_handler_idx = CmiRegisterHandler((CmiHandler)rep_fw_handler); #if NODE_0_IS_CONVHOST #if ! CMK_CMIPRINTF_IS_A_BUILTIN print_fw_handler_idx = CmiRegisterHandler((CmiHandler)print_fw_handler); #endif { int ccs_serverPort=0; char *ccs_serverAuth=NULL; if (CmiGetArgFlagDesc(argv,"++server", "Create a CCS server port") | CmiGetArgIntDesc(argv,"++server-port",&ccs_serverPort, "Listen on this TCP/IP port number") | CmiGetArgStringDesc(argv,"++server-auth",&ccs_serverAuth, "Use this CCS authentication file")) if (CmiMyPe()==0) {/*Create and occasionally poll on a CCS server port*/ CcsServer_new(NULL,&ccs_serverPort,ccs_serverAuth); CcdCallOnConditionKeep(CcdPERIODIC,(CcdVoidFn)CcsServerCheck,NULL); } } #endif /* if in parallel debug mode i.e ++cpd, freeze */ if (CmiGetArgFlagDesc(argv, "+cpd", "Used *only* in conjunction with parallel debugger")) { CpvAccess(cmiArgDebugFlag) = 1; if (CmiGetArgStringDesc(argv, "+DebugDisplay",&(CpvAccess(displayArgument)), "X display for gdb used only in cpd mode")) { if (CpvAccess(displayArgument) == NULL) CmiPrintf("WARNING> NULL parameter for +DebugDisplay\n***"); } else if (CmiMyPe() == 0) { /* only one processor prints the warning */ CmiPrintf("WARNING> x term for gdb needs to be specified as +DebugDisplay by debugger\n***\n"); } if (CmiGetArgFlagDesc(argv, "+DebugSuspend", "Suspend execution at beginning of program")) { CpvAccess(cpdSuspendStartup) = 1; } } CcsReleaseMessages(); }
TempAwareRefineLB::TempAwareRefineLB(const CkLBOptions &opt): CentralLB(opt) { #ifdef TEMP_LDB starting=CmiWallTimer(); // procsPerNode=4; migFile=fopen("migInfo","w"); numAvailFreqs = 11; //numAvailFreqs = 14; //numAvailFreqs = 7; freqs=new int[numAvailFreqs]; freqsEffect=new int[numAvailFreqs]; // for might (lab machine) /* freqs[0] = 2262000; freqs[1] = 2261000; freqs[2] = 2128000; freqs[3] = 1995000; freqs[4] = 1862000; freqs[5] = 1729000; freqs[6] = 1596000; */ // for tarekc cluster freqs[0] = 2395000; freqs[1] = 2394000; freqs[2] = 2261000; freqs[3] = 2128000; freqs[4] = 1995000; freqs[5] = 1862000; freqs[6] = 1729000; freqs[7] = 1596000; freqs[8] = 1463000; freqs[9] = 1330000; freqs[10] = 1197000; freqsEffect[0] = 1979886; freqsEffect[1] = 1943017; freqsEffect[2] = 1910989; freqsEffect[3] = 1876619; freqsEffect[4] = 1824126; freqsEffect[5] = 1763990; freqsEffect[6] = 1666773; freqsEffect[7] = 1560224; freqsEffect[8] = 1443154; freqsEffect[9] = 1317009; freqsEffect[10] = 1200000; /* // for grace, humility etc (lab i7 machines) freqs[0] = 2801000; freqs[1] = 2800000; freqs[2] = 2667000; freqs[3] = 2533000; freqs[4] = 2400000; freqs[5] = 2267000; freqs[6] = 2133000; freqs[7] = 2000000; freqs[8] = 1867000; freqs[9] = 1733000; freqs[10] = 1600000; freqs[11] = 1467000; freqs[12] = 1333000; freqs[13] = 1200000; */ procFreqPtr = new int[CkNumPes()]; for(int i=0;i<CkNumPes();i++) { char newfreq[10]; sprintf(newfreq,"%d",freqs[0]); cpufreq_sysfs_write(newfreq,i%physicalCoresPerNode); procFreqPtr[i]=0; } // logicalCoresPerChip=4; procFreq=NULL; procTemp=NULL; procFreqNew=NULL; procFreqNewEffect = NULL; avgChipTemp=NULL; lbname = "TempAwareRefineLB"; if (CkMyPe()==0) CkPrintf("[%d] TempAwareRefineLB created\n",CkMyPe()); char logFile[100]; snprintf(logFile, sizeof(logFile), "temp_freq.log.%d", CkMyPe()); if ((logFD = fopen(logFile, "a"))) { fprintf(logFD, "Time, PE, Temperature, Frequency\n"); } else { CkAbort("Couldn't open temperature/frequency log file"); } CcdCallOnConditionKeep(CcdPERIODIC_1second, &printCurrentTemperature, this); #else CmiAbort("TEMPLB ERROR: not supported without TEMP_LDB flag.\n"); #endif }
TempAwareCommLB::TempAwareCommLB(const CkLBOptions &opt): CBase_TempAwareCommLB(opt) { #ifdef TEMP_LDB lbname = "TempAwareCommLB"; if (CkMyPe()==0) CkPrintf("[%d] TempAwareCommLB created\n",CkMyPe()); starting=CmiWallTimer(); migFile=fopen("migInfo","w"); numAvailFreqs = 11; freqs=new int[numAvailFreqs]; freqsEffect=new int[numAvailFreqs]; // for tarekc cluster freqs[0] = 2395000; freqs[1] = 2394000; freqs[2] = 2261000; freqs[3] = 2128000; freqs[4] = 1995000; freqs[5] = 1862000; freqs[6] = 1729000; freqs[7] = 1596000; freqs[8] = 1463000; freqs[9] = 1330000; freqs[10] = 1197000; freqsEffect[0] = 1979886; freqsEffect[1] = 1943017; freqsEffect[2] = 1910989; freqsEffect[3] = 1876619; freqsEffect[4] = 1824126; freqsEffect[5] = 1763990; freqsEffect[6] = 1666773; freqsEffect[7] = 1560224; freqsEffect[8] = 1443154; freqsEffect[9] = 1317009; freqsEffect[10] = 1200000; procFreqPtr = new int[CkNumPes()]; for(int i=0;i<CkNumPes();i++) { char newfreq[10]; sprintf(newfreq,"%d",freqs[0]); cpufreq_sysfs_write(newfreq,i%physicalCoresPerNode); procFreqPtr[i]=0; } procFreq=NULL; procTemp=NULL; procFreqNew=NULL; procFreqNewEffect = NULL; avgChipTemp=NULL; char logFile[100]; snprintf(logFile, sizeof(logFile), "temp_freq.log.%d", CkMyPe()); if ((logFD = fopen(logFile, "a"))) { fprintf(logFD, "Time, PE, Temperature, Frequency\n"); } else { CkAbort("Couldn't open temperature/frequency log file"); } CcdCallOnConditionKeep(CcdPERIODIC_1second, &printCurrentTemperature, this); #else #endif }