Put regression tests back into m5. They are located in the "tests" directory. The directory output and reference outputs have changed slightly. Now the directory is ALPHA_SE/test/<test>/<cpu_model>/, and for the reference stats <test>/ref/<arch>/<cpu_model>
Right now only non-SMT SE regression tests have been added back in. The rest are pending getting SMT working, and consolidating the FS configuration files. Eventually support for different OSs can be added so you can specify which versions of the binary you want to run from one config file. Note: mp-test1 doesn't have any reference stats because MP mode doesn't currently work. The test itself should probably work once the code is fixed. SConstruct: Updates to allow for regression tests to work via the command line "scons build/ALPHA_SE/test/debug/quick" and such once again. src/cpu/SConscript: Keep a list of SMT supporting CPUs so that the regression tests can easily specify which CPUs to use if they are SMT only. --HG-- extra : convert_revision : 34e6286150aae8f316ae694f6c00be8f510522f2
This commit is contained in:
parent
660ea2b176
commit
4bd025742d
19 changed files with 3483 additions and 4 deletions
|
@ -494,10 +494,10 @@ for build_path in build_paths:
|
|||
exports = 'env')
|
||||
|
||||
# Set up the regression tests for each build.
|
||||
# for e in envList:
|
||||
# SConscript('m5-test/SConscript',
|
||||
# build_dir = os.path.join(build_dir, 'test', e.Label),
|
||||
# exports = { 'env' : e }, duplicate = False)
|
||||
for e in envList:
|
||||
SConscript('tests/SConscript',
|
||||
build_dir = os.path.join(build_path, 'test', e.Label),
|
||||
exports = { 'env' : e }, duplicate = False)
|
||||
|
||||
Help(help_text)
|
||||
|
||||
|
|
|
@ -114,6 +114,9 @@ CheckerSupportedCPUList = ['O3CPU', 'OzoneCPU']
|
|||
#
|
||||
#################################################################
|
||||
|
||||
# Keep a list of CPU models that support SMT
|
||||
env['SMT_CPU_MODELS'] = []
|
||||
|
||||
sources = []
|
||||
|
||||
need_simple_base = False
|
||||
|
@ -157,6 +160,7 @@ if 'O3CPU' in env['CPU_MODELS']:
|
|||
''')
|
||||
if env['USE_CHECKER']:
|
||||
sources += Split('o3/checker_builder.cc')
|
||||
env['SMT_CPU_MODELS'].append('O3CPU')
|
||||
|
||||
if 'OzoneCPU' in env['CPU_MODELS']:
|
||||
need_bp_unit = True
|
||||
|
|
244
tests/SConscript
Normal file
244
tests/SConscript
Normal file
|
@ -0,0 +1,244 @@
|
|||
# -*- mode:python -*-
|
||||
|
||||
# Copyright (c) 2004-2005 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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.
|
||||
|
||||
import os
|
||||
import sys
|
||||
import glob
|
||||
from SCons.Script.SConscript import SConsEnvironment
|
||||
|
||||
Import('env')
|
||||
|
||||
env['DIFFOUT'] = File('diff-out')
|
||||
|
||||
# Dict that accumulates lists of tests by category (quick, medium, long)
|
||||
env.Tests = {}
|
||||
|
||||
def contents(node):
|
||||
return file(str(node)).read()
|
||||
|
||||
def check_test(target, source, env):
|
||||
"""Check output from running test.
|
||||
|
||||
Targets are as follows:
|
||||
target[0] : outdiff
|
||||
target[1] : statsdiff
|
||||
target[2] : status
|
||||
|
||||
"""
|
||||
# make sure target files are all gone
|
||||
for t in target:
|
||||
if os.path.exists(t.abspath):
|
||||
Execute(Delete(t.abspath))
|
||||
# Run diff on output & ref directories to find differences.
|
||||
# Exclude m5stats.txt since we will use diff-out on that.
|
||||
Execute(env.subst('diff -ubr ${SOURCES[0].dir} ${SOURCES[1].dir} ' +
|
||||
'-I "^command line:" ' + # for stdout file
|
||||
'-I "^M5 compiled on" ' + # for stderr file
|
||||
'-I "^M5 simulation started" ' + # for stderr file
|
||||
'-I "^Simulation complete at" ' + # for stderr file
|
||||
'-I "^Listening for" ' + # for stderr file
|
||||
'--exclude=m5stats.txt --exclude=SCCS ' +
|
||||
'--exclude=${TARGETS[0].file} ' +
|
||||
'> ${TARGETS[0]}', target=target, source=source), None)
|
||||
print "===== Output differences ====="
|
||||
print contents(target[0])
|
||||
# Run diff-out on m5stats.txt file
|
||||
status = Execute(env.subst('$DIFFOUT $SOURCES > ${TARGETS[1]}',
|
||||
target=target, source=source),
|
||||
strfunction=None)
|
||||
print "===== Statistics differences ====="
|
||||
print contents(target[1])
|
||||
# Generate status file contents based on exit status of diff-out
|
||||
if status == 0:
|
||||
status_str = "passed."
|
||||
else:
|
||||
status_str = "FAILED!"
|
||||
f = file(str(target[2]), 'w')
|
||||
print >>f, env.subst('${TARGETS[2].dir}', target=target, source=source), \
|
||||
status_str
|
||||
f.close()
|
||||
# done
|
||||
return 0
|
||||
|
||||
def check_test_string(target, source, env):
|
||||
return env.subst("Comparing outputs in ${TARGETS[0].dir}.",
|
||||
target=target, source=source)
|
||||
|
||||
testAction = env.Action(check_test, check_test_string)
|
||||
|
||||
def print_test(target, source, env):
|
||||
print '***** ' + contents(source[0])
|
||||
return 0
|
||||
|
||||
printAction = env.Action(print_test, strfunction = None)
|
||||
|
||||
def update_test(target, source, env):
|
||||
"""Update reference test outputs.
|
||||
|
||||
Target is phony. First two sources are the ref & new m5stats.txt
|
||||
files, respectively. We actually copy everything in the
|
||||
respective directories except the status & diff output files.
|
||||
|
||||
"""
|
||||
dest_dir = str(source[0].get_dir())
|
||||
src_dir = str(source[1].get_dir())
|
||||
dest_files = os.listdir(dest_dir)
|
||||
src_files = os.listdir(src_dir)
|
||||
# Exclude status & diff outputs
|
||||
for f in ('outdiff', 'statsdiff', 'status'):
|
||||
if f in src_files:
|
||||
src_files.remove(f)
|
||||
for f in src_files:
|
||||
if f in dest_files:
|
||||
print " Replacing file", f
|
||||
dest_files.remove(f)
|
||||
else:
|
||||
print " Creating new file", f
|
||||
copyAction = Copy(os.path.join(dest_dir, f), os.path.join(src_dir, f))
|
||||
copyAction.strfunction = None
|
||||
Execute(copyAction)
|
||||
# warn about any files in dest not overwritten (other than SCCS dir)
|
||||
if 'SCCS' in dest_files:
|
||||
dest_files.remove('SCCS')
|
||||
if dest_files:
|
||||
print "Warning: file(s) in", dest_dir, "not updated:",
|
||||
print ', '.join(dest_files)
|
||||
return 0
|
||||
|
||||
def update_test_string(target, source, env):
|
||||
return env.subst("Updating ${SOURCES[0].dir} from ${SOURCES[1].dir}",
|
||||
target=target, source=source)
|
||||
|
||||
updateAction = env.Action(update_test, update_test_string)
|
||||
|
||||
def test_builder(env, category, cpu_list=[], os_list=[], refdir='ref', timeout=15):
|
||||
"""Define a test.
|
||||
|
||||
Args:
|
||||
category -- string describing test category (e.g., 'quick')
|
||||
cpu_list -- list of CPUs to runs this test on (blank means all compiled CPUs)
|
||||
os_list -- list of OSs to run this test on
|
||||
refdir -- subdirectory containing reference output (default 'ref')
|
||||
timeout -- test timeout in minutes (only enforced on pool)
|
||||
|
||||
"""
|
||||
|
||||
default_refdir = False
|
||||
if refdir == 'ref':
|
||||
default_refdir = True
|
||||
if len(cpu_list) == 0:
|
||||
cpu_list = env['CPU_MODELS']
|
||||
# if len(os_list) == 0:
|
||||
# raise RuntimeError, "No OS specified"
|
||||
# else:
|
||||
# for test_os in os_list:
|
||||
# build_cpu_test(env, category, test_os, cpu_list, refdir, timeout)
|
||||
# Loop through CPU models and generate proper options, ref directories for each
|
||||
for cpu in cpu_list:
|
||||
test_os = ''
|
||||
if cpu == "AtomicSimpleCPU":
|
||||
cpu_option = ('','atomic/')
|
||||
elif cpu == "TimingSimpleCPU":
|
||||
cpu_option = ('--timing','timing/')
|
||||
elif cpu == "O3CPU":
|
||||
cpu_option = ('--detailed','detailed/')
|
||||
else:
|
||||
raise TypeError, "Unknown CPU model specified"
|
||||
|
||||
if default_refdir:
|
||||
# Reference stats located in ref/arch/os/cpu or ref/arch/cpu if no OS specified
|
||||
test_refdir = os.path.join(refdir, env['TARGET_ISA'])
|
||||
if test_os != '':
|
||||
test_refdir = os.path.join(test_refdir, test_os)
|
||||
cpu_refdir = os.path.join(test_refdir, cpu_option[1])
|
||||
|
||||
ref_stats = os.path.join(cpu_refdir, 'm5stats.txt')
|
||||
|
||||
# base command for running test
|
||||
base_cmd = '${SOURCES[0]} -d $TARGET.dir ${SOURCES[1]}'
|
||||
base_cmd = base_cmd + ' ' + cpu_option[0]
|
||||
# stdout and stderr files
|
||||
cmd_stdout = '${TARGETS[0]}'
|
||||
cmd_stderr = '${TARGETS[1]}'
|
||||
|
||||
stdout_string = cpu_option[1] + 'stdout'
|
||||
stderr_string = cpu_option[1] + 'stderr'
|
||||
m5stats_string = cpu_option[1] + 'm5stats.txt'
|
||||
outdiff_string = cpu_option[1] + 'outdiff'
|
||||
statsdiff_string = cpu_option[1] + 'statsdiff'
|
||||
status_string = cpu_option[1] + 'status'
|
||||
|
||||
# Prefix test run with batch job submission command if appropriate.
|
||||
# Output redirection is also different for batch runs.
|
||||
# Batch command also supports timeout arg (in seconds, not minutes).
|
||||
if env['BATCH']:
|
||||
cmd = [env['BATCH_CMD'], '-t', str(timeout * 60),
|
||||
'-o', cmd_stdout, '-e', cmd_stderr, base_cmd]
|
||||
else:
|
||||
cmd = [base_cmd, '>', cmd_stdout, '2>', cmd_stderr]
|
||||
|
||||
env.Command([stdout_string, stderr_string, m5stats_string], [env.M5Binary, 'run.py'],
|
||||
' '.join(cmd))
|
||||
|
||||
# order of targets is important... see check_test
|
||||
env.Command([outdiff_string, statsdiff_string, status_string],
|
||||
[ref_stats, m5stats_string],
|
||||
testAction)
|
||||
|
||||
# phony target to echo status
|
||||
if env['update_ref']:
|
||||
p = env.Command(cpu_option[1] + '_update', [ref_stats, m5stats_string, status_string],
|
||||
updateAction)
|
||||
else:
|
||||
p = env.Command(cpu_option[1] + '_print', [status_string], printAction)
|
||||
env.AlwaysBuild(p)
|
||||
|
||||
env.Tests.setdefault(category, [])
|
||||
env.Tests[category] += p
|
||||
|
||||
# Make test_builder a "wrapper" function. See SCons wiki page at
|
||||
# http://www.scons.org/cgi-bin/wiki/WrapperFunctions.
|
||||
SConsEnvironment.Test = test_builder
|
||||
|
||||
cwd = os.getcwd()
|
||||
os.chdir(str(Dir('.').srcdir))
|
||||
scripts = glob.glob('*/SConscript')
|
||||
os.chdir(cwd)
|
||||
|
||||
for s in scripts:
|
||||
SConscript(s, exports = 'env', duplicate = False)
|
||||
|
||||
# Set up phony commands for various test categories
|
||||
allTests = []
|
||||
for (key, val) in env.Tests.iteritems():
|
||||
env.Command(key, val, env.NoAction)
|
||||
allTests += val
|
||||
|
||||
# The 'all' target is redundant since just specifying the test
|
||||
# directory name (e.g., ALPHA_SE/test/opt) has the same effect.
|
||||
env.Command('all', allTests, env.NoAction)
|
409
tests/diff-out
Executable file
409
tests/diff-out
Executable file
|
@ -0,0 +1,409 @@
|
|||
#!/usr/bin/perl
|
||||
# Copyright (c) 2001-2005 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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: Steve Reinhardt
|
||||
|
||||
#
|
||||
# This script diffs two SimpleScalar statistics output files.
|
||||
#
|
||||
|
||||
use Getopt::Std;
|
||||
|
||||
#
|
||||
# -t thresh sets threshold for ignoring differences (in %)
|
||||
# -p sorts differences by % chg (default is alphabetic)
|
||||
# -f ignores fetch-loss statistics
|
||||
# -d ignores all distributions
|
||||
#
|
||||
|
||||
getopts('dfn:pt:h');
|
||||
|
||||
if ($#ARGV < 1)
|
||||
{
|
||||
print "\nError: need two file arguments (<reference> <new>).\n";
|
||||
print " Options: -d = Ignore distributions\n";
|
||||
print " -f = Ignore fetch-loss stats\n";
|
||||
print " -p = Sort errors by percentage\n";
|
||||
print " -h = Diff header info separately from stats\n";
|
||||
print " -n <num> = Print top <num> errors (default 20)\n";
|
||||
print " -t <num> = Error threshold in percent (default 1)\n\n";
|
||||
die -1;
|
||||
}
|
||||
|
||||
open(REF, "<$ARGV[0]") or die "Error: can't open $ARGV[0].\n";
|
||||
open(NEW, "<$ARGV[1]") or die "Error: can't open $ARGV[1].\n";
|
||||
|
||||
|
||||
#
|
||||
# Things that really should be adjustable via the command line
|
||||
#
|
||||
|
||||
# Ignorable error (in percent)
|
||||
$err_thresh = ($opt_t) ? $opt_t : 0;
|
||||
|
||||
# Number of stats to print before omitting
|
||||
$omit_count = ($opt_n) ? $opt_n : 20;
|
||||
|
||||
|
||||
#
|
||||
# First copy everything up to the simulation statistics to a pair of
|
||||
# temporary files, stripping out date-related items, and do a plain
|
||||
# diff. Any differences in the arguments are not necessarily an issue;
|
||||
# any differences in the program output should be caught by the EIO
|
||||
# mechanism if an EIO file is used.
|
||||
#
|
||||
|
||||
# copy_header takes input filehandle and output filename
|
||||
|
||||
sub copy_header
|
||||
{
|
||||
my ($inhandle, $outname) = @_;
|
||||
|
||||
open(OUTPUT, ">$outname") or die "Error: can't open $outname.\n";
|
||||
|
||||
while (<$inhandle>)
|
||||
{
|
||||
# strip out lines that can vary
|
||||
next if /^(command line:|M5 compiled on |M5 simulation started |M5 executing on )/;
|
||||
last if /Begin Simulation Statistics/;
|
||||
print OUTPUT;
|
||||
}
|
||||
close OUTPUT;
|
||||
}
|
||||
|
||||
if ($opt_h) {
|
||||
|
||||
# Diff header separately from stats
|
||||
|
||||
$refheader = "/tmp/smt-test.refheader.$$";
|
||||
$newheader = "/tmp/smt-test.newheader.$$";
|
||||
|
||||
copy_header(\*REF, $refheader);
|
||||
copy_header(\*NEW, $newheader);
|
||||
|
||||
print "\n===== Header and program output differences =====\n\n";
|
||||
|
||||
print `diff $refheader $newheader`;
|
||||
|
||||
print "\n===== Statistics differences =====\n\n";
|
||||
}
|
||||
|
||||
#
|
||||
# Now parse statistics
|
||||
#
|
||||
|
||||
#
|
||||
# This function takes an open filehandle and returns a reference to
|
||||
# a hash containing all the statistics variables and their values.
|
||||
#
|
||||
sub parse_file
|
||||
{
|
||||
$stathandle = shift;
|
||||
|
||||
$in_dist = undef;
|
||||
$hashref = { }; # initialize hash for values
|
||||
|
||||
while (<$stathandle>)
|
||||
{
|
||||
next if /^\s*$/; # skip blank lines
|
||||
next if /^\*\*Ignore/; # temporary, to make totaling scripts easy for ISCA 03
|
||||
last if /End Simulation Statistics/;
|
||||
|
||||
s/ *#.*//; # strip comments
|
||||
|
||||
if (/^Memory usage: (\d+) KBytes/) {
|
||||
$stat = 'memory usage';
|
||||
$value = $1;
|
||||
}
|
||||
elsif ($in_dist) {
|
||||
if ($in_dist =~ /^fetch_loss_counters/) {
|
||||
if (/^fetch_loss_counters_\d+\.end/) {
|
||||
# end line of distribution: clear $in_dist flag
|
||||
$in_dist = undef;
|
||||
next;
|
||||
}
|
||||
else {
|
||||
next if $opt_f;
|
||||
|
||||
($stat, $value) = /^(\S+)\s+(.*)/;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (/(.*)\.end_dist/) {
|
||||
# end line of distribution: clear $in_dist flag
|
||||
$in_dist = undef;
|
||||
next;
|
||||
}
|
||||
if ($opt_d) {
|
||||
next; # bail out if we are ignoring dists...
|
||||
}
|
||||
elsif (/(.*)\.(min|max)_value/) {
|
||||
# treat these like normal stats
|
||||
($stat, $value) = /^(\S+)\s+(.*)/;
|
||||
}
|
||||
else {
|
||||
# this is ugly because labels in the distribution
|
||||
# buckets don't start in column 0 and may include
|
||||
# embedded spaces
|
||||
($stat, $value) =
|
||||
/^\s*(\S+(?:.*\S)?)\s+(\d+)\s+\d+\.\d+%/;
|
||||
$stat = $in_dist . '::' . $stat;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (/(.*)\.start_dist/) {
|
||||
# start line of distribution: set $in_dist flag
|
||||
# and save distribution name for future reference
|
||||
$in_dist = $1;
|
||||
$stat = $1;
|
||||
$value = 0;
|
||||
}
|
||||
elsif (/^(fetch_loss_counters_\d+)\.start/) {
|
||||
# treat fetch loss counters like distribution, sort of
|
||||
$in_dist = $1;
|
||||
$stat = $1;
|
||||
$value = 0;
|
||||
}
|
||||
else {
|
||||
($stat, $value) = /^(\S+)\s+(.*)/;
|
||||
}
|
||||
}
|
||||
|
||||
$$hashref{$stat} = $value;
|
||||
}
|
||||
|
||||
close($stathandle);
|
||||
return $hashref;
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# pct_diff($old, $new) returns percent difference from $old to $new.
|
||||
#
|
||||
sub pct_diff
|
||||
{
|
||||
my ($old, $new) = @_;
|
||||
return ($old == 0) ? (($new == 0) ? 0 : 9999) : 100 * ($new - $old) / $old;
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Statistics to ignore: these relate to simulator performance, not
|
||||
# correctness, so don't fail on changes here.
|
||||
#
|
||||
%ignore = (
|
||||
'host_seconds' => 1,
|
||||
'host_tick_rate' => 1,
|
||||
'host_inst_rate' => 1,
|
||||
'host_mem_usage' => 1
|
||||
);
|
||||
|
||||
#
|
||||
# List of key statistics (always displayed)
|
||||
# ==> list stats here WITHOUT trailing thread ID
|
||||
#
|
||||
@key_stat_list = (
|
||||
'COM:IPC',
|
||||
'ISSUE:MSIPC',
|
||||
'COM:count',
|
||||
'host_inst_rate',
|
||||
'sim_insts',
|
||||
'sim_ticks',
|
||||
'host_mem_usage'
|
||||
);
|
||||
|
||||
$key_stat_pattern = join('|', @key_stat_list);
|
||||
|
||||
# initialize first statistics from each file
|
||||
|
||||
$max_err_mag = 0;
|
||||
|
||||
$refhash = parse_file(\*REF);
|
||||
$newhash = parse_file(\*NEW);
|
||||
|
||||
# The string sim-smt prints on a divide by zero
|
||||
$divbyzero = '<err: divide by zero>';
|
||||
|
||||
foreach $stat (sort keys %$refhash)
|
||||
{
|
||||
$refvalue = $$refhash{$stat};
|
||||
$newvalue = $$newhash{$stat};
|
||||
|
||||
if (!defined($newvalue)) {
|
||||
# stat missing from new file
|
||||
push @missing_stats, $stat;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($stat =~ /($key_stat_pattern)/o) {
|
||||
# key statistics: always record & display changes in these
|
||||
push @key_stats, [$stat, $refvalue, $newvalue];
|
||||
}
|
||||
|
||||
if ($ignore{$stat} or $refvalue eq $newvalue) {
|
||||
# stat is in "ignore" list, or hasn't changed
|
||||
}
|
||||
else {
|
||||
if ($refvalue eq $divbyzero || $newvalue eq $divbyzero) {
|
||||
# one or the other was a divide by zero:
|
||||
# no point in trying to quantify error
|
||||
print "$stat: $refvalue --> $newvalue\n";
|
||||
}
|
||||
else {
|
||||
$reldiff = pct_diff($refvalue, $newvalue);
|
||||
$diffmag = abs($reldiff);
|
||||
|
||||
if ($diffmag > $err_thresh) {
|
||||
push @errs,
|
||||
[$stat, $refvalue, $newvalue, $reldiff];
|
||||
}
|
||||
|
||||
if ($diffmag > $max_err_mag) {
|
||||
$max_err_mag = $diffmag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# remove from new hash so we can detect added stats
|
||||
delete $$newhash{$stat};
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# All done. Print comparison summary.
|
||||
#
|
||||
|
||||
printf("Maximum error magnitude: %+f%%\n\n", $max_err_mag);
|
||||
|
||||
printf(" %-30s %10s %10s %10s %7s\n", ' ', 'Reference', 'New Value', 'Abs Diff', 'Pct Chg');
|
||||
|
||||
printf("Key statistics:\n\n");
|
||||
|
||||
foreach $key_stat (@key_stats)
|
||||
{
|
||||
($statname, $refvalue, $newvalue, $reldiff) = @$key_stat;
|
||||
|
||||
# deduce format from reference value
|
||||
$pointpos = rindex($refvalue, '.');
|
||||
$digits = ($pointpos < 0) ? 0 :(length($refvalue) - $pointpos - 1);
|
||||
$fmt = "%10.${digits}f";
|
||||
|
||||
# print differing values with absolute and relative error
|
||||
printf(" %-30s $fmt $fmt $fmt %+7.2f%%\n",
|
||||
$statname, $refvalue, $newvalue,
|
||||
$newvalue - $refvalue, pct_diff($refvalue, $newvalue));
|
||||
}
|
||||
|
||||
printf("\nLargest $omit_count relative errors (> %d%%):\n\n", $err_thresh);
|
||||
|
||||
$num_errs = 0;
|
||||
|
||||
if ($opt_p)
|
||||
{
|
||||
# sort differences by percent change
|
||||
@errs = sort { abs($$b[3]) <=> abs($$a[3]) } @errs;
|
||||
}
|
||||
|
||||
foreach $err (@errs)
|
||||
{
|
||||
($statname, $refvalue, $newvalue, $reldiff) = @$err;
|
||||
|
||||
# deduce format from reference value
|
||||
$pointpos1 = rindex($refvalue, '.');
|
||||
$digits1 = ($pointpos1 < 0) ? 0 :(length($refvalue) - $pointpos1 - 1);
|
||||
$pointpos2 = rindex($newvalue, '.');
|
||||
$digits2 = ($pointpos2 < 0) ? 0 :(length($newvalue) - $pointpos2 - 1);
|
||||
$digits = ($digits1 > $digits2) ? $digits1 : $digits2;
|
||||
$fmt = "%10.${digits}f";
|
||||
|
||||
# print differing values with absolute and relative error
|
||||
printf(" %-30s $fmt $fmt $fmt %+7.2f%%\n",
|
||||
$statname, $refvalue, $newvalue, $newvalue - $refvalue, $reldiff);
|
||||
|
||||
# only print top N errors
|
||||
if (++$num_errs >= $omit_count)
|
||||
{
|
||||
print "[... additional errors omitted ...]\n";
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Report missing stats, but first filter out distribution buckets:
|
||||
# these are mostly noise
|
||||
|
||||
@missing_stats = grep { !/::(\d+|overflows)?$/ } @missing_stats;
|
||||
|
||||
# get count
|
||||
$missing_stats = scalar(@missing_stats);
|
||||
|
||||
if ($missing_stats)
|
||||
{
|
||||
print "\nMissing $missing_stats reference statistics:\n\n";
|
||||
foreach $stat (@missing_stats)
|
||||
{
|
||||
# print "\t$stat\n";
|
||||
printf " %-50s ", $stat;
|
||||
print "$$refhash{$stat}\n";
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Any stats left in newhash are added since the reference file
|
||||
#
|
||||
|
||||
@added_stats = keys %$newhash;
|
||||
|
||||
# first filter out distribution buckets: mostly noise
|
||||
|
||||
@added_stats = grep { !/::(\d+|overflows)?$/ } @added_stats;
|
||||
|
||||
# get count
|
||||
$added_stats = scalar(@added_stats);
|
||||
|
||||
if ($added_stats)
|
||||
{
|
||||
print "\nFound $added_stats new statistics:\n\n";
|
||||
foreach $stat (sort @added_stats)
|
||||
{
|
||||
# print "\t$stat\n";
|
||||
printf " %-50s ", $stat;
|
||||
print "$$newhash{$stat}\n";
|
||||
}
|
||||
}
|
||||
|
||||
cleanup();
|
||||
# Exit code is 0 if no stats error, 1 otherwise
|
||||
$status = ($max_err_mag == 0.0) ? 0 : 1;
|
||||
exit $status;
|
||||
|
||||
sub cleanup
|
||||
{
|
||||
unlink($refheader) if ($refheader);
|
||||
unlink($newheader) if ($newheader);
|
||||
}
|
95
tests/test1/ref/alpha/atomic/config.ini
Normal file
95
tests/test1/ref/alpha/atomic/config.ini
Normal file
|
@ -0,0 +1,95 @@
|
|||
[root]
|
||||
type=Root
|
||||
children=system
|
||||
checkpoint=
|
||||
clock=1000000000000
|
||||
max_tick=0
|
||||
output_file=cout
|
||||
progress_interval=0
|
||||
|
||||
[debug]
|
||||
break_cycles=
|
||||
|
||||
[exetrace]
|
||||
intel_format=false
|
||||
pc_symbol=true
|
||||
print_cpseq=false
|
||||
print_cycle=true
|
||||
print_data=true
|
||||
print_effaddr=true
|
||||
print_fetchseq=false
|
||||
print_iregs=false
|
||||
print_opclass=true
|
||||
print_thread=true
|
||||
speculative=true
|
||||
trace_system=client
|
||||
|
||||
[serialize]
|
||||
count=10
|
||||
cycle=0
|
||||
dir=cpt.%012d
|
||||
period=0
|
||||
|
||||
[stats]
|
||||
descriptions=true
|
||||
dump_cycle=0
|
||||
dump_period=0
|
||||
dump_reset=false
|
||||
ignore_events=
|
||||
mysql_db=
|
||||
mysql_host=
|
||||
mysql_password=
|
||||
mysql_user=
|
||||
project_name=test
|
||||
simulation_name=test
|
||||
simulation_sample=0
|
||||
text_compat=true
|
||||
text_file=m5stats.txt
|
||||
|
||||
[system]
|
||||
type=System
|
||||
children=cpu0 physmem workload
|
||||
mem_mode=atomic
|
||||
physmem=system.physmem
|
||||
|
||||
[system.cpu0]
|
||||
type=AtomicSimpleCPU
|
||||
children=mem
|
||||
clock=1
|
||||
defer_registration=false
|
||||
function_trace=false
|
||||
function_trace_start=0
|
||||
max_insts_all_threads=0
|
||||
max_insts_any_thread=500000
|
||||
max_loads_all_threads=0
|
||||
max_loads_any_thread=0
|
||||
mem=system.cpu0.mem
|
||||
simulate_stalls=false
|
||||
system=system
|
||||
width=1
|
||||
workload=system.workload
|
||||
|
||||
[system.cpu0.mem]
|
||||
type=Bus
|
||||
bus_id=0
|
||||
|
||||
[system.physmem]
|
||||
type=PhysicalMemory
|
||||
file=
|
||||
latency=1
|
||||
|
||||
[system.workload]
|
||||
type=EioProcess
|
||||
chkpt=
|
||||
file=/z/ktlim2/clean/newmem-merge/tests/test-progs/anagram/bin/anagram-vshort.eio.gz
|
||||
output=cout
|
||||
system=system
|
||||
|
||||
[trace]
|
||||
bufsize=0
|
||||
dump_on_exit=false
|
||||
file=cout
|
||||
flags=
|
||||
ignore=
|
||||
start=0
|
||||
|
90
tests/test1/ref/alpha/atomic/config.out
Normal file
90
tests/test1/ref/alpha/atomic/config.out
Normal file
|
@ -0,0 +1,90 @@
|
|||
[root]
|
||||
type=Root
|
||||
clock=1000000000000
|
||||
max_tick=0
|
||||
progress_interval=0
|
||||
output_file=cout
|
||||
|
||||
[system.physmem]
|
||||
type=PhysicalMemory
|
||||
file=
|
||||
// range not specified
|
||||
latency=1
|
||||
|
||||
[system]
|
||||
type=System
|
||||
physmem=system.physmem
|
||||
mem_mode=atomic
|
||||
|
||||
[system.workload]
|
||||
type=EioProcess
|
||||
file=/z/ktlim2/clean/newmem-merge/tests/test-progs/anagram/bin/anagram-vshort.eio.gz
|
||||
chkpt=
|
||||
output=cout
|
||||
system=system
|
||||
|
||||
[system.cpu0.mem]
|
||||
type=Bus
|
||||
bus_id=0
|
||||
|
||||
[system.cpu0]
|
||||
type=AtomicSimpleCPU
|
||||
max_insts_any_thread=500000
|
||||
max_insts_all_threads=0
|
||||
max_loads_any_thread=0
|
||||
max_loads_all_threads=0
|
||||
mem=system.cpu0.mem
|
||||
system=system
|
||||
workload=system.workload
|
||||
clock=1
|
||||
defer_registration=false
|
||||
width=1
|
||||
function_trace=false
|
||||
function_trace_start=0
|
||||
simulate_stalls=false
|
||||
|
||||
[trace]
|
||||
flags=
|
||||
start=0
|
||||
bufsize=0
|
||||
file=cout
|
||||
dump_on_exit=false
|
||||
ignore=
|
||||
|
||||
[stats]
|
||||
descriptions=true
|
||||
project_name=test
|
||||
simulation_name=test
|
||||
simulation_sample=0
|
||||
text_file=m5stats.txt
|
||||
text_compat=true
|
||||
mysql_db=
|
||||
mysql_user=
|
||||
mysql_password=
|
||||
mysql_host=
|
||||
events_start=-1
|
||||
dump_reset=false
|
||||
dump_cycle=0
|
||||
dump_period=0
|
||||
ignore_events=
|
||||
|
||||
[random]
|
||||
seed=1
|
||||
|
||||
[exetrace]
|
||||
speculative=true
|
||||
print_cycle=true
|
||||
print_opclass=true
|
||||
print_thread=true
|
||||
print_effaddr=true
|
||||
print_data=true
|
||||
print_iregs=false
|
||||
print_fetchseq=false
|
||||
print_cpseq=false
|
||||
pc_symbol=true
|
||||
intel_format=false
|
||||
trace_system=client
|
||||
|
||||
[debug]
|
||||
break_cycles=
|
||||
|
18
tests/test1/ref/alpha/atomic/m5stats.txt
Normal file
18
tests/test1/ref/alpha/atomic/m5stats.txt
Normal file
|
@ -0,0 +1,18 @@
|
|||
|
||||
---------- Begin Simulation Statistics ----------
|
||||
host_inst_rate 1301768 # Simulator instruction rate (inst/s)
|
||||
host_mem_usage 147756 # Number of bytes of host memory used
|
||||
host_seconds 0.38 # Real time elapsed on the host
|
||||
host_tick_rate 1300060 # Simulator tick rate (ticks/s)
|
||||
sim_freq 1000000000000 # Frequency of simulated ticks
|
||||
sim_insts 500000 # Number of instructions simulated
|
||||
sim_seconds 0.000000 # Number of seconds simulated
|
||||
sim_ticks 499999 # Number of ticks simulated
|
||||
system.cpu0.idle_fraction 0 # Percentage of idle cycles
|
||||
system.cpu0.not_idle_fraction 1 # Percentage of non-idle cycles
|
||||
system.cpu0.numCycles 500000 # number of cpu cycles simulated
|
||||
system.cpu0.num_insts 500000 # Number of instructions executed
|
||||
system.cpu0.num_refs 182204 # Number of memory references
|
||||
system.workload.PROG:num_syscalls 18 # Number of system calls
|
||||
|
||||
---------- End Simulation Statistics ----------
|
3
tests/test1/ref/alpha/atomic/stderr
Normal file
3
tests/test1/ref/alpha/atomic/stderr
Normal file
|
@ -0,0 +1,3 @@
|
|||
warn: Entering event queue @ 0. Starting simulation...
|
||||
|
||||
gzip: stdout: Broken pipe
|
14
tests/test1/ref/alpha/atomic/stdout
Normal file
14
tests/test1/ref/alpha/atomic/stdout
Normal file
|
@ -0,0 +1,14 @@
|
|||
main dictionary has 1245 entries
|
||||
49508 bytes wasted
|
||||
>M5 Simulator System
|
||||
|
||||
Copyright (c) 2001-2006
|
||||
The Regents of The University of Michigan
|
||||
All Rights Reserved
|
||||
|
||||
|
||||
M5 compiled Jul 19 2006 15:49:01
|
||||
M5 started Wed Jul 19 15:49:10 2006
|
||||
M5 executing on zamp.eecs.umich.edu
|
||||
Creating SE system
|
||||
Exiting @ tick 499999 because a thread reached the max instruction count
|
298
tests/test1/ref/alpha/detailed/config.ini
Normal file
298
tests/test1/ref/alpha/detailed/config.ini
Normal file
|
@ -0,0 +1,298 @@
|
|||
[root]
|
||||
type=Root
|
||||
children=system
|
||||
checkpoint=
|
||||
clock=1000000000000
|
||||
max_tick=0
|
||||
output_file=cout
|
||||
progress_interval=0
|
||||
|
||||
[debug]
|
||||
break_cycles=
|
||||
|
||||
[exetrace]
|
||||
intel_format=false
|
||||
pc_symbol=true
|
||||
print_cpseq=false
|
||||
print_cycle=true
|
||||
print_data=true
|
||||
print_effaddr=true
|
||||
print_fetchseq=false
|
||||
print_iregs=false
|
||||
print_opclass=true
|
||||
print_thread=true
|
||||
speculative=true
|
||||
trace_system=client
|
||||
|
||||
[serialize]
|
||||
count=10
|
||||
cycle=0
|
||||
dir=cpt.%012d
|
||||
period=0
|
||||
|
||||
[stats]
|
||||
descriptions=true
|
||||
dump_cycle=0
|
||||
dump_period=0
|
||||
dump_reset=false
|
||||
ignore_events=
|
||||
mysql_db=
|
||||
mysql_host=
|
||||
mysql_password=
|
||||
mysql_user=
|
||||
project_name=test
|
||||
simulation_name=test
|
||||
simulation_sample=0
|
||||
text_compat=true
|
||||
text_file=m5stats.txt
|
||||
|
||||
[system]
|
||||
type=System
|
||||
children=cpu0 physmem workload
|
||||
mem_mode=atomic
|
||||
physmem=system.physmem
|
||||
|
||||
[system.cpu0]
|
||||
type=DerivO3CPU
|
||||
children=checker fuPool mem
|
||||
BTBEntries=4096
|
||||
BTBTagSize=16
|
||||
LFSTSize=1024
|
||||
LQEntries=32
|
||||
RASSize=16
|
||||
SQEntries=32
|
||||
SSITSize=1024
|
||||
activity=0
|
||||
backComSize=5
|
||||
checker=system.cpu0.checker
|
||||
choiceCtrBits=2
|
||||
choicePredictorSize=8192
|
||||
clock=1
|
||||
commitToDecodeDelay=1
|
||||
commitToFetchDelay=1
|
||||
commitToIEWDelay=1
|
||||
commitToRenameDelay=1
|
||||
commitWidth=8
|
||||
decodeToFetchDelay=1
|
||||
decodeToRenameDelay=1
|
||||
decodeWidth=8
|
||||
defer_registration=false
|
||||
dispatchWidth=8
|
||||
fetchToDecodeDelay=1
|
||||
fetchWidth=8
|
||||
forwardComSize=5
|
||||
fuPool=system.cpu0.fuPool
|
||||
function_trace=false
|
||||
function_trace_start=0
|
||||
globalCtrBits=2
|
||||
globalHistoryBits=13
|
||||
globalPredictorSize=8192
|
||||
iewToCommitDelay=1
|
||||
iewToDecodeDelay=1
|
||||
iewToFetchDelay=1
|
||||
iewToRenameDelay=1
|
||||
instShiftAmt=2
|
||||
issueToExecuteDelay=1
|
||||
issueWidth=8
|
||||
localCtrBits=2
|
||||
localHistoryBits=11
|
||||
localHistoryTableSize=2048
|
||||
localPredictorSize=2048
|
||||
max_insts_all_threads=0
|
||||
max_insts_any_thread=500000
|
||||
max_loads_all_threads=0
|
||||
max_loads_any_thread=0
|
||||
mem=system.cpu0.mem
|
||||
numIQEntries=64
|
||||
numPhysFloatRegs=256
|
||||
numPhysIntRegs=256
|
||||
numROBEntries=192
|
||||
numThreads=1
|
||||
predType=tournament
|
||||
renameToDecodeDelay=1
|
||||
renameToFetchDelay=1
|
||||
renameToIEWDelay=2
|
||||
renameToROBDelay=1
|
||||
renameWidth=8
|
||||
squashWidth=8
|
||||
system=system
|
||||
wbDepth=1
|
||||
wbWidth=8
|
||||
workload=system.workload
|
||||
|
||||
[system.cpu0.checker]
|
||||
type=O3Checker
|
||||
clock=1
|
||||
defer_registration=false
|
||||
exitOnError=true
|
||||
function_trace=false
|
||||
function_trace_start=0
|
||||
max_insts_all_threads=0
|
||||
max_insts_any_thread=0
|
||||
max_loads_all_threads=0
|
||||
max_loads_any_thread=0
|
||||
system=system
|
||||
warnOnlyOnLoadError=false
|
||||
workload=system.workload
|
||||
|
||||
[system.cpu0.fuPool]
|
||||
type=FUPool
|
||||
children=FUList0 FUList1 FUList2 FUList3 FUList4 FUList5 FUList6 FUList7
|
||||
FUList=system.cpu0.fuPool.FUList0 system.cpu0.fuPool.FUList1 system.cpu0.fuPool.FUList2 system.cpu0.fuPool.FUList3 system.cpu0.fuPool.FUList4 system.cpu0.fuPool.FUList5 system.cpu0.fuPool.FUList6 system.cpu0.fuPool.FUList7
|
||||
|
||||
[system.cpu0.fuPool.FUList0]
|
||||
type=FUDesc
|
||||
children=opList0
|
||||
count=6
|
||||
opList=system.cpu0.fuPool.FUList0.opList0
|
||||
|
||||
[system.cpu0.fuPool.FUList0.opList0]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=IntAlu
|
||||
opLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList1]
|
||||
type=FUDesc
|
||||
children=opList0 opList1
|
||||
count=2
|
||||
opList=system.cpu0.fuPool.FUList1.opList0 system.cpu0.fuPool.FUList1.opList1
|
||||
|
||||
[system.cpu0.fuPool.FUList1.opList0]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=IntMult
|
||||
opLat=3
|
||||
|
||||
[system.cpu0.fuPool.FUList1.opList1]
|
||||
type=OpDesc
|
||||
issueLat=19
|
||||
opClass=IntDiv
|
||||
opLat=20
|
||||
|
||||
[system.cpu0.fuPool.FUList2]
|
||||
type=FUDesc
|
||||
children=opList0 opList1 opList2
|
||||
count=4
|
||||
opList=system.cpu0.fuPool.FUList2.opList0 system.cpu0.fuPool.FUList2.opList1 system.cpu0.fuPool.FUList2.opList2
|
||||
|
||||
[system.cpu0.fuPool.FUList2.opList0]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=FloatAdd
|
||||
opLat=2
|
||||
|
||||
[system.cpu0.fuPool.FUList2.opList1]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=FloatCmp
|
||||
opLat=2
|
||||
|
||||
[system.cpu0.fuPool.FUList2.opList2]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=FloatCvt
|
||||
opLat=2
|
||||
|
||||
[system.cpu0.fuPool.FUList3]
|
||||
type=FUDesc
|
||||
children=opList0 opList1 opList2
|
||||
count=2
|
||||
opList=system.cpu0.fuPool.FUList3.opList0 system.cpu0.fuPool.FUList3.opList1 system.cpu0.fuPool.FUList3.opList2
|
||||
|
||||
[system.cpu0.fuPool.FUList3.opList0]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=FloatMult
|
||||
opLat=4
|
||||
|
||||
[system.cpu0.fuPool.FUList3.opList1]
|
||||
type=OpDesc
|
||||
issueLat=12
|
||||
opClass=FloatDiv
|
||||
opLat=12
|
||||
|
||||
[system.cpu0.fuPool.FUList3.opList2]
|
||||
type=OpDesc
|
||||
issueLat=24
|
||||
opClass=FloatSqrt
|
||||
opLat=24
|
||||
|
||||
[system.cpu0.fuPool.FUList4]
|
||||
type=FUDesc
|
||||
children=opList0
|
||||
count=0
|
||||
opList=system.cpu0.fuPool.FUList4.opList0
|
||||
|
||||
[system.cpu0.fuPool.FUList4.opList0]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=MemRead
|
||||
opLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList5]
|
||||
type=FUDesc
|
||||
children=opList0
|
||||
count=0
|
||||
opList=system.cpu0.fuPool.FUList5.opList0
|
||||
|
||||
[system.cpu0.fuPool.FUList5.opList0]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=MemWrite
|
||||
opLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList6]
|
||||
type=FUDesc
|
||||
children=opList0 opList1
|
||||
count=4
|
||||
opList=system.cpu0.fuPool.FUList6.opList0 system.cpu0.fuPool.FUList6.opList1
|
||||
|
||||
[system.cpu0.fuPool.FUList6.opList0]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=MemRead
|
||||
opLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList6.opList1]
|
||||
type=OpDesc
|
||||
issueLat=1
|
||||
opClass=MemWrite
|
||||
opLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList7]
|
||||
type=FUDesc
|
||||
children=opList0
|
||||
count=1
|
||||
opList=system.cpu0.fuPool.FUList7.opList0
|
||||
|
||||
[system.cpu0.fuPool.FUList7.opList0]
|
||||
type=OpDesc
|
||||
issueLat=3
|
||||
opClass=IprAccess
|
||||
opLat=3
|
||||
|
||||
[system.cpu0.mem]
|
||||
type=Bus
|
||||
bus_id=0
|
||||
|
||||
[system.physmem]
|
||||
type=PhysicalMemory
|
||||
file=
|
||||
latency=1
|
||||
|
||||
[system.workload]
|
||||
type=EioProcess
|
||||
chkpt=
|
||||
file=/z/ktlim2/clean/newmem-merge/tests/test-progs/anagram/bin/anagram-vshort.eio.gz
|
||||
output=cout
|
||||
system=system
|
||||
|
||||
[trace]
|
||||
bufsize=0
|
||||
dump_on_exit=false
|
||||
file=cout
|
||||
flags=
|
||||
ignore=
|
||||
start=0
|
||||
|
293
tests/test1/ref/alpha/detailed/config.out
Normal file
293
tests/test1/ref/alpha/detailed/config.out
Normal file
|
@ -0,0 +1,293 @@
|
|||
[root]
|
||||
type=Root
|
||||
clock=1000000000000
|
||||
max_tick=0
|
||||
progress_interval=0
|
||||
output_file=cout
|
||||
|
||||
[system.physmem]
|
||||
type=PhysicalMemory
|
||||
file=
|
||||
// range not specified
|
||||
latency=1
|
||||
|
||||
[system]
|
||||
type=System
|
||||
physmem=system.physmem
|
||||
mem_mode=atomic
|
||||
|
||||
[system.workload]
|
||||
type=EioProcess
|
||||
file=/z/ktlim2/clean/newmem-merge/tests/test-progs/anagram/bin/anagram-vshort.eio.gz
|
||||
chkpt=
|
||||
output=cout
|
||||
system=system
|
||||
|
||||
[system.cpu0.mem]
|
||||
type=Bus
|
||||
bus_id=0
|
||||
|
||||
[system.cpu0.checker]
|
||||
type=O3Checker
|
||||
max_insts_any_thread=0
|
||||
max_insts_all_threads=0
|
||||
max_loads_any_thread=0
|
||||
max_loads_all_threads=0
|
||||
workload=system.workload
|
||||
clock=1
|
||||
defer_registration=false
|
||||
exitOnError=true
|
||||
warnOnlyOnLoadError=false
|
||||
function_trace=false
|
||||
function_trace_start=0
|
||||
|
||||
[system.cpu0.fuPool.FUList0.opList0]
|
||||
type=OpDesc
|
||||
opClass=IntAlu
|
||||
opLat=1
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList0]
|
||||
type=FUDesc
|
||||
opList=system.cpu0.fuPool.FUList0.opList0
|
||||
count=6
|
||||
|
||||
[system.cpu0.fuPool.FUList1.opList0]
|
||||
type=OpDesc
|
||||
opClass=IntMult
|
||||
opLat=3
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList1.opList1]
|
||||
type=OpDesc
|
||||
opClass=IntDiv
|
||||
opLat=20
|
||||
issueLat=19
|
||||
|
||||
[system.cpu0.fuPool.FUList1]
|
||||
type=FUDesc
|
||||
opList=system.cpu0.fuPool.FUList1.opList0 system.cpu0.fuPool.FUList1.opList1
|
||||
count=2
|
||||
|
||||
[system.cpu0.fuPool.FUList2.opList0]
|
||||
type=OpDesc
|
||||
opClass=FloatAdd
|
||||
opLat=2
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList2.opList1]
|
||||
type=OpDesc
|
||||
opClass=FloatCmp
|
||||
opLat=2
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList2.opList2]
|
||||
type=OpDesc
|
||||
opClass=FloatCvt
|
||||
opLat=2
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList2]
|
||||
type=FUDesc
|
||||
opList=system.cpu0.fuPool.FUList2.opList0 system.cpu0.fuPool.FUList2.opList1 system.cpu0.fuPool.FUList2.opList2
|
||||
count=4
|
||||
|
||||
[system.cpu0.fuPool.FUList3.opList0]
|
||||
type=OpDesc
|
||||
opClass=FloatMult
|
||||
opLat=4
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList3.opList1]
|
||||
type=OpDesc
|
||||
opClass=FloatDiv
|
||||
opLat=12
|
||||
issueLat=12
|
||||
|
||||
[system.cpu0.fuPool.FUList3.opList2]
|
||||
type=OpDesc
|
||||
opClass=FloatSqrt
|
||||
opLat=24
|
||||
issueLat=24
|
||||
|
||||
[system.cpu0.fuPool.FUList3]
|
||||
type=FUDesc
|
||||
opList=system.cpu0.fuPool.FUList3.opList0 system.cpu0.fuPool.FUList3.opList1 system.cpu0.fuPool.FUList3.opList2
|
||||
count=2
|
||||
|
||||
[system.cpu0.fuPool.FUList4.opList0]
|
||||
type=OpDesc
|
||||
opClass=MemRead
|
||||
opLat=1
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList4]
|
||||
type=FUDesc
|
||||
opList=system.cpu0.fuPool.FUList4.opList0
|
||||
count=0
|
||||
|
||||
[system.cpu0.fuPool.FUList5.opList0]
|
||||
type=OpDesc
|
||||
opClass=MemWrite
|
||||
opLat=1
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList5]
|
||||
type=FUDesc
|
||||
opList=system.cpu0.fuPool.FUList5.opList0
|
||||
count=0
|
||||
|
||||
[system.cpu0.fuPool.FUList6.opList0]
|
||||
type=OpDesc
|
||||
opClass=MemRead
|
||||
opLat=1
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList6.opList1]
|
||||
type=OpDesc
|
||||
opClass=MemWrite
|
||||
opLat=1
|
||||
issueLat=1
|
||||
|
||||
[system.cpu0.fuPool.FUList6]
|
||||
type=FUDesc
|
||||
opList=system.cpu0.fuPool.FUList6.opList0 system.cpu0.fuPool.FUList6.opList1
|
||||
count=4
|
||||
|
||||
[system.cpu0.fuPool.FUList7.opList0]
|
||||
type=OpDesc
|
||||
opClass=IprAccess
|
||||
opLat=3
|
||||
issueLat=3
|
||||
|
||||
[system.cpu0.fuPool.FUList7]
|
||||
type=FUDesc
|
||||
opList=system.cpu0.fuPool.FUList7.opList0
|
||||
count=1
|
||||
|
||||
[system.cpu0.fuPool]
|
||||
type=FUPool
|
||||
FUList=system.cpu0.fuPool.FUList0 system.cpu0.fuPool.FUList1 system.cpu0.fuPool.FUList2 system.cpu0.fuPool.FUList3 system.cpu0.fuPool.FUList4 system.cpu0.fuPool.FUList5 system.cpu0.fuPool.FUList6 system.cpu0.fuPool.FUList7
|
||||
|
||||
[system.cpu0]
|
||||
type=DerivO3CPU
|
||||
clock=1
|
||||
numThreads=1
|
||||
activity=0
|
||||
workload=system.workload
|
||||
mem=system.cpu0.mem
|
||||
checker=system.cpu0.checker
|
||||
max_insts_any_thread=500000
|
||||
max_insts_all_threads=0
|
||||
max_loads_any_thread=0
|
||||
max_loads_all_threads=0
|
||||
cachePorts=200
|
||||
decodeToFetchDelay=1
|
||||
renameToFetchDelay=1
|
||||
iewToFetchDelay=1
|
||||
commitToFetchDelay=1
|
||||
fetchWidth=8
|
||||
renameToDecodeDelay=1
|
||||
iewToDecodeDelay=1
|
||||
commitToDecodeDelay=1
|
||||
fetchToDecodeDelay=1
|
||||
decodeWidth=8
|
||||
iewToRenameDelay=1
|
||||
commitToRenameDelay=1
|
||||
decodeToRenameDelay=1
|
||||
renameWidth=8
|
||||
commitToIEWDelay=1
|
||||
renameToIEWDelay=2
|
||||
issueToExecuteDelay=1
|
||||
dispatchWidth=8
|
||||
issueWidth=8
|
||||
wbWidth=8
|
||||
wbDepth=1
|
||||
fuPool=system.cpu0.fuPool
|
||||
iewToCommitDelay=1
|
||||
renameToROBDelay=1
|
||||
commitWidth=8
|
||||
squashWidth=8
|
||||
trapLatency=6
|
||||
backComSize=5
|
||||
forwardComSize=5
|
||||
predType=tournament
|
||||
localPredictorSize=2048
|
||||
localCtrBits=2
|
||||
localHistoryTableSize=2048
|
||||
localHistoryBits=11
|
||||
globalPredictorSize=8192
|
||||
globalCtrBits=2
|
||||
globalHistoryBits=13
|
||||
choicePredictorSize=8192
|
||||
choiceCtrBits=2
|
||||
BTBEntries=4096
|
||||
BTBTagSize=16
|
||||
RASSize=16
|
||||
LQEntries=32
|
||||
SQEntries=32
|
||||
LFSTSize=1024
|
||||
SSITSize=1024
|
||||
numPhysIntRegs=256
|
||||
numPhysFloatRegs=256
|
||||
numIQEntries=64
|
||||
numROBEntries=192
|
||||
smtNumFetchingThreads=1
|
||||
smtFetchPolicy=SingleThread
|
||||
smtLSQPolicy=Partitioned
|
||||
smtLSQThreshold=100
|
||||
smtIQPolicy=Partitioned
|
||||
smtIQThreshold=100
|
||||
smtROBPolicy=Partitioned
|
||||
smtROBThreshold=100
|
||||
smtCommitPolicy=RoundRobin
|
||||
instShiftAmt=2
|
||||
defer_registration=false
|
||||
function_trace=false
|
||||
function_trace_start=0
|
||||
|
||||
[trace]
|
||||
flags=
|
||||
start=0
|
||||
bufsize=0
|
||||
file=cout
|
||||
dump_on_exit=false
|
||||
ignore=
|
||||
|
||||
[stats]
|
||||
descriptions=true
|
||||
project_name=test
|
||||
simulation_name=test
|
||||
simulation_sample=0
|
||||
text_file=m5stats.txt
|
||||
text_compat=true
|
||||
mysql_db=
|
||||
mysql_user=
|
||||
mysql_password=
|
||||
mysql_host=
|
||||
events_start=-1
|
||||
dump_reset=false
|
||||
dump_cycle=0
|
||||
dump_period=0
|
||||
ignore_events=
|
||||
|
||||
[random]
|
||||
seed=1
|
||||
|
||||
[exetrace]
|
||||
speculative=true
|
||||
print_cycle=true
|
||||
print_opclass=true
|
||||
print_thread=true
|
||||
print_effaddr=true
|
||||
print_data=true
|
||||
print_iregs=false
|
||||
print_fetchseq=false
|
||||
print_cpseq=false
|
||||
pc_symbol=true
|
||||
intel_format=false
|
||||
trace_system=client
|
||||
|
||||
[debug]
|
||||
break_cycles=
|
||||
|
1775
tests/test1/ref/alpha/detailed/m5stats.txt
Normal file
1775
tests/test1/ref/alpha/detailed/m5stats.txt
Normal file
File diff suppressed because it is too large
Load diff
4
tests/test1/ref/alpha/detailed/stderr
Normal file
4
tests/test1/ref/alpha/detailed/stderr
Normal file
|
@ -0,0 +1,4 @@
|
|||
warn: Entering event queue @ 0. Starting simulation...
|
||||
warn: cycle 0: fault (1) detected @ PC 0x000000
|
||||
|
||||
gzip: stdout: Broken pipe
|
14
tests/test1/ref/alpha/detailed/stdout
Normal file
14
tests/test1/ref/alpha/detailed/stdout
Normal file
|
@ -0,0 +1,14 @@
|
|||
main dictionary has 1245 entries
|
||||
49508 bytes wasted
|
||||
>M5 Simulator System
|
||||
|
||||
Copyright (c) 2001-2006
|
||||
The Regents of The University of Michigan
|
||||
All Rights Reserved
|
||||
|
||||
|
||||
M5 compiled Jul 19 2006 15:49:01
|
||||
M5 started Wed Jul 19 15:49:12 2006
|
||||
M5 executing on zamp.eecs.umich.edu
|
||||
Creating SE system
|
||||
Exiting @ tick 259259 because a thread reached the max instruction count
|
93
tests/test1/ref/alpha/timing/config.ini
Normal file
93
tests/test1/ref/alpha/timing/config.ini
Normal file
|
@ -0,0 +1,93 @@
|
|||
[root]
|
||||
type=Root
|
||||
children=system
|
||||
checkpoint=
|
||||
clock=1000000000000
|
||||
max_tick=0
|
||||
output_file=cout
|
||||
progress_interval=0
|
||||
|
||||
[debug]
|
||||
break_cycles=
|
||||
|
||||
[exetrace]
|
||||
intel_format=false
|
||||
pc_symbol=true
|
||||
print_cpseq=false
|
||||
print_cycle=true
|
||||
print_data=true
|
||||
print_effaddr=true
|
||||
print_fetchseq=false
|
||||
print_iregs=false
|
||||
print_opclass=true
|
||||
print_thread=true
|
||||
speculative=true
|
||||
trace_system=client
|
||||
|
||||
[serialize]
|
||||
count=10
|
||||
cycle=0
|
||||
dir=cpt.%012d
|
||||
period=0
|
||||
|
||||
[stats]
|
||||
descriptions=true
|
||||
dump_cycle=0
|
||||
dump_period=0
|
||||
dump_reset=false
|
||||
ignore_events=
|
||||
mysql_db=
|
||||
mysql_host=
|
||||
mysql_password=
|
||||
mysql_user=
|
||||
project_name=test
|
||||
simulation_name=test
|
||||
simulation_sample=0
|
||||
text_compat=true
|
||||
text_file=m5stats.txt
|
||||
|
||||
[system]
|
||||
type=System
|
||||
children=cpu0 physmem workload
|
||||
mem_mode=atomic
|
||||
physmem=system.physmem
|
||||
|
||||
[system.cpu0]
|
||||
type=TimingSimpleCPU
|
||||
children=mem
|
||||
clock=1
|
||||
defer_registration=false
|
||||
function_trace=false
|
||||
function_trace_start=0
|
||||
max_insts_all_threads=0
|
||||
max_insts_any_thread=500000
|
||||
max_loads_all_threads=0
|
||||
max_loads_any_thread=0
|
||||
mem=system.cpu0.mem
|
||||
system=system
|
||||
workload=system.workload
|
||||
|
||||
[system.cpu0.mem]
|
||||
type=Bus
|
||||
bus_id=0
|
||||
|
||||
[system.physmem]
|
||||
type=PhysicalMemory
|
||||
file=
|
||||
latency=1
|
||||
|
||||
[system.workload]
|
||||
type=EioProcess
|
||||
chkpt=
|
||||
file=/z/ktlim2/clean/newmem-merge/tests/test-progs/anagram/bin/anagram-vshort.eio.gz
|
||||
output=cout
|
||||
system=system
|
||||
|
||||
[trace]
|
||||
bufsize=0
|
||||
dump_on_exit=false
|
||||
file=cout
|
||||
flags=
|
||||
ignore=
|
||||
start=0
|
||||
|
90
tests/test1/ref/alpha/timing/config.out
Normal file
90
tests/test1/ref/alpha/timing/config.out
Normal file
|
@ -0,0 +1,90 @@
|
|||
[root]
|
||||
type=Root
|
||||
clock=1000000000000
|
||||
max_tick=0
|
||||
progress_interval=0
|
||||
output_file=cout
|
||||
|
||||
[system.physmem]
|
||||
type=PhysicalMemory
|
||||
file=
|
||||
// range not specified
|
||||
latency=1
|
||||
|
||||
[system]
|
||||
type=System
|
||||
physmem=system.physmem
|
||||
mem_mode=atomic
|
||||
|
||||
[system.workload]
|
||||
type=EioProcess
|
||||
file=/z/ktlim2/clean/newmem-merge/tests/test-progs/anagram/bin/anagram-vshort.eio.gz
|
||||
chkpt=
|
||||
output=cout
|
||||
system=system
|
||||
|
||||
[system.cpu0.mem]
|
||||
type=Bus
|
||||
bus_id=0
|
||||
|
||||
[system.cpu0]
|
||||
type=TimingSimpleCPU
|
||||
max_insts_any_thread=500000
|
||||
max_insts_all_threads=0
|
||||
max_loads_any_thread=0
|
||||
max_loads_all_threads=0
|
||||
mem=system.cpu0.mem
|
||||
system=system
|
||||
workload=system.workload
|
||||
clock=1
|
||||
defer_registration=false
|
||||
// width not specified
|
||||
function_trace=false
|
||||
function_trace_start=0
|
||||
// simulate_stalls not specified
|
||||
|
||||
[trace]
|
||||
flags=
|
||||
start=0
|
||||
bufsize=0
|
||||
file=cout
|
||||
dump_on_exit=false
|
||||
ignore=
|
||||
|
||||
[stats]
|
||||
descriptions=true
|
||||
project_name=test
|
||||
simulation_name=test
|
||||
simulation_sample=0
|
||||
text_file=m5stats.txt
|
||||
text_compat=true
|
||||
mysql_db=
|
||||
mysql_user=
|
||||
mysql_password=
|
||||
mysql_host=
|
||||
events_start=-1
|
||||
dump_reset=false
|
||||
dump_cycle=0
|
||||
dump_period=0
|
||||
ignore_events=
|
||||
|
||||
[random]
|
||||
seed=1
|
||||
|
||||
[exetrace]
|
||||
speculative=true
|
||||
print_cycle=true
|
||||
print_opclass=true
|
||||
print_thread=true
|
||||
print_effaddr=true
|
||||
print_data=true
|
||||
print_iregs=false
|
||||
print_fetchseq=false
|
||||
print_cpseq=false
|
||||
pc_symbol=true
|
||||
intel_format=false
|
||||
trace_system=client
|
||||
|
||||
[debug]
|
||||
break_cycles=
|
||||
|
18
tests/test1/ref/alpha/timing/m5stats.txt
Normal file
18
tests/test1/ref/alpha/timing/m5stats.txt
Normal file
|
@ -0,0 +1,18 @@
|
|||
|
||||
---------- Begin Simulation Statistics ----------
|
||||
host_inst_rate 739858 # Simulator instruction rate (inst/s)
|
||||
host_mem_usage 147760 # Number of bytes of host memory used
|
||||
host_seconds 0.68 # Real time elapsed on the host
|
||||
host_tick_rate 1006609 # Simulator tick rate (ticks/s)
|
||||
sim_freq 1000000000000 # Frequency of simulated ticks
|
||||
sim_insts 500000 # Number of instructions simulated
|
||||
sim_seconds 0.000001 # Number of seconds simulated
|
||||
sim_ticks 680774 # Number of ticks simulated
|
||||
system.cpu0.idle_fraction 0 # Percentage of idle cycles
|
||||
system.cpu0.not_idle_fraction 1 # Percentage of non-idle cycles
|
||||
system.cpu0.numCycles 0 # number of cpu cycles simulated
|
||||
system.cpu0.num_insts 500000 # Number of instructions executed
|
||||
system.cpu0.num_refs 182203 # Number of memory references
|
||||
system.workload.PROG:num_syscalls 18 # Number of system calls
|
||||
|
||||
---------- End Simulation Statistics ----------
|
3
tests/test1/ref/alpha/timing/stderr
Normal file
3
tests/test1/ref/alpha/timing/stderr
Normal file
|
@ -0,0 +1,3 @@
|
|||
warn: Entering event queue @ 0. Starting simulation...
|
||||
|
||||
gzip: stdout: Broken pipe
|
14
tests/test1/ref/alpha/timing/stdout
Normal file
14
tests/test1/ref/alpha/timing/stdout
Normal file
|
@ -0,0 +1,14 @@
|
|||
main dictionary has 1245 entries
|
||||
49508 bytes wasted
|
||||
>M5 Simulator System
|
||||
|
||||
Copyright (c) 2001-2006
|
||||
The Regents of The University of Michigan
|
||||
All Rights Reserved
|
||||
|
||||
|
||||
M5 compiled Jul 19 2006 15:49:01
|
||||
M5 started Wed Jul 19 15:49:19 2006
|
||||
M5 executing on zamp.eecs.umich.edu
|
||||
Creating SE system
|
||||
Exiting @ tick 680774 because a thread reached the max instruction count
|
Loading…
Reference in a new issue