Esempio n. 1
0
File: REF_run.py Progetto: qshan/DEM
    def periodic(self, time, time_delta):
        if self.max_snapshots and self.num_snapshots > self.max_snapshots:
            self.num_snapshots /= 2
            for t in range(self.interval, time, self.interval * 2):
                sim.util.db_delete('periodic-%d' % t)
            self.interval *= 2

        if time >= self.next_interval:
            self.num_snapshots += 1
            sim.stats.write('periodic-%d' %
                            (self.num_snapshots * self.interval))
            #################################################
            ######### snapshot_last #########################
            snapshot_last = sniper_lib.get_results(
                resultsdir=sim.config.output_dir,
                partial=('periodic-%d' %
                         ((self.num_snapshots - 1) * self.interval),
                         'periodic-%d' %
                         ((self.num_snapshots) * self.interval)))['results']
            snapshot_all = sniper_lib.get_results(
                resultsdir=sim.config.output_dir,
                partial=('periodic-%d' % (0 * self.interval), 'periodic-%d' %
                         ((self.num_snapshots) * self.interval)))['results']
            CoreIns = snapshot_last['core.instructions']
            IdleTime = snapshot_last['performance_model.idle_elapsed_time']
            BusyTime = snapshot_last['performance_model.nonidle_elapsed_time']
            CycleCount = snapshot_last['performance_model.cycle_count']
            TotalTime = snapshot_last['performance_model.elapsed_time']
            Futex = snapshot_last['performance_model.cpiSyncFutex']
            L3_uncore_total_time = snapshot_last['L3.uncore-totaltime']
            nonidle_elapsed_total_time = snapshot_last[
                'performance_model.nonidle_elapsed_time']
            cpu_base_time = snapshot_last['interval_timer.cpiBase']

            stall_list = ['cpiBranchPredictor','cpiDataCachecache-remote','cpiDataCachedram','cpiDataCachedram-cache','cpiDataCachedram-local',\
                          'cpiDataCachedram-remote','cpiDataCacheL1','cpiDataCacheL1_S','cpiDataCacheL1I',\
                          'cpiDataCacheL2','cpiDataCacheL2_S','cpiDataCacheL3','cpiDataCacheL3_S','cpiDataCachemiss',\
                          'cpiDataCachenuca-cache','cpiDataCachepredicate-false','cpiDataCacheprefetch-no-mapping','cpiDataCacheunknown',\
                          'cpiInstructionCachecache-remote','cpiInstructionCachedram','cpiInstructionCachedram-cache',\
                          'cpiInstructionCachedram-local','cpiInstructionCachedram-remote','cpiInstructionCacheL1','cpiInstructionCacheL1_S',\
                          'cpiInstructionCacheL1I','cpiInstructionCacheL2','cpiInstructionCacheL2_S','cpiInstructionCacheL3',\
                          'cpiInstructionCacheL3_S','cpiInstructionCachemiss','cpiInstructionCachenuca-cache',\
                          'cpiInstructionCachepredicate-false','cpiInstructionCacheprefetch-no-mapping',\
                          'cpiInstructionCacheunknown','cpiLongLatency','cpiSerialization']

            for core in range(sim.config.ncores):
                self.IdleTimePerc[core] = float(IdleTime[core]) / float(
                    TotalTime[core])

            IPC = []
            CPI = []
            stall = []
            stall_cpi = []
            stall_time = [
            ]  #contains percentage of stall time/total time of the period
            cpu_busy_time = []
            futex_time = []
            stall_total_time = []  #contains counter time for for all the run
            L3_uncore_time = []
            nonidle_elapsed_time = []

            for core in range(sim.config.ncores):
                stall.append(0)
                stall_cpi.append(0.0)
                stall_time.append(0.0)
                IPC.append(0.0)
                CPI.append(0.0)
                cpu_busy_time.append(0.0)
                futex_time.append(0.0)
                stall_total_time.append(0)
                L3_uncore_time.append(0)
                nonidle_elapsed_time.append(0.0)

            for name in stall_list:
                stall_temp = snapshot_last['interval_timer.%s' % name]
                stall_temp_all = snapshot_all['interval_timer.%s' % name]
                for core in range(sim.config.ncores):
                    stall[core] += stall_temp[core]
                    stall_total_time[core] += stall_temp_all[core]

            for core in range(sim.config.ncores):
                #stall_cpi[core] =  float(stall[core]) / (CoreIns[core]*sim.dvfs.get_frequency(core) )
                stall_time[core] = float(stall[core]) / TotalTime[core]
                cpu_busy_time[core] = 1 - (self.IdleTimePerc[core] +
                                           stall_time[core])
                #cpu_busy_time[core]= cpu_base_time[core]
                futex_time[core] = float(Futex[core]) / TotalTime[core]
                L3_uncore_time[core] = float(
                    L3_uncore_total_time[core]) / TotalTime[core]
                nonidle_elapsed_time[core] = float(
                    nonidle_elapsed_total_time[core]) / TotalTime[core]

                print 'stall[%s]=%s\n' % (core, stall[core])
                # print 'cpi_stall[%s]=%s\n'%(core,stall_cpi[core])
                print 'time_stall[%s]=%s\n' % (core, stall_time[core])
                print 'idletimePerc[%s]=%s\n' % (core, self.IdleTimePerc[core])
                print 'non-stall-busy-time[%s]=%s\n' % (
                    core, 1 - (self.IdleTimePerc[core] + stall_time[core]))

            for core in range(sim.config.ncores):
                self.IdleTimePerc[core] = float(IdleTime[core]) / float(
                    TotalTime[core])

            IdleTimePercentage = IdleTime[0] / TotalTime[0]
            BusyTimePercentage = BusyTime[0] / TotalTime[
                0]  #just for the first core

            ##############CoreIns##############################################################
            self.Wfile_CoreIns = file(
                os.path.join(sim.config.output_dir, self.filename_CoreIns),
                'a')
            self.Wfile_CoreIns.write('\n')
            self.Wfile_CoreIns.write('%d\t' % (self.num_snapshots))
            self.Wfile_CoreIns.write('CoreIns')
            for core in range(sim.config.ncores):
                self.Wfile_CoreIns.write("\t%s" % CoreIns[core])
            self.Wfile_CoreIns.close()
            ##############IdleTime##############################################################
            self.Wfile_IdleTime = file(
                os.path.join(sim.config.output_dir, self.filename_IdleTime),
                'a')
            self.Wfile_IdleTime.write('\n')
            self.Wfile_IdleTime.write('%d\t' % (self.num_snapshots))
            self.Wfile_IdleTime.write('IdleTime')
            for core in range(sim.config.ncores):
                self.Wfile_IdleTime.write("\t%s" % IdleTime[core])
            self.Wfile_IdleTime.close()

            ##############IdleTimePerc##############################################################
            self.Wfile_IdleTimePerc = file(
                os.path.join(sim.config.output_dir,
                             self.filename_IdleTimePerc), 'a')
            self.Wfile_IdleTimePerc.write('\n')
            self.Wfile_IdleTimePerc.write('%d\t' % (self.num_snapshots))
            self.Wfile_IdleTimePerc.write('IdleTimePerc')
            for core in range(sim.config.ncores):
                self.Wfile_IdleTimePerc.write("\t%f" % self.IdleTimePerc[core])
            self.Wfile_IdleTimePerc.close()
            ########################################################################################
            #for core in range(sim.config.ncores):
            #   print ((sim.dvfs.get_frequency(core)/1000.0)*(self.interval/1000000))
            #raw_input()

            ############## IPC ##############################################################
            self.Wfile_IPC = file(
                os.path.join(sim.config.output_dir, self.filename_IPC), 'a')
            self.Wfile_IPC.write('\n')
            self.Wfile_IPC.write('%d\t' % (self.num_snapshots))
            self.Wfile_IPC.write('IPC')
            for core in range(sim.config.ncores):
                self.Wfile_IPC.write(
                    "\t%f" % (int(CoreIns[core]) /
                              ((sim.dvfs.get_frequency(core) / 1000.0) *
                               (self.interval / 1000000))))
                IPC[core] = (int(CoreIns[core]) /
                             ((sim.dvfs.get_frequency(core) / 1000.0) *
                              (self.interval / 1000000)))
            self.Wfile_IPC.close()

            ############## CPI ##############################################################
            self.Wfile_CPI = file(
                os.path.join(sim.config.output_dir, self.filename_CPI), 'a')
            self.Wfile_CPI.write('\n')
            self.Wfile_CPI.write('%d\t' % (self.num_snapshots))
            self.Wfile_CPI.write('CPI')
            for core in range(sim.config.ncores):
                if (CoreIns[core] == 0):
                    self.Wfile_CPI.write("\t0")
                    CPI[core] = 0.0
                else:
                    #self.Wfile_CPI.write("\t%f"%(float(cpu_base_time[core])/CoreIns[core]))
                    #CPI[core]=  float(cpu_base_time[core])/CoreIns[core]

                    self.Wfile_CPI.write("\t%f" % (1.0 / IPC[core]))
                    CPI[core] = 1.0 / IPC[core]


