aboutsummaryrefslogtreecommitdiff
path: root/cachelab-handout/driver.py
diff options
context:
space:
mode:
authorov-4 <hausemasterstream@gmail.com>2026-05-22 10:02:06 +0000
committerov-4 <hausemasterstream@gmail.com>2026-05-22 10:02:56 +0000
commit3217275daaf5d971b273d2a1e1cd42076e5a53fd (patch)
treef02afa2f832be8a290ae2c828f66f856336295a3 /cachelab-handout/driver.py
parent345279ea2a2ba7804cc077b8ecdd86621d8d1e92 (diff)
Cache lab initialization
Diffstat (limited to 'cachelab-handout/driver.py')
-rwxr-xr-xcachelab-handout/driver.py138
1 files changed, 138 insertions, 0 deletions
diff --git a/cachelab-handout/driver.py b/cachelab-handout/driver.py
new file mode 100755
index 0000000..f39bd9f
--- /dev/null
+++ b/cachelab-handout/driver.py
@@ -0,0 +1,138 @@
+#!/usr//bin/python
+#
+# driver.py - The driver tests the correctness of the student's cache
+# simulator and the correctness and performance of their transpose
+# function. It uses ./test-csim to check the correctness of the
+# simulator and it runs ./test-trans on three different sized
+# matrices (32x32, 64x64, and 61x67) to test the correctness and
+# performance of the transpose function.
+#
+import subprocess;
+import re;
+import os;
+import sys;
+import optparse;
+
+#
+# computeMissScore - compute the score depending on the number of
+# cache misses
+#
+def computeMissScore(miss, lower, upper, full_score):
+ if miss <= lower:
+ return full_score
+ if miss >= upper:
+ return 0
+
+ score = (miss - lower) * 1.0
+ range = (upper- lower) * 1.0
+ return round((1 - score / range) * full_score, 1)
+
+#
+# main - Main function
+#
+def main():
+
+ # Configure maxscores here
+ maxscore= {};
+ maxscore['csim'] = 27
+ maxscore['transc'] = 1
+ maxscore['trans32'] = 8
+ maxscore['trans64'] = 8
+ maxscore['trans61'] = 10
+
+ # Parse the command line arguments
+ p = optparse.OptionParser()
+ p.add_option("-A", action="store_true", dest="autograde",
+ help="emit autoresult string for Autolab");
+ opts, args = p.parse_args()
+ autograde = opts.autograde
+
+ # Check the correctness of the cache simulator
+ print "Part A: Testing cache simulator"
+ print "Running ./test-csim"
+ p = subprocess.Popen("./test-csim",
+ shell=True, stdout=subprocess.PIPE)
+ stdout_data = p.communicate()[0]
+
+ # Emit the output from test-csim
+ stdout_data = re.split('\n', stdout_data)
+ for line in stdout_data:
+ if re.match("TEST_CSIM_RESULTS", line):
+ resultsim = re.findall(r'(\d+)', line)
+ else:
+ print "%s" % (line)
+
+ # Check the correctness and performance of the transpose function
+ # 32x32 transpose
+ print "Part B: Testing transpose function"
+ print "Running ./test-trans -M 32 -N 32"
+ p = subprocess.Popen("./test-trans -M 32 -N 32 | grep TEST_TRANS_RESULTS",
+ shell=True, stdout=subprocess.PIPE)
+ stdout_data = p.communicate()[0]
+ result32 = re.findall(r'(\d+)', stdout_data)
+
+ # 64x64 transpose
+ print "Running ./test-trans -M 64 -N 64"
+ p = subprocess.Popen("./test-trans -M 64 -N 64 | grep TEST_TRANS_RESULTS",
+ shell=True, stdout=subprocess.PIPE)
+ stdout_data = p.communicate()[0]
+ result64 = re.findall(r'(\d+)', stdout_data)
+
+ # 61x67 transpose
+ print "Running ./test-trans -M 61 -N 67"
+ p = subprocess.Popen("./test-trans -M 61 -N 67 | grep TEST_TRANS_RESULTS",
+ shell=True, stdout=subprocess.PIPE)
+ stdout_data = p.communicate()[0]
+ result61 = re.findall(r'(\d+)', stdout_data)
+
+ # Compute the scores for each step
+ csim_cscore = map(int, resultsim[0:1])
+ trans_cscore = int(result32[0]) * int(result64[0]) * int(result61[0]);
+ miss32 = int(result32[1])
+ miss64 = int(result64[1])
+ miss61 = int(result61[1])
+ trans32_score = computeMissScore(miss32, 300, 600, maxscore['trans32']) * int(result32[0])
+ trans64_score = computeMissScore(miss64, 1300, 2000, maxscore['trans64']) * int(result64[0])
+ trans61_score = computeMissScore(miss61, 2000, 3000, maxscore['trans61']) * int(result61[0])
+ total_score = csim_cscore[0] + trans32_score + trans64_score + trans61_score
+
+ # Summarize the results
+ print "\nCache Lab summary:"
+ print "%-22s%8s%10s%12s" % ("", "Points", "Max pts", "Misses")
+ print "%-22s%8.1f%10d" % ("Csim correctness", csim_cscore[0],
+ maxscore['csim'])
+
+ misses = str(miss32)
+ if miss32 == 2**31-1 :
+ misses = "invalid"
+ print "%-22s%8.1f%10d%12s" % ("Trans perf 32x32", trans32_score,
+ maxscore['trans32'], misses)
+
+ misses = str(miss64)
+ if miss64 == 2**31-1 :
+ misses = "invalid"
+ print "%-22s%8.1f%10d%12s" % ("Trans perf 64x64", trans64_score,
+ maxscore['trans64'], misses)
+
+ misses = str(miss61)
+ if miss61 == 2**31-1 :
+ misses = "invalid"
+ print "%-22s%8.1f%10d%12s" % ("Trans perf 61x67", trans61_score,
+ maxscore['trans61'], misses)
+
+ print "%22s%8.1f%10d" % ("Total points", total_score,
+ maxscore['csim'] +
+ maxscore['trans32'] +
+ maxscore['trans64'] +
+ maxscore['trans61'])
+
+ # Emit autoresult string for Autolab if called with -A option
+ if autograde:
+ autoresult="%.1f:%d:%d:%d" % (total_score, miss32, miss64, miss61)
+ print "\nAUTORESULT_STRING=%s" % autoresult
+
+
+# execute main only if called as a script
+if __name__ == "__main__":
+ main()
+