c4a87f874a
SConscript: Split off activity/idling code into its own class to do the processing separately. cpu/o3/alpha_cpu_builder.cc: cpu/o3/alpha_params.hh: Activity stuff. This is mostly for debugging and may be removed later on (or changed to enable/disable activity idling). cpu/o3/cpu.cc: Move activity idling stuff mostly into its own class, so it no longer clutters this file. cpu/o3/cpu.hh: Move activity idling stuff into its own class. python/m5/objects/AlphaFullCPU.py: Add parameter for initial activity value. --HG-- extra : convert_revision : f32f7cc03895dc07ab57ddba78c5402a1a8b0f1a
67 lines
2 KiB
C++
67 lines
2 KiB
C++
|
|
#ifndef __CPU_ACTIVITY_HH__
|
|
#define __CPU_ACTIVITY_HH__
|
|
|
|
#include "base/timebuf.hh"
|
|
#include "base/trace.hh"
|
|
|
|
class ActivityRecorder {
|
|
public:
|
|
ActivityRecorder(int num_stages, int longest_latency, int count);
|
|
|
|
/** Records that there is activity this cycle. */
|
|
void activity();
|
|
/** Advances the activity buffer, decrementing the activityCount if active
|
|
* communication just left the time buffer, and descheduling the CPU if
|
|
* there is no activity.
|
|
*/
|
|
void advance();
|
|
/** Marks a stage as active. */
|
|
void activateStage(const int idx);
|
|
/** Deactivates a stage. */
|
|
void deactivateStage(const int idx);
|
|
|
|
int getActivityCount() { return activityCount; }
|
|
|
|
void setActivityCount(int count)
|
|
{ activityCount = count; }
|
|
|
|
bool active() { return activityCount; }
|
|
|
|
void reset();
|
|
|
|
void dump();
|
|
|
|
void validate();
|
|
|
|
private:
|
|
/** Time buffer that tracks if any cycles has active communication
|
|
* in them. It should be as long as the longest communication
|
|
* latency in the system. Each time any time buffer is written,
|
|
* the activity buffer should also be written to. The
|
|
* activityBuffer is advanced along with all the other time
|
|
* buffers, so it should have a 1 somewhere in it only if there
|
|
* is active communication in a time buffer.
|
|
*/
|
|
TimeBuffer<bool> activityBuffer;
|
|
|
|
int longestLatency;
|
|
|
|
/** Tracks how many stages and cycles of time buffer have
|
|
* activity. Stages increment this count when they switch to
|
|
* active, and decrement it when they switch to
|
|
* inactive. Whenever a cycle that previously had no information
|
|
* is written in the time buffer, this is incremented. When a
|
|
* cycle that had information exits the time buffer due to age,
|
|
* this count is decremented. When the count is 0, there is no
|
|
* activity in the CPU, and it can be descheduled.
|
|
*/
|
|
int activityCount;
|
|
|
|
int numStages;
|
|
|
|
/** Records which stages are active/inactive. */
|
|
bool *stageActive;
|
|
};
|
|
|
|
#endif // __CPU_ACTIVITY_HH__
|