#         if ((int(CoreIns[core])/((sim.dvfs.get_frequency(core)/1000.0)*(self.interval/1000000))) == 0):
#		       self.Wfile_CPI.write ("\tinf")
#          else: self.Wfile_CPI.write("\t%f"%(1/(int(CoreIns[core])/((sim.dvfs.get_frequency(core)/1000.0)*(self.interval/1000000)))))

            self.Wfile_CPI.close()

            ############## stall_time ##############################################################
            self.Wfile_stall_time = file(
                os.path.join(sim.config.output_dir, self.filename_stall_time),
                'a')
            self.Wfile_stall_time.write('\n')
            self.Wfile_stall_time.write('%d\t' % (self.num_snapshots))
            self.Wfile_stall_time.write('stall_time')
            for core in range(sim.config.ncores):
                self.Wfile_stall_time.write("\t%s" % stall_time[core])
            self.Wfile_stall_time.close()

            ############## cpu_busy_time ############################################################## just the (busy_time - stalls)
            self.Wfile_cpu_busy_time = file(
                os.path.join(sim.config.output_dir,
                             self.filename_cpu_busy_time), 'a')
            self.Wfile_cpu_busy_time.write('\n')
            self.Wfile_cpu_busy_time.write('%d\t' % (self.num_snapshots))
            self.Wfile_cpu_busy_time.write('cpu_busy_time')
            for core in range(sim.config.ncores):
                self.Wfile_cpu_busy_time.write("\t%s" % cpu_busy_time[core])
            self.Wfile_cpu_busy_time.close()

            ##############L3_uncore_time##############################################################
            self.Wfile_L3_uncore_time = file(
                os.path.join(sim.config.output_dir,
                             self.filename_L3_uncore_time), 'a')
            self.Wfile_L3_uncore_time.write('\n')
            self.Wfile_L3_uncore_time.write('%d\t' % (self.num_snapshots))
            self.Wfile_L3_uncore_time.write('L3_uncore_time')
            for core in range(sim.config.ncores):
                self.Wfile_L3_uncore_time.write("\t%s" % L3_uncore_time[core])
            self.Wfile_L3_uncore_time.close()

            ############## timing_summary ############################################################## just the (busy_time - stalls)
            self.Wfile_timing_summary = file(
                os.path.join(sim.config.output_dir,
                             self.filename_timing_summary), 'a')
            self.Wfile_timing_summary.write('\n')
            self.Wfile_timing_summary.write('%d\t' % (self.num_snapshots))
            self.Wfile_timing_summary.write('timing_summary')
            for core in range(sim.config.ncores):
                self.Wfile_timing_summary.write(
                    "\t----\t%s\t%s\t1\t%s\t%s\t%s\t%s\t%s\t%s\t%s" %
                    (CoreIns[core], IPC[core],
                     (1 - self.IdleTimePerc[core]), cpu_busy_time[core],
                     stall_time[core], L3_uncore_time[core], futex_time[core],
                     cpu_base_time[core], stall_total_time[core]))
            self.Wfile_timing_summary.close()

            ################################ CacheMiss ########################################
            #periodic stat in stats file,
            #it also generates cachemiss files in the output
            gen_simout.generate_simout(
                resultsdir=sim.config.output_dir,
                partial=('periodic-%d' %
                         ((self.num_snapshots - 1) * self.interval),
                         'periodic-%d' %
                         ((self.num_snapshots) * self.interval)),
                output=open(
                    os.path.join(sim.config.output_dir,
                                 'stats/p%d.out' % self.num_snapshots), 'w'),
                silent=True)
            ########################################################################################

            print '\nperiodic-%d - periodic-%d\n' % (
                (self.num_snapshots * self.interval),
                ((self.num_snapshots - 1)))

            cycles = (
                self.stats['time'][core].delta -
                self.stats['ffwd_time'][core].delta
            ) * sim.dvfs.get_frequency(core) / 1e9  # convert fs to cycles
            instrs = self.stats['instrs'][core].delta
            ipc = instrs / (cycles or 1)  # Avoid division by zero
            #self.fd.write(' %.3f' % ipc)

            # include fast-forward IPCs
            cycles = self.stats['time'][core].delta * sim.dvfs.get_frequency(
                core) / 1e9  # convert fs to cycles
            instrs = self.stats['coreinstrs'][core].delta
            ipc = instrs / (cycles or 1)
            self.fd.write(' %.3f' % ipc)
            self.fd.write('\n')
            self.fd.write('periodic-%d' % (self.num_snapshots * self.interval))
            self.next_interval += self.interval
