summaryrefslogtreecommitdiff
path: root/src/mem/probes/stack_dist.cc
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2015-08-04 10:29:13 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2015-08-04 10:29:13 +0100
commit022e69e6de513fce2efea8d732e9274624ce3e94 (patch)
tree4d2464067387eef65fc798eebc47e11fa382ebef /src/mem/probes/stack_dist.cc
parentfeded87fc99741a0603c4a124bb856eca594c4aa (diff)
downloadgem5-022e69e6de513fce2efea8d732e9274624ce3e94.tar.xz
mem: Redesign the stack distance calculator as a probe
This changeset removes the stack distance calculator hooks from the CommMonitor class and implements a stack distance calculator as a memory system probe instead. The probe can be hooked up to any component that exports probe points of the type ProbePoints::Packet.
Diffstat (limited to 'src/mem/probes/stack_dist.cc')
-rw-r--r--src/mem/probes/stack_dist.cc138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/mem/probes/stack_dist.cc b/src/mem/probes/stack_dist.cc
new file mode 100644
index 000000000..c742cae7b
--- /dev/null
+++ b/src/mem/probes/stack_dist.cc
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2015 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder. You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Andreas Sandberg
+ */
+
+#include "mem/probes/stack_dist.hh"
+
+#include "params/StackDistProbe.hh"
+#include "sim/system.hh"
+
+StackDistProbe::StackDistProbe(StackDistProbeParams *p)
+ : BaseMemProbe(p),
+ lineSize(p->line_size),
+ disableLinearHists(p->disable_linear_hists),
+ disableLogHists(p->disable_log_hists),
+ calc(p->verify)
+{
+ fatal_if(p->system->cacheLineSize() > p->line_size,
+ "The stack distance probe must use a cache line size that is "
+ "larger or equal to the system's cahce line size.");
+}
+
+void
+StackDistProbe::regStats()
+{
+ const StackDistProbeParams *p(
+ dynamic_cast<const StackDistProbeParams *>(params()));
+ assert(p);
+
+ using namespace Stats;
+
+ readLinearHist
+ .init(p->linear_hist_bins)
+ .name(name() + ".readLinearHist")
+ .desc("Reads linear distribution")
+ .flags(disableLinearHists ? nozero : pdf);
+
+ readLogHist
+ .init(p->log_hist_bins)
+ .name(name() + ".readLogHist")
+ .desc("Reads logarithmic distribution")
+ .flags(disableLogHists ? nozero : pdf);
+
+ writeLinearHist
+ .init(p->linear_hist_bins)
+ .name(name() + ".writeLinearHist")
+ .desc("Writes linear distribution")
+ .flags(disableLinearHists ? nozero : pdf);
+
+ writeLogHist
+ .init(p->log_hist_bins)
+ .name(name() + ".writeLogHist")
+ .desc("Writes logarithmic distribution")
+ .flags(disableLogHists ? nozero : pdf);
+
+ infiniteSD
+ .name(name() + ".infinity")
+ .desc("Number of requests with infinite stack distance")
+ .flags(nozero);
+}
+
+void
+StackDistProbe::handleRequest(const PacketPtr &pkt)
+{
+ // only capturing read and write requests (which allocate in the
+ // cache)
+ if (!pkt->isRead() && !pkt->isWrite())
+ return;
+
+ // Align the address to a cache line size
+ const Addr aligned_addr(roundDown(pkt->getAddr(), lineSize));
+
+ // Calculate the stack distance
+ const uint64_t sd(calc.calcStackDistAndUpdate(aligned_addr).first);
+ if (sd == StackDistCalc::Infinity) {
+ infiniteSD++;
+ return;
+ }
+
+ // Sample the stack distance of the address in linear bins
+ if (!disableLinearHists) {
+ if (pkt->isRead())
+ readLinearHist.sample(sd);
+ else
+ writeLinearHist.sample(sd);
+ }
+
+ if (!disableLogHists) {
+ int sd_lg2 = sd == 0 ? 1 : floorLog2(sd);
+
+ // Sample the stack distance of the address in log bins
+ if (pkt->isRead())
+ readLogHist.sample(sd_lg2);
+ else
+ writeLogHist.sample(sd_lg2);
+ }
+}
+
+
+StackDistProbe *
+StackDistProbeParams::create()
+{
+ return new StackDistProbe(this);
+}