Exemple #1
0
        static void run()
        {
            //DateTime start_time = DateTime.Now;

            bool[] is_done = new bool[Config.N];
            for (int i = 0; i < Config.N; i++)
            {
                is_done[i] = false;
            }

            bool   finished       = false;
            string OutputFileName = Config.output + ".csv";

            while (!finished)
            {
                finished = true;

                if (cycles % 1000000 == 0)
                {
                    if (cycles != 0)
                    {
                        string OutputInformation = cycles.ToString() + " " + ((double)Dram_Utilization_size * 64 / 1073741824).ToString() + " " + ((double)Dram_req_num / (Dram_req_num + NVM_req_num + 0.001)).ToString();
                        using (StreamWriter sw = File.AppendText(OutputFileName))
                        {
                            sw.WriteLine(OutputInformation);
                        }
                        Dram_req_num = 0;
                        NVM_req_num  = 0;
                    }
                }

                //processors
                int pid = rand.Next(Config.N);
                for (int i = 0; i < Config.N; i++)
                {
                    Proc curr_proc = procs[pid];
//yang:
                    if (Config.sim_type == Config.SIM_TYPE.GROUPED && pid >= Config.group_boundary && pid < Config.N && is_done[pid] == false)
                    {
                        curr_proc.tick();
                    }
                    else if (Config.sim_type != Config.SIM_TYPE.PARALLEL || is_done[pid] == false)
                    {
                        curr_proc.tick();
                    }
                    pid = (pid + 1) % Config.N;
                }


                //memory controllers
                for (int n = 0; n < Config.mem.mctrl_num; n++)
                {
                    for (int i = 0; i < Config.mem.channel_max; i++)
                    {
                        mctrls[n][i].tick();
                    }
                }


                //blp tracker
                blptracker.tick();

                //xbar
                xbar.tick();

                //cache
                foreach (Cache c in caches)
                {
                    c.tick();
                }


                if (Config.proc.cache_insertion_policy == "PFA")
                {
                    mesur.tick();
                }


                //Jin: Row Migration Policies
                if (Config.proc.cache_insertion_policy == "RBLA" || Config.proc.cache_insertion_policy == "PFA")
                {
                    rmp.tick();
                }


                //progress simulation time
                cycles++;

                //warmup phase
                for (int p = 0; p < Config.N; p++)
                {
                    if (!proc_warmup[p])
                    {
                        if (Stat.procs[p].ipc.Count >= Config.warmup_inst_max)
                        {
                            proc_warmup[p] = true;
                            Stat.procs[p].Reset();
                            foreach (MemCtrlStat mctrl in Stat.mctrls)
                            {
                                mctrl.Reset(pid);
                            }
                            foreach (BankStat bank in Stat.banks)
                            {
                                bank.Reset(pid);
                            }
                            proc_warmup_cycles[p] = cycles;
                            Measurement.warmup_core_stall_cycles[p] = Measurement.core_stall_cycles[p];
                            processor_finished[p]        = false;
                            DRAM_processor_read_hit[p]   = 0;
                            DRAM_processor_read_miss[p]  = 0;
                            DRAM_processor_write_hit[p]  = 0;
                            DRAM_processor_write_miss[p] = 0;
                            DRAM_migration_read_hit[p]   = 0;
                            DRAM_migration_read_miss[p]  = 0;
                            DRAM_migration_write_hit[p]  = 0;
                            DRAM_migration_write_miss[p] = 0;
                            NVM_processor_read_hit[p]    = 0;
                            NVM_processor_read_miss[p]   = 0;
                            NVM_processor_write_hit[p]   = 0;
                            NVM_processor_write_miss[p]  = 0;
                            NVM_migration_read_hit[p]    = 0;
                            NVM_migration_read_miss[p]   = 0;
                            NVM_migration_write_hit[p]   = 0;
                            NVM_migration_write_miss[p]  = 0;
                            processor_cycles[p]          = 0;
                        }
                    }
                }



                //case #1: instruction constrained simulation
                if (Config.sim_type == Config.SIM_TYPE.INST)
                {
                    for (int p = 0; p < Config.N; p++)
                    {
                        if (is_done[p])
                        {
                            continue;
                        }

                        if (proc_warmup[p] && (Stat.procs[p].ipc.Count >= Config.sim_inst_max))
                        {
                            //simulation is now finished for this processor
                            finish_proc(p);
                            is_done[p] = true;

                            //Power Measurement:
                            processor_finished[p] = true;
                            processor_cycles[p]   = cycles - proc_warmup_cycles[p];

                            information_output(p);
                        }
                        else
                        {
                            //simulation is still unfinished for this processor
                            finished = false;
                        }
                    }
                }

                //case #2: cycle constrained simulation  // default case
                else if (Config.sim_type == Config.SIM_TYPE.CYCLE)
                {
                    if (cycles >= Config.sim_cycle_max)
                    {
                        finish_proc();
                        finished = true;
                    }
                    else
                    {
                        finished = false;
                    }
                }

                //case #3: run to completion
                else if (Config.sim_type == Config.SIM_TYPE.COMPLETION || Config.sim_type == Config.SIM_TYPE.PARALLEL)
                {
                    for (int p = 0; p < Config.N; p++)
                    {
                        if (is_done[p])
                        {
                            continue;
                        }

                        if (procs[p].trace.finished)
                        {
                            //simulation is now finished for this processor
                            finish_proc(p);
                            is_done[p] = true;
                        }
                        else
                        {
                            //simulation is still unfinished for this processor
                            finished = false;
                        }
                    }
                }

                //case #4: run to completion for the parallel group
                else if (Config.sim_type == Config.SIM_TYPE.GROUPED)
                {
                    for (int p = Config.group_boundary; p < Config.N; p++)
                    {
                        if (is_done[p])
                        {
                            continue;
                        }

                        if (procs[p].trace.finished)
                        {
                            //simulation is now finished for this processor
                            finish_proc(p);
                            is_done[p] = true;
                        }
                        else
                        {
                            //simulation is still unfinished for this processor
                            finished = false;
                        }
                    }
                    if (finished == true)
                    {
                        for (int p = 0; p < Config.group_boundary; p++)
                        {
                            finish_proc(p);
                        }
                    }
                }
            }
        }