Esempio n. 2
0
    def periodic(self, time, time_delta):
        if self.max_snapshots and self.num_snapshots > self.max_snapshots:
            self.num_snapshots /= 2
            for t in range(self.interval, time, self.interval * 2):
                sim.util.db_delete('periodic-%d' % t)
            self.interval *= 2

        if time >= self.next_interval:
            self.num_snapshots += 1
            sim.stats.write('periodic-%d' %
                            (self.num_snapshots * self.interval))
            #################################################
            ######### snapshot_last #########################
            snapshot_last = sniper_lib.get_results(
                resultsdir=sim.config.output_dir,
                partial=('periodic-%d' %
                         ((self.num_snapshots - 1) * self.interval),
                         'periodic-%d' %
                         ((self.num_snapshots) * self.interval)))['results']
            snapshot_all = sniper_lib.get_results(
                resultsdir=sim.config.output_dir,
                partial=('periodic-%d' % (0 * self.interval), 'periodic-%d' %
                         ((self.num_snapshots) * self.interval)))['results']
            CoreIns = snapshot_last['core.instructions']
            IdleTime = snapshot_last['performance_model.idle_elapsed_time']
            BusyTime = snapshot_last['performance_model.nonidle_elapsed_time']
            CycleCount = snapshot_last['performance_model.cycle_count']
            TotalTime = snapshot_last['performance_model.elapsed_time']
            Futex = snapshot_last['performance_model.cpiSyncFutex']
            L3_uncore_total_time = snapshot_last['L3.uncore-totaltime']
            nonidle_elapsed_total_time = snapshot_last[
                'performance_model.nonidle_elapsed_time']
            cpu_base_time = snapshot_last['interval_timer.cpiBase']

            stall_list = ['cpiBranchPredictor','cpiDataCachecache-remote','cpiDataCachedram','cpiDataCachedram-cache','cpiDataCachedram-local',\
                          'cpiDataCachedram-remote','cpiDataCacheL1','cpiDataCacheL1_S','cpiDataCacheL1I',\
                          'cpiDataCacheL2','cpiDataCacheL2_S','cpiDataCacheL3','cpiDataCacheL3_S','cpiDataCachemiss',\
                          'cpiDataCachenuca-cache','cpiDataCachepredicate-false','cpiDataCacheprefetch-no-mapping','cpiDataCacheunknown',\
                          'cpiInstructionCachecache-remote','cpiInstructionCachedram','cpiInstructionCachedram-cache',\
                          'cpiInstructionCachedram-local','cpiInstructionCachedram-remote','cpiInstructionCacheL1','cpiInstructionCacheL1_S',\
                          'cpiInstructionCacheL1I','cpiInstructionCacheL2','cpiInstructionCacheL2_S','cpiInstructionCacheL3',\
                          'cpiInstructionCacheL3_S','cpiInstructionCachemiss','cpiInstructionCachenuca-cache',\
                          'cpiInstructionCachepredicate-false','cpiInstructionCacheprefetch-no-mapping',\
                          'cpiInstructionCacheunknown','cpiLongLatency','cpiSerialization']

            for core in range(sim.config.ncores):
                self.IdleTimePerc[core] = float(IdleTime[core]) / float(
                    TotalTime[core])

            IPC = []
            CPI = []
            stall = []
            stall_cpi = []
            stall_time = [
            ]  #contains percentage of stall time/total time of the period
            cpu_busy_time = []
            futex_time = []
            stall_total_time = []  #contains counter time for for all the run
            L3_uncore_time = []
            nonidle_elapsed_time = []

            for core in range(sim.config.ncores):
                stall.append(0)
                stall_cpi.append(0.0)
                stall_time.append(0.0)
                IPC.append(0.0)
                CPI.append(0.0)
                cpu_busy_time.append(0.0)
                futex_time.append(0.0)
                stall_total_time.append(0)
                L3_uncore_time.append(0)
                nonidle_elapsed_time.append(0.0)

            for name in stall_list:
                stall_temp = snapshot_last['interval_timer.%s' % name]
                stall_temp_all = snapshot_all['interval_timer.%s' % name]
                for core in range(sim.config.ncores):
                    stall[core] += stall_temp[core]
                    stall_total_time[core] += stall_temp_all[core]

            for core in range(sim.config.ncores):
                #stall_cpi[core] =  float(stall[core]) / (CoreIns[core]*sim.dvfs.get_frequency(core) )
                stall_time[core] = float(stall[core]) / TotalTime[core]
                cpu_busy_time[core] = 1 - (self.IdleTimePerc[core] +
                                           stall_time[core])
                #cpu_busy_time[core]= cpu_base_time[core]
                futex_time[core] = float(Futex[core]) / TotalTime[core]
                L3_uncore_time[core] = float(
                    L3_uncore_total_time[core]) / TotalTime[core]
                nonidle_elapsed_time[core] = float(
                    nonidle_elapsed_total_time[core]) / TotalTime[core]

                print 'stall[%s]=%s\n' % (core, stall[core])
                # print 'cpi_stall[%s]=%s\n'%(core,stall_cpi[core])
                print 'time_stall[%s]=%s\n' % (core, stall_time[core])
                print 'idletimePerc[%s]=%s\n' % (core, self.IdleTimePerc[core])
                print 'non-stall-busy-time[%s]=%s\n' % (
                    core, 1 - (self.IdleTimePerc[core] + stall_time[core]))

            for core in range(sim.config.ncores):
                self.IdleTimePerc[core] = float(IdleTime[core]) / float(
                    TotalTime[core])

            IdleTimePercentage = IdleTime[0] / TotalTime[0]
            BusyTimePercentage = BusyTime[0] / TotalTime[
                0]  #just for the first core

            ##############CoreIns##############################################################
            self.Wfile_CoreIns = file(
                os.path.join(sim.config.output_dir, self.filename_CoreIns),
                'a')
            self.Wfile_CoreIns.write('\n')
            self.Wfile_CoreIns.write('%d\t' % (self.num_snapshots))
            self.Wfile_CoreIns.write('CoreIns')
            for core in range(sim.config.ncores):
                self.Wfile_CoreIns.write("\t%s" % CoreIns[core])
            self.Wfile_CoreIns.close()
            ##############IdleTime##############################################################
            self.Wfile_IdleTime = file(
                os.path.join(sim.config.output_dir, self.filename_IdleTime),
                'a')
            self.Wfile_IdleTime.write('\n')
            self.Wfile_IdleTime.write('%d\t' % (self.num_snapshots))
            self.Wfile_IdleTime.write('IdleTime')
            for core in range(sim.config.ncores):
                self.Wfile_IdleTime.write("\t%s" % IdleTime[core])
            self.Wfile_IdleTime.close()

            ##############IdleTimePerc##############################################################
            self.Wfile_IdleTimePerc = file(
                os.path.join(sim.config.output_dir,
                             self.filename_IdleTimePerc), 'a')
            self.Wfile_IdleTimePerc.write('\n')
            self.Wfile_IdleTimePerc.write('%d\t' % (self.num_snapshots))
            self.Wfile_IdleTimePerc.write('IdleTimePerc')
            for core in range(sim.config.ncores):
                self.Wfile_IdleTimePerc.write("\t%f" % self.IdleTimePerc[core])
            self.Wfile_IdleTimePerc.close()
            ########################################################################################
            #for core in range(sim.config.ncores):
            #   print ((sim.dvfs.get_frequency(core)/1000.0)*(self.interval/1000000))
            #raw_input()

            ############## IPC ##############################################################
            self.Wfile_IPC = file(
                os.path.join(sim.config.output_dir, self.filename_IPC), 'a')
            self.Wfile_IPC.write('\n')
            self.Wfile_IPC.write('%d\t' % (self.num_snapshots))
            self.Wfile_IPC.write('IPC')
            for core in range(sim.config.ncores):
                self.Wfile_IPC.write(
                    "\t%f" % (int(CoreIns[core]) /
                              ((sim.dvfs.get_frequency(core) / 1000.0) *
                               (self.interval / 1000000))))
                IPC[core] = (int(CoreIns[core]) /
                             ((sim.dvfs.get_frequency(core) / 1000.0) *
                              (self.interval / 1000000)))
            self.Wfile_IPC.close()

            ############## CPI ##############################################################
            self.Wfile_CPI = file(
                os.path.join(sim.config.output_dir, self.filename_CPI), 'a')
            self.Wfile_CPI.write('\n')
            self.Wfile_CPI.write('%d\t' % (self.num_snapshots))
            self.Wfile_CPI.write('CPI')
            for core in range(sim.config.ncores):
                if (CoreIns[core] == 0):
                    self.Wfile_CPI.write("\t0")
                    CPI[core] = 0.0
                else:
                    #self.Wfile_CPI.write("\t%f"%(float(cpu_base_time[core])/CoreIns[core]))
                    #CPI[core]=  float(cpu_base_time[core])/CoreIns[core]

                    self.Wfile_CPI.write("\t%f" % (1.0 / IPC[core]))
                    CPI[core] = 1.0 / IPC[core]


