Beispiel #1
0
        public bool doStep()
        {
            if (m_trace == null)
            {
                return(true);
            }

            int syncID;

            ulong retired =
                (ulong)m_ins.retire(Config.proc.instructionsPerCycle);

            if (retired > 0)
            {
                m_last_retired = Simulator.CurrentRound;
            }

            if (!m_trace_valid)
            {
                m_trace_valid = advanceTrace(); // doStats needs to see the next record
            }
            doStats(retired);

            if (m_ins.isFull())
            {
                return(true);
            }

            bool done = false;
            int  nIns = Config.proc.instructionsPerCycle;
            int  nMem = 1;

            while (!done && nIns > 0 && !m_ins.isFull())
            {
                if (!m_trace_valid)
                {
                    m_trace_valid = advanceTrace();
                }
                if (!m_trace_valid)
                {
                    return(false);
                }

                if (m_trace.type == Trace.Type.Pause) // when execution-driven, source has nothing to give
                {
                    m_trace_valid = false;
                    return(true);
                }

                if (m_trace.type == Trace.Type.Sync)
                {
                    // `from' field: translate referrent from thd ID to physical CPU id
                    syncID = Simulator.network.workload.mapThd(m_group, m_trace.from);
                }
                else
                {
                    syncID = m_trace.from;
                }

                switch (m_trace.type)
                {
                case Trace.Type.Rd:
                case Trace.Type.Wr:
                    if (nMem == 0 || !canIssueMSHR(m_trace.address))
                    {
                        done = true;
                        break;
                    }
                    nMem--;
                    nIns--;

                    ulong addr     = m_trace.address;
                    bool  isWrite  = m_trace.type == Trace.Type.Wr;
                    bool  inWindow = m_ins.contains(addr, isWrite);

                    Request req = inWindow ? null : new Request(m_ID, addr, isWrite);
                    m_ins.fetch(req, addr, isWrite, inWindow);

                    if (!inWindow)
                    {
                        issueReq(req);
                    }

                    m_trace_valid = false;
                    break;

                case Trace.Type.NonMem:
                    if (m_trace.address > 0)
                    {
                        m_ins.fetch(null, InstructionWindow.NULL_ADDRESS, false, true);
                        m_trace.address--;
                        nIns--;
                    }
                    else
                    {
                        m_trace_valid = false;
                    }

                    break;

                case Trace.Type.Label:
                    if (m_sync.Label(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false; // allowed to continue
                    }
                    else
                    { // shouldn't ever block...
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_memdep[m_ID].Add();
                        }
                        done = true; // blocking: done with this cycle
                    }

                    break;

                case Trace.Type.Sync:
                    if (m_sync.Sync(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false;
                    }
                    else
                    {
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_memdep[m_ID].Add();
                        }
                        done = true;
                    }

                    break;

                case Trace.Type.Lock:
                    //Console.WriteLine("Lock" + ' ' + m_ID.ToString() + ' ' + syncID.ToString() + ' ' + m_trace.address.ToString());
                    if (m_sync.Lock(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false;
                    }
                    else
                    {
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_lock[m_ID].Add();
                        }
                        done = true;
                    }

                    break;

                case Trace.Type.Unlock:
                    //Console.WriteLine("Unlock" + ' ' + m_ID.ToString() + ' ' + syncID.ToString() + ' ' + m_trace.address.ToString());
                    if (m_sync.Unlock(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false;
                    }
                    else
                    { // shouldn't ever block...
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_lock[m_ID].Add();
                        }
                        done = true;
                    }

                    break;

                case Trace.Type.Barrier:
                    //Console.WriteLine("Barrier" + ' ' + m_ID.ToString() + ' ' + syncID.ToString() + ' ' + m_trace.address.ToString());
                    if (m_sync.Barrier(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false;
                    }
                    else
                    {
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_barrier[m_ID].Add();
                        }
                        done = true;
                    }

                    break;
                }
            }

            return(true);
        }
