public void initflow() { controller.initPowerCFG(settings); //init value counters log.WriteLog("init value counters: maxpwr = " + checker.getMaxPWR() + ", turbopwr = " + checker.getTurboPWR()); log.WriteLog("====================end of core init===================="); }
//generate CLK list //CLK = powerplan value, PWR = real clockspeed /* * profile number: (ascending order) * least = CPU high/ GPU low * most = CPU low/ GPU high * * **by default least is done to monitor correct cpu load for new apps. * * * * */ public void generateCLKlist(SettingsManager sm, TweakerChecker tc) { sm.IPClocked = true; if (!forceApply) { if ((sm.generatedCLK.getCount() > 1) && (sm.generatedXTU.getCount() > 1) && (sm.programs_running_cfg_cpu.getCount() > 1) && (sm.programs_running_cfg_xtu.getCount() > 1) ) { return; //all generated } } forceApply = false; int clkbackuph = getCLK(false); int clkbackupl = getCLK(true); float xtubackup = getXTU(); forceApply = true; sm.generatedCLK.configList.Clear(); sm.generatedXTU.configList.Clear(); sm.programs_running_cfg_cpu.configList.Clear(); sm.programs_running_cfg_xtu.configList.Clear(); //else log.WriteLog("================start of CLK + XTU list generation================"); log.WriteLog("do NOT run anything power intensive!!!"); Dictionary <int, int> hello = new Dictionary <int, int>(); int bcount = 0; //val int bcontender = 0; //key int prevPWR = int.MaxValue; int exPWR = prevPWR; //start looping from 100 down to 0 int x = 0; for (int i = 100; i >= 0; i--) { tc.resettick(); runpowercfg("/setdcvalueindex " + powerplan + " " + processor + " " + procsubh + " " + i); runpowercfg("/setacvalueindex " + powerplan + " " + processor + " " + procsubh + " " + i); runpowercfg("/setdcvalueindex " + powerplan + " " + processor + " " + procsubl + " " + i); runpowercfg("/setacvalueindex " + powerplan + " " + processor + " " + procsubl + " " + i); runpowercfg("/setactive " + powerplan); //apply if (prevPWR != tc.getPWR()) { prevPWR = tc.getPWR(); //add sm.generatedCLK.configList.Add(i, prevPWR); sm.programs_running_cfg_cpu.configList.Add(x++, i); log.WriteLog("new CLK: " + i + " clockspeed: " + prevPWR); //contender log.WriteLog("diff: " + (exPWR - prevPWR)); if (!hello.ContainsKey(exPWR - prevPWR)) { hello.Add(exPWR - prevPWR, 1); } else { hello[exPWR - prevPWR]++; } exPWR = prevPWR; } } //calculate artificial base xtu(basextu func unreliable) /* howto: * 1. find lowest clockspeed stepping difference(contender) * 2. maxxtu - (hi - lo cpustep) / contender * xtustep */ foreach (KeyValuePair <int, int> kv in hello) { if (bcount < kv.Value) { bcount = kv.Value; bcontender = kv.Key; } } log.WriteLog("bcontender: " + bcontender); BaseXTU = (float)Math.Round( (MaxXTU * 100 - (tc.getTurboPWR() - prevPWR) / bcontender * 50) / 100 * 2, MidpointRounding.AwayFromZero) / 2; //calculate proper xtu for each clk value float ratio = (MaxXTU - BaseXTU) * 100 / (tc.getTurboPWR() - (int)sm.generatedCLK.configList.Last().Value); float xtutemp = MaxXTU * 100; var listtemp = tc.sortedCLKlist(sm); try { foreach (int j in listtemp) { xtutemp -= ((int)sm.generatedCLK.configList[listtemp[x - 1]] - (int)sm.generatedCLK.configList[listtemp[x - 2]]) * ratio; float xtutemp2 = (float)Math.Round(xtutemp / 100 * 2, MidpointRounding.AwayFromZero) / 2; sm.generatedXTU.configList.Add(j, xtutemp2); sm.programs_running_cfg_xtu.configList.Add(--x, xtutemp2); log.WriteLog("new XTU: " + xtutemp2 + " for CLK: " + j); } } catch (Exception) { } sm.generatedXTU.configList.Add(100, BaseXTU); sm.programs_running_cfg_xtu.configList.Add(--x, BaseXTU); //write back log.WriteLog("writeback to file commencing..."); sm.generatedCLK.completeWriteBack(); sm.generatedXTU.completeWriteBack(); sm.programs_running_cfg_cpu.completeWriteBack(); sm.programs_running_cfg_xtu.completeWriteBack(); setCLK(sm, clkbackuph, false); //restore old clk setCLK(sm, clkbackupl, true); //restore old clk setXTU(sm, xtubackup); //restore old xtu log.WriteLog("================end of CLK + XTU list generation================"); sm.IPClocked = false; }