#         if ((int(CoreIns[core])/((sim.dvfs.get_frequency(core)/1000.0)*(self.interval/1000000))) == 0):
#		       self.Wfile_CPI.write ("\tinf")
#          else: self.Wfile_CPI.write("\t%f"%(1/(int(CoreIns[core])/((sim.dvfs.get_frequency(core)/1000.0)*(self.interval/1000000)))))

            self.Wfile_CPI.close()

            ############## stall_time ##############################################################
            self.Wfile_stall_time = file(
                os.path.join(sim.config.output_dir, self.filename_stall_time),
                'a')
            self.Wfile_stall_time.write('\n')
            self.Wfile_stall_time.write('%d\t' % (self.num_snapshots))
            self.Wfile_stall_time.write('stall_time')
            for core in range(sim.config.ncores):
                self.Wfile_stall_time.write("\t%s" % stall_time[core])
            self.Wfile_stall_time.close()

            ############## cpu_busy_time ############################################################## just the (busy_time - stalls)
            self.Wfile_cpu_busy_time = file(
                os.path.join(sim.config.output_dir,
                             self.filename_cpu_busy_time), 'a')
            self.Wfile_cpu_busy_time.write('\n')
            self.Wfile_cpu_busy_time.write('%d\t' % (self.num_snapshots))
            self.Wfile_cpu_busy_time.write('cpu_busy_time')
            for core in range(sim.config.ncores):
                self.Wfile_cpu_busy_time.write("\t%s" % cpu_busy_time[core])
            self.Wfile_cpu_busy_time.close()

            ##############L3_uncore_time##############################################################
            self.Wfile_L3_uncore_time = file(
                os.path.join(sim.config.output_dir,
                             self.filename_L3_uncore_time), 'a')
            self.Wfile_L3_uncore_time.write('\n')
            self.Wfile_L3_uncore_time.write('%d\t' % (self.num_snapshots))
            self.Wfile_L3_uncore_time.write('L3_uncore_time')
            for core in range(sim.config.ncores):
                self.Wfile_L3_uncore_time.write("\t%s" % L3_uncore_time[core])
            self.Wfile_L3_uncore_time.close()

            ############## timing_summary ############################################################## just the (busy_time - stalls)
            self.Wfile_timing_summary = file(
                os.path.join(sim.config.output_dir,
                             self.filename_timing_summary), 'a')
            self.Wfile_timing_summary.write('\n')
            self.Wfile_timing_summary.write('%d\t' % (self.num_snapshots))
            self.Wfile_timing_summary.write('timing_summary')
            for core in range(sim.config.ncores):
                self.Wfile_timing_summary.write(
                    "\t----\t%s\t%s\t1\t%s\t%s\t%s\t%s\t%s\t%s\t%s" %
                    (CoreIns[core], IPC[core],
                     (1 - self.IdleTimePerc[core]), cpu_busy_time[core],
                     stall_time[core], L3_uncore_time[core], futex_time[core],
                     cpu_base_time[core], stall_total_time[core]))
            self.Wfile_timing_summary.close()

            ################################ CacheMiss ########################################
            #periodic stat in stats file,
            #it also generates cachemiss files in the output
            gen_simout.generate_simout(
                resultsdir=sim.config.output_dir,
                partial=('periodic-%d' %
                         ((self.num_snapshots - 1) * self.interval),
                         'periodic-%d' %
                         ((self.num_snapshots) * self.interval)),
                output=open(
                    os.path.join(sim.config.output_dir,
                                 'stats/p%d.out' % self.num_snapshots), 'w'),
                silent=True)
            ########################################################################################

            print '\nperiodic-%d - periodic-%d\n' % (
                (self.num_snapshots * self.interval),
                ((self.num_snapshots - 1)))
            print 'CoreIns= %s' % CoreIns
            print 'IdleTime= %s' % IdleTime
            print 'BusyTime= %s' % BusyTime
            print 'CycleCount= %s' % CycleCount
            print 'TotalTime= %s' % TotalTime

            ##############################################################
            ################# Kalman #####################################
            #self.predicted_CoreIns[core][self.num_snapshots-1]

            os.system ("%skalman/build/kalman-test %s %s"%(sniper_path, os.path.join(sim.config.output_dir, self.filename_CoreIns),\
                        os.path.join(sim.config.output_dir, self.filename_kalmanOut_CoreIns)))
            os.system ("%skalman/build/kalman-test %s %s"%(sniper_path, os.path.join(sim.config.output_dir, self.filename_CPI),\
                        os.path.join(sim.config.output_dir, self.filename_kalmanOut_CPI)))
            '''
      os.system ("%skalman/build/kalman-test %s %s"%(sniper_path, os.path.join(sim.config.output_dir, self.filename_IdleTimePerc),\
                  os.path.join(sim.config.output_dir, self.filename_kalmanOut_IdleTimePerc)))
      os.system ("%skalman/build/kalman-test %s %s"%(sniper_path, os.path.join(sim.config.output_dir, self.filename_IPC),\
                  os.path.join(sim.config.output_dir, self.filename_kalmanOut_IPC)))
      os.system ("%skalman/build/kalman-test %s %s"%(sniper_path, os.path.join(sim.config.output_dir, self.filename_cpu_busy_time),\
                  os.path.join(sim.config.output_dir, self.filename_kalmanOut_cpu_busy_time)))
      os.system ("%skalman/build/kalman-test %s %s"%(sniper_path, os.path.join(sim.config.output_dir, self.filename_stall_time),\
                  os.path.join(sim.config.output_dir, self.filename_kalmanOut_stall_time)))
      os.system ("%skalman/build/kalman-test %s %s"%(sniper_path, os.path.join(sim.config.output_dir, self.filename_L3_uncore_time),\
                  os.path.join(sim.config.output_dir, self.filename_kalmanOut_L3_uncore_time)))
      '''
            #os.system ("%skalman/build/kalman-test %s %s"%(sniper_path, os.path.join(sim.config.output_dir, self.filename_Workload), os.path.join(sim.config.output_dir, self.filename_kalmanOut_Workload)))

            ##############################################################
            ############### Get Kalman predicted results ################
            ######### kalmanOut_CoreIns
            self.Rfile_kalmanOut_CoreIns = file(
                os.path.join(sim.config.output_dir,
                             self.filename_kalmanOut_CoreIns), 'r')
            total_line_count = -1
            for line in self.Rfile_kalmanOut_CoreIns:
                total_line_count += 1

            self.Rfile_kalmanOut_CoreIns = file(
                os.path.join(sim.config.output_dir,
                             self.filename_kalmanOut_CoreIns), 'r')
            line_count = -1
            for line in self.Rfile_kalmanOut_CoreIns:
                line_splitted = line.split('\t')
                line_count += 1
                if (line_count >= 2) and (line_count == total_line_count):
                    for core in range(sim.config.ncores):
                        self.predicted_CoreIns[core].append(
                            float(line_splitted[5 * core +
                                                3]))  #offset=3  in the file
            '''
      #note: self.predicted_CoreIns[core][self.num_snapshots-1] shows the last prediction for core= ...
      ######## kalmanOut_IdleTimePerc   
      self.Rfile_kalmanOut_IdleTimePerc = file(os.path.join(sim.config.output_dir, self.filename_kalmanOut_IdleTimePerc), 'r')
      line_count=-1
      for line in self.Rfile_kalmanOut_IdleTimePerc:
          line_splitted = line.split('\t')
          line_count+=1
          if (line_count>=2) and (line_count == total_line_count): 
              for core in range(sim.config.ncores):
				  self.predicted_IdleTimePerc[core].append(float(line_splitted[5*core+3]))  #offset=3  in the file 

      ######## kalmanOut_IPC   
      self.Rfile_kalmanOut_IPC = file(os.path.join(sim.config.output_dir, self.filename_kalmanOut_IPC), 'r')
      line_count=-1
      for line in self.Rfile_kalmanOut_IPC:
          line_splitted = line.split('\t')
          line_count+=1
          if (line_count>=2) and (line_count == total_line_count): 
              for core in range(sim.config.ncores):
				  self.predicted_IPC[core].append(float(line_splitted[5*core+3]))  #offset=3  in the file 

      ######## kalmanOut_cpu_busy_time   
      self.Rfile_kalmanOut_cpu_busy_time = file(os.path.join(sim.config.output_dir, self.filename_kalmanOut_cpu_busy_time), 'r')
      line_count=-1
      for line in self.Rfile_kalmanOut_cpu_busy_time:
          line_splitted = line.split('\t')
          line_count+=1
          if (line_count>=2) and (line_count == total_line_count): 
              for core in range(sim.config.ncores):
				  self.predicted_cpu_busy_time[core].append(float(line_splitted[5*core+3]))  #offset=3  in the file 

      ######## kalmanOut_stall_time   
      self.Rfile_kalmanOut_stall_time = file(os.path.join(sim.config.output_dir, self.filename_kalmanOut_stall_time), 'r')
      line_count=-1
      for line in self.Rfile_kalmanOut_stall_time:
          line_splitted = line.split('\t')
          line_count+=1
          if (line_count>=2) and (line_count == total_line_count): 
              for core in range(sim.config.ncores):
				  self.predicted_stall_time[core].append(float(line_splitted[5*core+3]))  #offset=3  in the file 
      '''
            ######## kalmanOut_CPI
            self.Rfile_kalmanOut_CPI = file(
                os.path.join(sim.config.output_dir,
                             self.filename_kalmanOut_CPI), 'r')
            line_count = -1
            for line in self.Rfile_kalmanOut_CPI:
                line_splitted = line.split('\t')
                line_count += 1
                if (line_count >= 2) and (line_count == total_line_count):
                    for core in range(sim.config.ncores):
                        self.predicted_CPI[core].append(
                            float(line_splitted[5 * core +
                                                3]))  #offset=3  in the file
            '''
      ######## kalmanOut_L3_uncore_time   
      self.Rfile_kalmanOut_L3_uncore_time = file(os.path.join(sim.config.output_dir, self.filename_kalmanOut_L3_uncore_time), 'r')
      line_count=-1
      for line in self.Rfile_kalmanOut_L3_uncore_time:
          line_splitted = line.split('\t')
          line_count+=1
          if (line_count>=2) and (line_count == total_line_count): 
              for core in range(sim.config.ncores):
				  self.predicted_L3_uncore_time[core].append(float(line_splitted[5*core+3]))  #offset=3  in the file 
      '''

            ######## kalmanOut_Workload
            #self.Rfile_kalmanOut_Workload = file(os.path.join(sim.config.output_dir, self.filename_kalmanOut_Workload), 'r')
            #line_count=-1
            #for line in self.Rfile_kalmanOut_Workload:
            #    print line
            #    line_splitted = line.split('\t')
            #    line_count+=1
            #    print line_count
            #    print total_line_count
            #    print "YEYEYEYEYE"
            #    if (line_count>=2) and (line_count == total_line_count-1):# -1
            #        print "yes"
            #        for core in range(sim.config.ncores):
            #			  self.predicted_Workload[core].append(float(line_splitted[5*core+3]))  #offset=3  in the file

            print "last predictions for core 0: "
            print "CoreIns: %s" % self.predicted_CoreIns[0][self.num_snapshots
                                                            - 1]
            #print "IdleTimePerc: %s"%self.predicted_IdleTimePerc[0][self.num_snapshots-1]
            #print "IPC: %s"%self.predicted_IPC[0][self.num_snapshots-1]
            #print "cpu_cpu_busy_time: %s"%self.predicted_cpu_busy_time[0][self.num_snapshots-1]
            #print "cpu_stall_time: %s"%self.predicted_stall_time[0][self.num_snapshots-1]
            #print "L3_uncore_time: %s"%self.predicted_L3_uncore_time[0][self.num_snapshots-1]
            print "CPI: %s" % self.predicted_CPI[0][self.num_snapshots - 1]
            #print "Workload: %s"%self.predicted_Workload[0][self.num_snapshots-2]
            #raw_input()

            ##############################################################
            ################# DVFS #######################################
            if self.DVFS:
                FreqList = [
                    '1000', '1100', '1200', '1300', '1400', '1500', '1600',
                    '1700', '1800', '1900', '2000'
                ]
                AllowedPerformanceLoss = 0.50
                freq_H = 2000.0
                T = self.interval
                self.fd.write('%u' % (time / 1e6))  # Time in ns
                #currrent_freq = sim.dvfs.get_frequency(0)
                #currrent_freq -= 100

                #self.TotalWork+=1

                for core in range(sim.config.ncores):
                    freq_P = sim.dvfs.get_frequency(core)
                    CPI_P = CPI[core]
                    I_P = CoreIns[core]
                    self.T_delay[core] += (I_P * (freq_H / freq_P - 1) *
                                           CPI_P) / freq_H
                    self.T_ref[core] += (I_P * CPI_P) / freq_P
                    #self.T_delay[core] += (cpu_busy_time[core]*(freq_H/freq_P-1))/freq_H
                    #self.T_ref[core] += (cpu_busy_time[core])/freq_P
                    #self.T_delay[core] += (((freq_H/freq_P)-1)/freq_P)*(cpu_busy_time[core]/freq_H + L3_uncore_time[core]/freq_P) #multiplied by T
                    #self.T_ref[core] += ((cpu_busy_time[core] + L3_uncore_time[core])/freq_P*freq_P) #multiplied by T
                    #self.T_delay[core] += ((freq_H/freq_P)-1) * ( (freq_P/freq_H)*cpu_busy_time[core] + L3_uncore_time[core] )
                    #self.T_ref[core] += cpu_busy_time[core] + L3_uncore_time[core]
                    #self.T_delay[core] += ((freq_H/freq_P)-1) * ( (freq_P/freq_H)*cpu_busy_time[core] + stall_time[core] )
                    #self.T_ref[core] += cpu_busy_time[core] + stall_time[core]
                    #self.T_delay[core] += ((freq_H/freq_P)-1) * ( (freq_P/freq_H)*cpu_busy_time[core] )
                    #self.T_ref[core] += cpu_busy_time[core]

                    if self.T_ref[core] == 0:
                        self.PF[core] = 0
                    else:
                        self.PF[core] = self.T_delay[core] / self.T_ref[core]
                    print "PF[%d]=%s" % (core, self.PF[core])
                    print "PF[%d]=%s, delay=%s, ref=%s, freq=%s" % (
                        core, self.PF[core], self.T_delay[core],
                        self.T_ref[core], freq_P)
                    #raw_input()

                    #self.TotalInstDone[core]+= CoreIns[core]*(2000.0/sim.dvfs.get_frequency(core))
                    self.TotalInstDone[core] += CoreIns[core]
                    if (self.TotalInstDone[core] != 0):
                        self.InstLoss[core] = CoreIns[core] * (
                            freq_H / freq_P - 1)
                        self.InstDone[core] = CoreIns[core]
                        self.InstLossRate[core] = (
                            1 - (sim.dvfs.get_frequency(core) / 2000.0))
                        self.Inst_for_freq_H[core] = CoreIns[core] * (freq_H /
                                                                      freq_P)

                        self.TotalInst_for_freq_H[
                            core] += self.Inst_for_freq_H[core]
                        self.TotallInstLoss[core] += CoreIns[core] * (
                            1 - (sim.dvfs.get_frequency(core) / 2000.0))
                        self.TotallInstDone[core] += CoreIns[core]
                        self.TotalInstLossRate[core] = self.TotallInstLoss[
                            core] / self.TotalInstDone[core]
                    #self.ExpectedWorkDone[core]+=(2000/sim.dvfs.get_frequency(core))
                    #ExpectedRemainedWork[core]=TotalWork-ExpectedWorkDone[core]
                    self.fd.write(' f: %.2fGHz' %
                                  (sim.dvfs.get_frequency(core) / 1000.0))
                #raw_input()
                ##############SummaryDVFS##############################################################
                self.Wfile_SummaryDVFS = file(
                    os.path.join(sim.config.output_dir,
                                 self.filename_SummaryDVFS), 'a')
                self.Wfile_SummaryDVFS.write('\n')
                self.Wfile_SummaryDVFS.write('%d\t' % (self.num_snapshots))
                self.Wfile_SummaryDVFS.write('CoreIns')
                for core in range(sim.config.ncores):
                    self.Wfile_SummaryDVFS.write("\t\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t"%(core,sim.dvfs.get_frequency(core),self.InstDone[core],\
                               self.PredictedInstDone[core],self.Inst_for_freq_H[core],self.PredictedInst_for_freq_H[core],self.InstLoss[core],\
                               self.PredictedInstLoss[core],self.InstLossRate[core],self.PredictedInstLossRate[core],self.TotallInstDone[core],\
                               self.PredictedTotalInstDone[core],self.TotalInstLossRate[core],self.PredictedTotalInstLossRate[core],self.PF[core],self.PF_next[core]))
                self.Wfile_SummaryDVFS.close()
                ########################################################################################
                for core in range(sim.config.ncores):
                    if (self.num_snapshots > 2):
                        freq_set = 0

                        for freq in FreqList:  #from low freq to high freq
                            freq_P_next = float(freq)
                            if (freq_set == 0):
                                CPI_P_next = self.predicted_CPI[core][
                                    self.num_snapshots - 1]
                                I_P_next = self.predicted_CoreIns[core][
                                    self.num_snapshots - 1]
                                #cpu_busy_time_next = self.predicted_cpu_busy_time[core][self.num_snapshots-1]
                                #L3_uncore_time_next = self.predicted_L3_uncore_time[core][self.num_snapshots-1]
                                #stall_time_next = self.predicted_stall_time[core][self.num_snapshots-1]

                                self.T_delay_next[core] = (
                                    I_P_next * (freq_H / freq_P_next - 1) *
                                    CPI_P_next) / freq_H + self.T_delay[core]
                                self.T_ref_next[core] = (
                                    I_P_next * CPI_P_next
                                ) / freq_P_next + self.T_ref[core]
                                #self.T_delay_next[core] = (int(self.predicted_cpu_busy_time[core][self.num_snapshots-1])*(freq_H/freq_P_next-1))/freq_H + self.T_delay[core]
                                #self.T_ref_next[core] = int(self.predicted_cpu_busy_time[core][self.num_snapshots-1])/freq_P_next + self.T_ref[core]
                                #self.T_delay_next[core] = (((freq_H/freq_P_next)-1)/freq_P_next)*(cpu_busy_time_next/freq_H + L3_uncore_time_next/freq_P_next)+self.T_delay[core]
                                #self.T_ref_next[core] = ((cpu_busy_time_next + L3_uncore_time_next)/freq_P_next*freq_P_next)+self.T_ref[core]
                                #self.T_delay_next[core] = ((freq_H/freq_P_next)-1) * ( (freq_P_next/freq_H)*cpu_busy_time_next + L3_uncore_time_next ) + self.T_delay[core]
                                #self.T_ref_next[core] = cpu_busy_time_next + L3_uncore_time_next + self.T_ref[core]
                                #self.T_delay_next[core] = ((freq_H/freq_P_next)-1) * ( (freq_P_next/freq_H)*cpu_busy_time_next + stall_time_next ) + self.T_delay[core]
                                #self.T_ref_next[core] = cpu_busy_time_next + stall_time_next + self.T_ref[core]

                                #self.T_delay_next[core] = ((freq_H/freq_P_next)-1) * ( (freq_P_next/freq_H)*cpu_busy_time_next ) + self.T_delay[core]
                                #self.T_ref_next[core] = cpu_busy_time_next + self.T_ref[core]

                                if self.T_ref_next[core] == 0:
                                    self.PF_next[core] = 0
                                else:
                                    self.PF_next[core] = self.T_delay_next[
                                        core] / self.T_ref_next[core]

                                print "PF_next[%d]=%s,delay=%s,ref=%s,freq_next=%s" % (
                                    core, self.PF_next[core],
                                    self.T_delay_next[core],
                                    self.T_ref_next[core], freq_P_next)
                                #raw_input()
                                self.PredictedInstLoss[core] = int(
                                    self.predicted_CoreIns[core][
                                        self.num_snapshots -
                                        1]) * (freq_H / freq_P_next - 1)
                                self.PredictedInstDone[
                                    core] = self.predicted_CoreIns[core][
                                        self.num_snapshots - 1]
                                self.PredictedInst_for_freq_H[
                                    core] = self.predicted_CoreIns[core][
                                        self.num_snapshots - 1] * (freq_H /
                                                                   freq_P_next)
                                if self.PredictedInstDone[core] == 0:
                                    self.PredictedInstLossRate[core] = 0
                                else:
                                    self.PredictedInstLossRate[core] = float(
                                        self.PredictedInstLoss[core]
                                    ) / self.PredictedInstDone[core]
                                self.PredictedTotalInst_for_freq_H[
                                    core] = self.PredictedInst_for_freq_H[
                                        core] + self.TotalInst_for_freq_H[core]
                                self.PredictedTotalInstLoss[
                                    core] = self.PredictedInstLoss[
                                        core] + self.TotallInstLoss[core]
                                self.PredictedTotalInstDone[
                                    core] = self.PredictedInstDone[
                                        core] + self.TotalInstDone[core]
                                if (self.PredictedTotalInstDone[core] == 0):
                                    self.PredictedTotalInstLossRate[core] = 0
                                else:
                                    self.PredictedTotalInstLossRate[
                                        core] = float(
                                            self.PredictedTotalInstLoss[core]
                                        ) / self.PredictedTotalInstDone[core]
                                #if (self.PredictedTotalInstLossRate[core] < AllowedPerformanceLoss):
                                if (self.PF_next[core] <
                                        AllowedPerformanceLoss):
                                    sim.dvfs.set_frequency(
                                        core, int(freq_P_next))
                                    freq_set = 1

                        if (
                                freq_set == 0
                        ):  #any of the frequencies not proper. we use the highest not to let the loss increase
                            sim.dvfs.set_frequency(core, int(freq_H))

    #if (core==0)or(core==4)or(core==8)or(core==12):
    #if (core==0):
        #      sim.dvfs.set_frequency(core,5000)

                    cycles = (self.stats['time'][core].delta -
                              self.stats['ffwd_time'][core].delta
                              ) * sim.dvfs.get_frequency(
                                  core) / 1e9  # convert fs to cycles
                    instrs = self.stats['instrs'][core].delta
                    ipc = instrs / (cycles or 1)  # Avoid division by zero
                    #self.fd.write(' %.3f' % ipc)

                    # include fast-forward IPCs
                    cycles = self.stats['time'][
                        core].delta * sim.dvfs.get_frequency(
                            core) / 1e9  # convert fs to cycles
                    instrs = self.stats['coreinstrs'][core].delta
                    ipc = instrs / (cycles or 1)
                    self.fd.write(' %.3f' % ipc)
                self.fd.write('\n')
                #raw_input()
            ##############################################################
            #os.system("/home/milad/sniper/tools/dumpstats.py --partial periodic-%d:periodic-%d | grep power.Core"%( ((self.num_snapshots-1) *self.interval), ((self.num_snapshots) *self.interval ) ) )

            #raw_input(); #getch
            self.fd.write('periodic-%d' % (self.num_snapshots * self.interval))

            #periodic stat in stats file
            #gen_simout.generate_simout(resultsdir = sim.config.output_dir, partial = ('periodic-%d' % ((self.num_snapshots-1) *self.interval), 'periodic-%d' % ((self.num_snapshots) *self.interval ) ), output = open(os.path.join(sim.config.output_dir, 'stats/p%d.out'%self.num_snapshots), 'w'), silent = True)
            #gen_simout.generate_simout(resultsdir = sim.config.output_dir, partial = ('periodic-10000000000','periodic-20000000000'), output = open(os.path.join(sim.config.output_dir, 'stats/p%d.out'%self.num_snapshots), 'w'), silent = True)

            self.next_interval += self.interval
