Merge ehallnor@zizzer:/bk/m5

into zizzer.eecs.umich.edu:/y/ehallnor/work/m5

--HG--
extra : convert_revision : 2979dcbf516446b45c7fb94454e4c4f013f480e4
This commit is contained in:
Erik Hallnor 2003-10-16 17:04:25 -04:00
commit aeaf133d27
7 changed files with 110 additions and 37 deletions

View file

@ -954,7 +954,7 @@ HIDE_UNDOC_RELATIONS = YES
# toolkit from AT&T and Lucent Bell Labs. The other options in this section # toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default) # have no effect if this option is set to NO (the default)
HAVE_DOT = YES HAVE_DOT = NO
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and # will generate a graph for each documented class showing the direct and

View file

@ -49,13 +49,17 @@ int maxThreadsPerCPU = 1;
BaseCPU::BaseCPU(const string &_name, int _number_of_threads, BaseCPU::BaseCPU(const string &_name, int _number_of_threads,
Counter max_insts_any_thread, Counter max_insts_any_thread,
Counter max_insts_all_threads, Counter max_insts_all_threads,
Counter max_loads_any_thread,
Counter max_loads_all_threads,
System *_system, int num, Tick freq) System *_system, int num, Tick freq)
: SimObject(_name), number(num), frequency(freq), : SimObject(_name), number(num), frequency(freq),
number_of_threads(_number_of_threads), system(_system) number_of_threads(_number_of_threads), system(_system)
#else #else
BaseCPU::BaseCPU(const string &_name, int _number_of_threads, BaseCPU::BaseCPU(const string &_name, int _number_of_threads,
Counter max_insts_any_thread, Counter max_insts_any_thread,
Counter max_insts_all_threads) Counter max_insts_all_threads,
Counter max_loads_any_thread,
Counter max_loads_all_threads)
: SimObject(_name), number_of_threads(_number_of_threads) : SimObject(_name), number_of_threads(_number_of_threads)
#endif #endif
{ {
@ -90,6 +94,32 @@ BaseCPU::BaseCPU(const string &_name, int _number_of_threads,
max_insts_all_threads, *counter); max_insts_all_threads, *counter);
} }
// allocate per-thread load-based event queues
comLoadEventQueue = new (EventQueue *)[number_of_threads];
for (int i = 0; i < number_of_threads; ++i)
comLoadEventQueue[i] = new EventQueue("load-based event queue");
//
// set up instruction-count-based termination events, if any
//
if (max_loads_any_thread != 0)
for (int i = 0; i < number_of_threads; ++i)
new SimExitEvent(comLoadEventQueue[i], max_loads_any_thread,
"a thread reached the max load count");
if (max_loads_all_threads != 0) {
// allocate & initialize shared downcounter: each event will
// decrement this when triggered; simulation will terminate
// when counter reaches 0
int *counter = new int;
*counter = number_of_threads;
for (int i = 0; i < number_of_threads; ++i)
new CountedExitEvent(comLoadEventQueue[i],
"all threads reached the max load count",
max_loads_all_threads, *counter);
}
#ifdef FULL_SYSTEM #ifdef FULL_SYSTEM
memset(interrupts, 0, sizeof(interrupts)); memset(interrupts, 0, sizeof(interrupts));
intstatus = 0; intstatus = 0;

View file

@ -81,27 +81,41 @@ class BaseCPU : public SimObject
#ifdef FULL_SYSTEM #ifdef FULL_SYSTEM
BaseCPU(const std::string &_name, int _number_of_threads, BaseCPU(const std::string &_name, int _number_of_threads,
Counter max_insts_any_thread, Counter max_insts_all_threads, Counter max_insts_any_thread, Counter max_insts_all_threads,
Counter max_loads_any_thread, Counter max_loads_all_threads,
System *_system, System *_system,
int num, Tick freq); int num, Tick freq);
#else #else
BaseCPU(const std::string &_name, int _number_of_threads, BaseCPU(const std::string &_name, int _number_of_threads,
Counter max_insts_any_thread = 0, Counter max_insts_any_thread = 0,
Counter max_insts_all_threads = 0); Counter max_insts_all_threads = 0,
Counter max_loads_any_thread = 0,
Counter max_loads_all_threads = 0);
#endif #endif
virtual ~BaseCPU() {} virtual ~BaseCPU() {}
virtual void regStats(); virtual void regStats();
/// Number of threads we're actually simulating (<= SMT_MAX_THREADS). /**
/// This is a constant for the duration of the simulation. * Number of threads we're actually simulating (<= SMT_MAX_THREADS).
* This is a constant for the duration of the simulation.
*/
int number_of_threads; int number_of_threads;
/// Vector of per-thread instruction-based event queues. Used for /**
/// scheduling events based on number of instructions committed by * Vector of per-thread instruction-based event queues. Used for
/// a particular thread. * scheduling events based on number of instructions committed by
* a particular thread.
*/
EventQueue **comInsnEventQueue; EventQueue **comInsnEventQueue;
/**
* Vector of per-thread load-based event queues. Used for
* scheduling events based on number of loads committed by
*a particular thread.
*/
EventQueue **comLoadEventQueue;
#ifdef FULL_SYSTEM #ifdef FULL_SYSTEM
System *system; System *system;
#endif #endif
@ -109,7 +123,10 @@ class BaseCPU : public SimObject
virtual bool filterThisInstructionPrefetch(int thread_number, virtual bool filterThisInstructionPrefetch(int thread_number,
short asid, Addr prefetchTarget) const { return true; } short asid, Addr prefetchTarget) const { return true; }
/// Return pointer to CPU's branch predictor (NULL if none). /**
* Return pointer to CPU's branch predictor (NULL if none).
* @return Branch predictor pointer.
*/
virtual BranchPred *getBranchPred() { return NULL; }; virtual BranchPred *getBranchPred() { return NULL; };
private: private:

