diff --git a/configs/example/gem5_library/x86-global-inst-tracker.py b/configs/example/gem5_library/x86-global-inst-tracker.py index 2513ab89b2..430c064024 100644 --- a/configs/example/gem5_library/x86-global-inst-tracker.py +++ b/configs/example/gem5_library/x86-global-inst-tracker.py @@ -24,6 +24,33 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" + +This script demonstrates how to use global and local instruction trackers to +monitor and control the simulation based on the number of instructions +committed. + +This script will create a global instruction tracker to manage each local +instruction tracker and connects each local instruction tracker to a core. +The global instruction tracker will raise an event when the number of +instructions committed across all cores reaches a certain threshold. + +In this script, we expect to start monitorning the instruction committed from +the start of the simulation and raise a SIMPOINT_BEGIN exit event when all +cores in combination have committed 100,000,000 instructions. Then, we will +change the threshold to 20,000 instructions and raise another SIMPOINT_BEGIN +event when the new threshold is reached. Finally, we will stop listening to +instructions. + +Usage: +------ + +scons build/X86/gem5.opt +./build/X86/gem5.opt [--debug-flags=InstTracker] \ + configs/example/gem5_library/x86-global-inst-tracker.py + +""" + import m5 from m5.objects import ( GlobalInstTracker, @@ -42,14 +69,6 @@ from gem5.resources.resource import obtain_resource from gem5.simulate.exit_event import ExitEvent from gem5.simulate.simulator import Simulator -""" - -Usage: - -gem5.opt configs/example/gem5_library/x86-global-inst-tracker.py - -""" - cache_hierarchy = PrivateL1CacheHierarchy( l1d_size="64kB", l1i_size="64kB", @@ -118,13 +137,10 @@ def max_inst_handler(): # we can stop listening to instructions for tracker in all_trackers: tracker.stopListening() - """ - similarly, we can start listening to instructions again by calling: - - for tracker in all_trackers: - tracker.startListening() - - """ + # similarly, we can start listening to instructions again by calling: + # + # for tracker in all_trackers: + # tracker.startListening() m5.stats.dump() m5.stats.reset() yield False diff --git a/src/cpu/probes/inst_tracker.cc b/src/cpu/probes/inst_tracker.cc index 0658e9292e..8d696e159e 100644 --- a/src/cpu/probes/inst_tracker.cc +++ b/src/cpu/probes/inst_tracker.cc @@ -43,8 +43,7 @@ void LocalInstTracker::regProbeListeners() { if (ifListening) { - if (listeners.empty()) - { + if (listeners.empty()) { listeners.push_back(new LocalInstTrackerListener(this, "RetiredInsts", &LocalInstTracker::retiredInstsHandler)); @@ -63,11 +62,14 @@ void LocalInstTracker::stopListening() { ifListening = false; - for (auto l = listeners.begin(); l != listeners.end(); ++l) { - delete (*l); + bool _ifRemoved; + for (auto &listener : listeners) { + _ifRemoved = getProbeManager()->removeListener( + "RetiredInsts", + *listener + ); + DPRINTF(InstTracker, "If removed: %s\n", _ifRemoved ? "Yes" : "No"); } - listeners.clear(); - DPRINTF(InstTracker, "Stopped listening\n"); } diff --git a/src/cpu/probes/inst_tracker.hh b/src/cpu/probes/inst_tracker.hh index f393cc369e..008da9e9cb 100644 --- a/src/cpu/probes/inst_tracker.hh +++ b/src/cpu/probes/inst_tracker.hh @@ -55,7 +55,7 @@ class LocalInstTracker : public ProbeListenerObject private: typedef ProbeListenerArg - LocalInstTrackerListener; + LocalInstTrackerListener; /** a boolean variable that determines if the LocalInstTracker is * listening to the ProbePoints or not @@ -74,10 +74,11 @@ class LocalInstTracker : public ProbeListenerObject void stopListening(); /** start listening to the ProbePoints */ - void startListening() + void + startListening() { - ifListening = true; - regProbeListeners(); + ifListening = true; + regProbeListeners(); } }; @@ -99,7 +100,6 @@ class GlobalInstTracker : public SimObject */ uint64_t instCount; - /** * the threshold for the number of instructions that should be executed * before the simulation exits @@ -107,23 +107,26 @@ class GlobalInstTracker : public SimObject uint64_t instThreshold; public: - void changeThreshold(uint64_t new_threshold) + void + changeThreshold(uint64_t new_threshold) { - instThreshold = new_threshold; - DPRINTF(InstTracker, "Changing the instruction threshold\n" - "instThreshold = %lu\n", instThreshold); + instThreshold = new_threshold; + DPRINTF(InstTracker, "Changing the instruction threshold\n" + "instThreshold = %lu\n", instThreshold); }; - void resetCounter() + void + resetCounter() { - instCount = 0; - DPRINTF(InstTracker, "Resetting the instruction counter\n" + instCount = 0; + DPRINTF(InstTracker, "Resetting the instruction counter\n" "instCount = %lu\n", instCount); }; - uint64_t getThreshold() const + uint64_t + getThreshold() const { - return instThreshold; + return instThreshold; }; };