From 5366e6dce349dcd976338ec794285359dfd2d303 Mon Sep 17 00:00:00 2001 From: Matthias Jung Date: Wed, 18 May 2016 12:00:54 +0200 Subject: [PATCH] new metric for parallel banks --- DRAMSys/analyzer/scripts/metrics.py | 62 ++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/DRAMSys/analyzer/scripts/metrics.py b/DRAMSys/analyzer/scripts/metrics.py index d4db523a..1780935f 100644 --- a/DRAMSys/analyzer/scripts/metrics.py +++ b/DRAMSys/analyzer/scripts/metrics.py @@ -2,6 +2,7 @@ import sys import sqlite3 from memUtil import * from math import * +from intervaltree import Interval, IntervalTree metrics = [] threadMetrics = [] @@ -221,8 +222,9 @@ def number_of_accesses(connection): @metric def bank_usage_ratio(connection): - bankAccess = [] + # Calculates how many percent of the accesses go to which bank... cursor = connection.cursor() + bankAccess = [] total = number_of_accesses(connection) for bank in range(getNumberOfBanks(connection)): cursor.execute("SELECT COUNT(*) FROM Transactions where TBank = {}".format(bank)) @@ -231,6 +233,64 @@ def bank_usage_ratio(connection): return ",".join(format(x, "6.2f") for x in bankAccess) +@metric +def bank_overlap_ratio(connection): + # Calculates how many banks are open in parallel + cursor = connection.cursor() + cursor.execute("SELECT clk FROM GeneralInfo ") + clk = cursor.fetchone() + + cursor.execute("select TraceEnd from GeneralInfo") + traceEndTMP = cursor.fetchone() + traceEnd = int(traceEndTMP[0]/clk[0]) + + trace = [] + + cursor.execute(""" + select p1.PhaseBegin, p1.PhaseName from Phases p1 + where + (p1.PhaseName = "ACT" or p1.PhaseName = "PRE_ALL" or p1.PhaseName = "PRE") + order by PhaseBegin + """) + prevPhase = "PRE_ALL" + prevTime = 0 + + for c in cursor: + trace.append([(int(c[0]/clk[0])),c[1]]) + + #Insert a pseudo precharge all to mark the end of the trace + trace.append([traceEnd,"PRE_ALL"]) + + bankCounter = 0 + bankTime = [] + + for i in range(0, getNumberOfBanks(connection)+1): + bankTime.append(0) + + currentTime = 0 + + for t in trace: + + interval = t[0] - currentTime + bankTime[bankCounter] += interval + currentTime = t[0] + + if(t[1] == "ACT"): + bankCounter += 1 + elif(t[1] == "PRE_ALL"): + bankCounter = 0 + elif(t[1] == "PRE"): + bankCounter -= 1 + else: + print ("ERROR") + return 0 + + + for i in range(0, getNumberOfBanks(connection)+1): + bankTime[i] = round(bankTime[i]/traceEnd * 100,2) + + return ",".join(format(x, "6.2f") for x in bankTime) + # @metric # def number_of_precharges(connection):