Beispiel #2
0
        public bool doStep()
        {
            if (m_trace == null)
            {
                return(true);
            }

            /* HWA CODE */
//	    if( !Simulator.QoSCtrl.is_initialized )
//		Simulator.QoSCtrl.schedule_quantum();

            if (m_is_GPU)
            {
                m_MemoryCoalescing.doStep();
            }


            int syncID;

//            Console.WriteLine("core:{1} step: cyc {0}", Simulator.CurrentRound, m_ID);
            ulong retired;

            if (m_is_GPU)
            {
                retired = (ulong)m_ins.retire(Config.proc.GPUinstructionsPerCycle);
            }
            else
            {
                retired = (ulong)m_ins.retire(Config.proc.instructionsPerCycle);
            }

            /* HWA CODE */
            if (m_is_HWA)
            {
                deadLineReqCnt += retired;
            }
            /* HWA_CODE END */

            if (retired > 0)
            {
                m_last_retired = Simulator.CurrentRound;
            }

            if (!m_trace_valid)
            {
                m_trace_valid = advanceTrace(); // doStats needs to see the next record
            }
//        if(Simulator.CurrentRound > 650000 && m_ID ==15)
//            Console.WriteLine("core:{1} after advancetrace in DOSTEP: cyc {0}, ID = {1}, trace_valid = {2}, retiring {3} instructions, isfull = {4}", Simulator.CurrentRound, m_ID, m_trace_valid, retired, m_ins.isFull());



//            Console.WriteLine("core:{1} before stat: cyc {0}", Simulator.CurrentRound, m_ID);
            doStats(retired);

            if (m_ins.isFull())
            {
                return(true);
            }

            bool done = false;
            int  nIns = Config.proc.instructionsPerCycle;

            if (m_is_GPU)
            {
                nIns = Config.proc.GPUinstructionsPerCycle;
            }
            else if (Config.CPU == false)
            {
                done = true;
            }


            int nMem = 1;

//        if(Simulator.CurrentRound > 650000 && m_ID ==15)
//            Console.WriteLine("core:{1} before loop: cyc {0}, ID = {1} done = {2}, numIns = {3}, isFull = {4}", Simulator.CurrentRound, m_ID, done, nIns, m_ins.isFull());
            while (!done && nIns > 0 && !m_ins.isFull())
            {
//          if(Simulator.CurrentRound > 700000 && m_ID ==15)
//            Console.WriteLine("cycle:{0} in loop before advance trace, trace valid = {1} ", Simulator.CurrentRound, m_trace_valid);
                if (!m_trace_valid)
                {
//           if(Simulator.CurrentRound > 700000 && m_ID ==15)
//            Console.WriteLine("cycle:{0} in loop after advance trace, trace valid = {1} ", Simulator.CurrentRound, m_trace_valid);
                    m_trace_valid = advanceTrace();
                }
                if (!m_trace_valid)
                {
                    return(false);
                }

                if (m_trace.type == Trace.Type.Pause) // when execution-driven, source has nothing to give
                {
                    m_trace_valid = false;
                    return(true);
                }

                if (m_trace.type == Trace.Type.Sync)
                {
                    // `from' field: translate referrent from thd ID to physical CPU id
                    syncID = Simulator.network.workload.mapThd(m_group, m_trace.from);
                }
                else
                {
                    syncID = m_trace.from;
                }

                switch (m_trace.type)
                {
                case Trace.Type.Rd:
                case Trace.Type.Wr:
                    if (nMem == 0 || !canIssueMSHR(m_trace.address))
                    {
                        done = true;
                        break;
                    }
                    nMem--;
                    nIns--;
                    if (m_is_GPU)
                    {
                        deadLineReqCnt++;
                    }

                    ulong addr     = m_trace.address;
                    bool  isWrite  = m_trace.type == Trace.Type.Wr;
                    bool  inWindow = m_ins.contains(addr, isWrite);
                    int   windowID = m_ins.next;

                    Request req = inWindow ? null : new Request(m_ID, addr, isWrite);
                    /* HWA CODE */
                    if (m_is_HWA)
                    {
                        deadLineReqFetchCnt++;
//			    if( !inWindow ) req.setDeadLine( deadLine, deadLineCnt, deadLineReq, deadLineReqCnt );
                    }
                    /* HWA CODE END */
                    m_ins.fetch(req, addr, isWrite, inWindow);
//        if(Simulator.CurrentRound > 700000 && m_ID ==15)
//            Console.WriteLine("core:{1} in loop - mem: cyc {0}, inWindow = {1}", Simulator.CurrentRound, m_ID, inWindow);
                    if (!inWindow)
                    {
                        if (!m_is_GPU)
                        {
                            issueReq(req, windowID);
                        }
                        else
                        {
                            req.from_GPU = true;
                            req.memsize  = ((TraceFile_AMD_GPU)m_trace).memsize;
                            req.client   = ((TraceFile_AMD_GPU)m_trace).client;
                            issueReq(req, windowID);
                        }
                    }
                    m_trace_valid = false;
                    break;

                case Trace.Type.NonMem:
                    if (m_trace.address > 0)
                    {
//            Console.WriteLine("core:{1} in loop - nonmem before fetch: cyc {0}", Simulator.CurrentRound, m_ID);
                        m_ins.fetch(null, InstructionWindow.NULL_ADDRESS, false, true);
                        m_trace.address--;
                        nIns--;
                    }
                    else
                    {
                        m_trace_valid = false;
                    }

                    break;

                case Trace.Type.Label:
                    if (m_sync.Label(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false; // allowed to continue
                    }
                    else
                    { // shouldn't ever block...
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_memdep[m_ID].Add();
                        }
                        done = true; // blocking: done with this cycle
                    }

                    break;

                case Trace.Type.Sync:
                    if (m_sync.Sync(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false;
                    }
                    else
                    {
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_memdep[m_ID].Add();
                        }
                        done = true;
                    }

                    break;

                case Trace.Type.Lock:
                    //Console.WriteLine("Lock" + ' ' + m_ID.ToString() + ' ' + syncID.ToString() + ' ' + m_trace.address.ToString());
                    if (m_sync.Lock(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false;
                    }
                    else
                    {
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_lock[m_ID].Add();
                        }
                        done = true;
                    }

                    break;

                case Trace.Type.Unlock:
                    //Console.WriteLine("Unlock" + ' ' + m_ID.ToString() + ' ' + syncID.ToString() + ' ' + m_trace.address.ToString());
                    if (m_sync.Unlock(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false;
                    }
                    else
                    { // shouldn't ever block...
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_lock[m_ID].Add();
                        }
                        done = true;
                    }

                    break;

                case Trace.Type.Barrier:
                    //Console.WriteLine("Barrier" + ' ' + m_ID.ToString() + ' ' + syncID.ToString() + ' ' + m_trace.address.ToString());
                    if (m_sync.Barrier(m_ID, syncID, m_trace.address))
                    {
                        m_trace_valid = false;
                    }
                    else
                    {
                        if (m_stats_active)
                        {
                            Simulator.stats.cpu_sync_barrier[m_ID].Add();
                        }
                        done = true;
                    }

                    break;
                }

//            Console.WriteLine("core:{1} in loop - at the end: cyc {0}", Simulator.CurrentRound, m_ID);
            }

//            Console.WriteLine("core:{1} after loop: cyc {0}", Simulator.CurrentRound, m_ID);
            return(true);
        }