Esempio n. 3
0
    def periodic(self, time, time_delta):
        if self.max_snapshots and self.num_snapshots > self.max_snapshots:
            self.num_snapshots /= 2
            for t in range(self.interval, time, self.interval * 2):
                sim.util.db_delete('periodic-%d' % t)
            self.interval *= 2

        if time >= self.next_interval:
            self.num_snapshots += 1
            sim.stats.write('periodic-%d' %
                            (self.num_snapshots * self.interval))
            #################################################
            ######### snapshot_last #########################
            snapshot_last = sniper_lib.get_results(
                resultsdir=sim.config.output_dir,
                partial=('periodic-%d' %
                         ((self.num_snapshots - 1) * self.interval),
                         'periodic-%d' %
                         ((self.num_snapshots) * self.interval)))['results']
            CoreIns = snapshot_last['core.instructions']
            IdleTime = snapshot_last['performance_model.idle_elapsed_time']
            BusyTime = snapshot_last['performance_model.nonidle_elapsed_time']
            CycleCount = snapshot_last['performance_model.cycle_count']
            TotalTime = snapshot_last['performance_model.elapsed_time']

            for core in range(sim.config.ncores):
                self.IdleTimePerc[core] = float(IdleTime[core]) / float(
                    TotalTime[core])

            IdleTimePercentage = IdleTime[0] / TotalTime[0]
            BusyTimePercentage = BusyTime[0] / TotalTime[
                0]  #just for the first core

            ##############CoreIns##############################################################
            self.Wfile_CoreIns = file(
                os.path.join(sim.config.output_dir, self.filename_CoreIns),
                'a')
            self.Wfile_CoreIns.write('\n')
            self.Wfile_CoreIns.write('%d\t' % (self.num_snapshots))
            self.Wfile_CoreIns.write('CoreIns')
            for core in range(sim.config.ncores):
                self.Wfile_CoreIns.write("\t%s" % CoreIns[core])
            self.Wfile_CoreIns.close()

            ##############IdleTime##############################################################
            self.Wfile_IdleTime = file(
                os.path.join(sim.config.output_dir, self.filename_IdleTime),
                'a')
            self.Wfile_IdleTime.write('\n')
            self.Wfile_IdleTime.write('%d\t' % (self.num_snapshots))
            self.Wfile_IdleTime.write('IdleTime')
            for core in range(sim.config.ncores):
                self.Wfile_IdleTime.write("\t%s" % IdleTime[core])
            self.Wfile_IdleTime.close()

            ##############IdleTimePerc##############################################################
            self.Wfile_IdleTimePerc = file(
                os.path.join(sim.config.output_dir,
                             self.filename_IdleTimePerc), 'a')
            self.Wfile_IdleTimePerc.write('\n')
            self.Wfile_IdleTimePerc.write('%d\t' % (self.num_snapshots))
            self.Wfile_IdleTimePerc.write('IdleTimePerc')
            for core in range(sim.config.ncores):
                self.Wfile_IdleTimePerc.write("\t%f" % self.IdleTimePerc[core])
            self.Wfile_IdleTimePerc.close()
            ########################################################################################

            print '\nperiodic-%d - periodic-%d\n' % (
                (self.num_snapshots * self.interval),
                ((self.num_snapshots - 1)))
            print 'CoreIns= %s' % CoreIns
            print 'IdleTime= %s' % IdleTime
            print 'BusyTime= %s' % BusyTime
            print 'CycleCount= %s' % CycleCount
            print 'TotalTime= %s' % TotalTime

            ##############################################################
            ################# Kalman #####################################
            #self.predicted_CoreIns[core][self.num_snapshots-1]

            os.system(
                "%skalman/build/kalman-test %s %s" %
                (sniper_path,
                 os.path.join(sim.config.output_dir, self.filename_CoreIns),
                 os.path.join(sim.config.output_dir, self.filename_kalmanOut)))

            ##############################################################
            ############### Get Kalman predicted results ################
            self.Rfile_kalmanOut = file(
                os.path.join(sim.config.output_dir, self.filename_kalmanOut),
                'r')
            total_line_count = -1
            for line in self.Rfile_kalmanOut:
                total_line_count += 1

            self.Rfile_kalmanOut = file(
                os.path.join(sim.config.output_dir, self.filename_kalmanOut),
                'r')
            line_count = -1
            for line in self.Rfile_kalmanOut:
                line_splitted = line.split('\t')
                line_count += 1
                if (line_count >= 2) and (
                        line_count == total_line_count
                ):  #stats_lines (we dont read last line, it just has the predicted value not the future one)
                    for core in range(sim.config.ncores):
                        self.predicted_CoreIns[core].append(
                            float(line_splitted[5 * core +
                                                3]))  #offset=4  in the file

            ##############################################################
            ################# DVFS #######################################
            if self.DVFS:
                self.fd.write('%u' % (time / 1e6))  # Time in ns
                for core in range(sim.config.ncores):
                    # detailed-only IPC
                    self.fd.write(' f: %.2fGHz' %
                                  (sim.dvfs.get_frequency(core) / 1000.0))
                    #raw_input()
                    #if (self.IdleTimePerc[core]>0.4):
                    #if (core==0):
                    if (self.num_snapshots % 2 == 0):
                        #if (self.predicted_CoreIns[core][self.num_snapshots-1] < 2000.0) :
                        sim.dvfs.set_frequency(core, 3000)
                    else:
                        sim.dvfs.set_frequency(core, 1500)

                    print "predicted: "
                    print self.predicted_CoreIns[core][self.num_snapshots - 1]

                    cycles = (self.stats['time'][core].delta -
                              self.stats['ffwd_time'][core].delta
                              ) * sim.dvfs.get_frequency(
                                  core) / 1e9  # convert fs to cycles
                    instrs = self.stats['instrs'][core].delta
                    ipc = instrs / (cycles or 1)  # Avoid division by zero
                    #self.fd.write(' %.3f' % ipc)

                    # include fast-forward IPCs
                    cycles = self.stats['time'][
                        core].delta * sim.dvfs.get_frequency(
                            core) / 1e9  # convert fs to cycles
                    instrs = self.stats['coreinstrs'][core].delta
                    ipc = instrs / (cycles or 1)
                    self.fd.write(' %.3f' % ipc)
                self.fd.write('\n')

            ##############################################################
            #os.system("/home/milad/sniper/tools/dumpstats.py --partial periodic-%d:periodic-%d | grep power.Core"%( ((self.num_snapshots-1) *self.interval), ((self.num_snapshots) *self.interval ) ) )

            #raw_input(); #getch
            self.fd.write('periodic-%d' % (self.num_snapshots * self.interval))

            gen_simout.generate_simout(
                resultsdir=sim.config.output_dir,
                partial=('periodic-%d' %
                         ((self.num_snapshots - 1) * self.interval),
                         'periodic-%d' %
                         ((self.num_snapshots) * self.interval)),
                output=open(
                    os.path.join(sim.config.output_dir,
                                 'stats/p%d.out' % self.num_snapshots), 'w'),
                silent=True)
            #gen_simout.generate_simout(resultsdir = sim.config.output_dir, partial = ('periodic-10000000000','periodic-20000000000'), output = open(os.path.join(sim.config.output_dir, 'stats/p%d.out'%self.num_snapshots), 'w'), silent = True)

            self.next_interval += self.interval