View file

@ -51,10 +51,11 @@ MemTest::MemTest(const string &name,
unsigned _memorySize, unsigned _memorySize,
unsigned _percentReads, unsigned _percentReads,
unsigned _percentUncacheable, unsigned _percentUncacheable,
unsigned _maxReads,
unsigned _progressInterval, unsigned _progressInterval,
Addr _traceAddr) Addr _traceAddr,
: BaseCPU(name, 1), Counter max_loads_any_thread,
Counter max_loads_all_threads)
: BaseCPU(name, 1, 0, 0, max_loads_any_thread, max_loads_all_threads),
tickEvent(this), tickEvent(this),
cacheInterface(_cache_interface), cacheInterface(_cache_interface),
mainMem(main_mem), mainMem(main_mem),
@ -62,7 +63,6 @@ MemTest::MemTest(const string &name,
size(_memorySize), size(_memorySize),
percentReads(_percentReads), percentReads(_percentReads),
percentUncacheable(_percentUncacheable), percentUncacheable(_percentUncacheable),
maxReads(_maxReads),
progressInterval(_progressInterval), progressInterval(_progressInterval),
nextProgressMessage(_progressInterval) nextProgressMessage(_progressInterval)
{ {
@ -136,19 +136,13 @@ MemTest::completeRequest(MemReqPtr req, uint8_t *data)
numReads++; numReads++;
if (numReads.val() == nextProgressMessage) { if (numReads.value() == nextProgressMessage) {
cerr << name() << ": completed " << numReads.val() cerr << name() << ": completed " << numReads.value()
<< " read accesses @ " << curTick << endl; << " read accesses @ " << curTick << endl;
nextProgressMessage += progressInterval; nextProgressMessage += progressInterval;
} }
if (numReads.val() == maxReads) { comLoadEventQueue[0]->serviceEvents(numReads.value());
stringstream stream;
stream << name() << " reached max read count (" << maxReads
<< ")" << endl;
new SimExitEvent(stream.str());
}
break; break;
case Write: case Write:
@ -289,9 +283,10 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(MemTest)
Param<unsigned> memory_size; Param<unsigned> memory_size;
Param<unsigned> percent_reads; Param<unsigned> percent_reads;
Param<unsigned> percent_uncacheable; Param<unsigned> percent_uncacheable;
Param<unsigned> max_reads;
Param<unsigned> progress_interval; Param<unsigned> progress_interval;
Param<Addr> trace_addr; Param<Addr> trace_addr;
Param<Counter> max_loads_any_thread;
Param<Counter> max_loads_all_threads;
END_DECLARE_SIM_OBJECT_PARAMS(MemTest) END_DECLARE_SIM_OBJECT_PARAMS(MemTest)
@ -304,10 +299,15 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(MemTest)
INIT_PARAM_DFLT(memory_size, "memory size", 65536), INIT_PARAM_DFLT(memory_size, "memory size", 65536),
INIT_PARAM_DFLT(percent_reads, "target read percentage", 65), INIT_PARAM_DFLT(percent_reads, "target read percentage", 65),
INIT_PARAM_DFLT(percent_uncacheable, "target uncacheable percentage", 10), INIT_PARAM_DFLT(percent_uncacheable, "target uncacheable percentage", 10),
INIT_PARAM_DFLT(max_reads, "number of reads to simulate", 0),
INIT_PARAM_DFLT(progress_interval, INIT_PARAM_DFLT(progress_interval,
"progress report interval (in accesses)", 1000000), "progress report interval (in accesses)", 1000000),
INIT_PARAM_DFLT(trace_addr, "address to trace", 0) INIT_PARAM_DFLT(trace_addr, "address to trace", 0),
INIT_PARAM_DFLT(max_loads_any_thread,
"terminate when any thread reaches this load count",
0),
INIT_PARAM_DFLT(max_loads_all_threads,
"terminate when all threads have reached this load count",
0)
END_INIT_SIM_OBJECT_PARAMS(MemTest) END_INIT_SIM_OBJECT_PARAMS(MemTest)
@ -315,10 +315,10 @@ END_INIT_SIM_OBJECT_PARAMS(MemTest)
CREATE_SIM_OBJECT(MemTest) CREATE_SIM_OBJECT(MemTest)
{ {
return new MemTest(getInstanceName(), cache->getInterface(), main_mem, return new MemTest(getInstanceName(), cache->getInterface(), main_mem,
check_mem, check_mem, memory_size, percent_reads,
memory_size, percent_reads, percent_uncacheable, progress_interval,
percent_uncacheable, max_reads, progress_interval, trace_addr, max_loads_any_thread,
trace_addr); max_loads_all_threads);
} }
REGISTER_SIM_OBJECT("MemTest", MemTest) REGISTER_SIM_OBJECT("MemTest", MemTest)

View file

@ -49,9 +49,10 @@ class MemTest : public BaseCPU
unsigned _memorySize, unsigned _memorySize,
unsigned _percentReads, unsigned _percentReads,
unsigned _percentUncacheable, unsigned _percentUncacheable,
unsigned _maxReads,
unsigned _progressInterval, unsigned _progressInterval,
Addr _traceAddr); Addr _traceAddr,
Counter max_loads_any_thread,
Counter max_loads_all_threads);
// register statistics // register statistics
virtual void regStats(); virtual void regStats();
@ -82,8 +83,6 @@ class MemTest : public BaseCPU
unsigned percentReads; // target percentage of read accesses unsigned percentReads; // target percentage of read accesses
unsigned percentUncacheable; unsigned percentUncacheable;
Tick maxReads; // max # of reads to perform (then quit)
unsigned blockSize; unsigned blockSize;
Addr blockAddrMask; Addr blockAddrMask;
@ -104,9 +103,9 @@ class MemTest : public BaseCPU
Tick noResponseCycles; Tick noResponseCycles;
Statistics::Scalar<long long int> numReads; Statistics::Scalar<> numReads;
Statistics::Scalar<long long int> numWrites; Statistics::Scalar<> numWrites;
Statistics::Scalar<long long int> numCopies; Statistics::Scalar<> numCopies;
// called by MemCompleteEvent::process() // called by MemCompleteEvent::process()
void completeRequest(MemReqPtr req, uint8_t *data); void completeRequest(MemReqPtr req, uint8_t *data);

View file

@ -104,6 +104,8 @@ SimpleCPU::SimpleCPU(const string &_name,
System *_system, System *_system,
Counter max_insts_any_thread, Counter max_insts_any_thread,
Counter max_insts_all_threads, Counter max_insts_all_threads,
Counter max_loads_any_thread,
Counter max_loads_all_threads,
AlphaItb *itb, AlphaDtb *dtb, AlphaItb *itb, AlphaDtb *dtb,
FunctionalMemory *mem, FunctionalMemory *mem,
MemInterface *icache_interface, MemInterface *icache_interface,
@ -111,15 +113,19 @@ SimpleCPU::SimpleCPU(const string &_name,
int cpu_id, Tick freq) int cpu_id, Tick freq)
: BaseCPU(_name, /* number_of_threads */ 1, : BaseCPU(_name, /* number_of_threads */ 1,
max_insts_any_thread, max_insts_all_threads, max_insts_any_thread, max_insts_all_threads,
max_loads_any_thread, max_loads_all_threads,
_system, cpu_id, freq), _system, cpu_id, freq),
#else #else
SimpleCPU::SimpleCPU(const string &_name, Process *_process, SimpleCPU::SimpleCPU(const string &_name, Process *_process,
Counter max_insts_any_thread, Counter max_insts_any_thread,
Counter max_insts_all_threads, Counter max_insts_all_threads,
Counter max_loads_any_thread,
Counter max_loads_all_threads,
MemInterface *icache_interface, MemInterface *icache_interface,
MemInterface *dcache_interface) MemInterface *dcache_interface)
: BaseCPU(_name, /* number_of_threads */ 1, : BaseCPU(_name, /* number_of_threads */ 1,
max_insts_any_thread, max_insts_all_threads), max_insts_any_thread, max_insts_all_threads,
max_loads_any_thread, max_loads_all_threads),
#endif #endif
tickEvent(this), xc(NULL), cacheCompletionEvent(this) tickEvent(this), xc(NULL), cacheCompletionEvent(this)
{ {
@ -636,6 +642,11 @@ SimpleCPU::tick()
numMemRefs++; numMemRefs++;
} }
if (si->isLoad()) {
++numLoad;
comLoadEventQueue[0]->serviceEvents(numLoad);
}
if (traceData) if (traceData)
traceData->finalize(); traceData->finalize();
@ -679,6 +690,8 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(SimpleCPU)
Param<Counter> max_insts_any_thread; Param<Counter> max_insts_any_thread;
Param<Counter> max_insts_all_threads; Param<Counter> max_insts_all_threads;
Param<Counter> max_loads_any_thread;
Param<Counter> max_loads_all_threads;
#ifdef FULL_SYSTEM #ifdef FULL_SYSTEM
SimObjectParam<AlphaItb *> itb; SimObjectParam<AlphaItb *> itb;
@ -704,6 +717,12 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(SimpleCPU)
INIT_PARAM_DFLT(max_insts_all_threads, INIT_PARAM_DFLT(max_insts_all_threads,
"terminate when all threads have reached this insn count", "terminate when all threads have reached this insn count",
0), 0),
INIT_PARAM_DFLT(max_loads_any_thread,
"terminate when any thread reaches this load count",
0),
INIT_PARAM_DFLT(max_loads_all_threads,
"terminate when all threads have reached this load count",
0),
#ifdef FULL_SYSTEM #ifdef FULL_SYSTEM
INIT_PARAM(itb, "Instruction TLB"), INIT_PARAM(itb, "Instruction TLB"),
@ -730,6 +749,7 @@ CREATE_SIM_OBJECT(SimpleCPU)
return new SimpleCPU(getInstanceName(), system, return new SimpleCPU(getInstanceName(), system,
max_insts_any_thread, max_insts_all_threads, max_insts_any_thread, max_insts_all_threads,
max_loads_any_thread, max_loads_all_threads,
itb, dtb, mem, itb, dtb, mem,
(icache) ? icache->getInterface() : NULL, (icache) ? icache->getInterface() : NULL,
(dcache) ? dcache->getInterface() : NULL, (dcache) ? dcache->getInterface() : NULL,
@ -738,6 +758,7 @@ CREATE_SIM_OBJECT(SimpleCPU)
return new SimpleCPU(getInstanceName(), workload, return new SimpleCPU(getInstanceName(), workload,
max_insts_any_thread, max_insts_all_threads, max_insts_any_thread, max_insts_all_threads,
max_loads_any_thread, max_loads_all_threads,
icache->getInterface(), dcache->getInterface()); icache->getInterface(), dcache->getInterface());
#endif // FULL_SYSTEM #endif // FULL_SYSTEM

View file

@ -114,6 +114,7 @@ class SimpleCPU : public BaseCPU
SimpleCPU(const std::string &_name, SimpleCPU(const std::string &_name,
System *_system, System *_system,
Counter max_insts_any_thread, Counter max_insts_all_threads, Counter max_insts_any_thread, Counter max_insts_all_threads,
Counter max_loads_any_thread, Counter max_loads_all_threads,
AlphaItb *itb, AlphaDtb *dtb, FunctionalMemory *mem, AlphaItb *itb, AlphaDtb *dtb, FunctionalMemory *mem,
MemInterface *icache_interface, MemInterface *dcache_interface, MemInterface *icache_interface, MemInterface *dcache_interface,
int cpu_id, Tick freq); int cpu_id, Tick freq);
@ -123,6 +124,8 @@ class SimpleCPU : public BaseCPU
SimpleCPU(const std::string &_name, Process *_process, SimpleCPU(const std::string &_name, Process *_process,
Counter max_insts_any_thread, Counter max_insts_any_thread,
Counter max_insts_all_threads, Counter max_insts_all_threads,
Counter max_loads_any_thread,
Counter max_loads_all_threads,
MemInterface *icache_interface, MemInterface *dcache_interface); MemInterface *icache_interface, MemInterface *dcache_interface);
#endif #endif
@ -239,6 +242,9 @@ class SimpleCPU : public BaseCPU
// number of simulated memory references // number of simulated memory references
Statistics::Scalar<> numMemRefs; Statistics::Scalar<> numMemRefs;
// number of simulated loads
Counter numLoad;
// number of idle cycles // number of idle cycles
Statistics::Scalar<> idleCycles; Statistics::Scalar<> idleCycles;
Statistics::Formula idleFraction; Statistics::Formula idleFraction;