From 9fede07f4478f1bf70ce2675caac569f044938fa Mon Sep 17 00:00:00 2001 From: studyztp Date: Sun, 18 Aug 2024 09:50:50 -0700 Subject: [PATCH] cpu: modified with review feedback x86-global-inst-tracker.py: - change the incorrect use of comment styly - add more comments about the usage of the script and the purpose of the script src/cpu/probes/inst_tracker.cc: - change the way of stopListening to use the manager function to remove listeners. If in the future, the ProbeListner object does not call the manager to remove itself in the destruction, then we should call it here. - fix stlying src/cpu/probes/inst_tracker.hh: - fix stlying Change-Id: I6f3d745e15883a8a702593f72f984e0d4cc4c526 --- .../gem5_library/x86-global-inst-tracker.py | 46 +++++++++++++------ src/cpu/probes/inst_tracker.cc | 14 +++--- src/cpu/probes/inst_tracker.hh | 31 +++++++------ 3 files changed, 56 insertions(+), 35 deletions(-) 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; }; };