Merge branch 'wsos'
This commit is contained in:
@ -6,6 +6,9 @@ option(BUILD_CONVERT_TRACE "Build the trace converter tool?" OFF)
|
||||
option(BUILD_COMPUTE_HOPS "Build the compute hops tool?" OFF)
|
||||
option(BUILD_DUMP_HOPS "Build the hops dump tool?" OFF)
|
||||
|
||||
option(BUILD_FAULTSPACEPLOT "Build the faultspace plotting tool?" OFF)
|
||||
option(BUILD_DATA_AGGREGATOR "Build the data aggregation tools?" OFF)
|
||||
|
||||
### Setup search paths for headers ##
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR}/../src/core)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src/core)
|
||||
@ -33,3 +36,11 @@ endif(BUILD_COMPUTE_HOPS)
|
||||
if(BUILD_DUMP_HOPS)
|
||||
add_subdirectory(dump-hops)
|
||||
endif(BUILD_DUMP_HOPS)
|
||||
|
||||
if(BUILD_FAULTSPACEPLOT)
|
||||
add_subdirectory(analysis/faultspaceplot)
|
||||
endif(BUILD_FAULTSPACEPLOT)
|
||||
|
||||
if(BUILD_DATA_AGGREGATOR)
|
||||
add_subdirectory(analysis/data-aggregator)
|
||||
endif(BUILD_DATA_AGGREGATOR)
|
||||
|
||||
1
tools/analysis/data-aggregator/CMakeLists.txt
Normal file
1
tools/analysis/data-aggregator/CMakeLists.txt
Normal file
@ -0,0 +1 @@
|
||||
install(PROGRAMS function-occurrences.sh resulttype-occurrences.sh resulttype-occurrences_coverage.sh symbol-occurrences.sh symbol-occurrences_coverage.sh translation-unit-occurrences.sh variant-durations.sh DESTINATION bin)
|
||||
38
tools/analysis/data-aggregator/function-occurrences.sh
Executable file
38
tools/analysis/data-aggregator/function-occurrences.sh
Executable file
@ -0,0 +1,38 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = -t ]; then
|
||||
FORMAT=-t
|
||||
shift
|
||||
else
|
||||
FORMAT=-B
|
||||
fi
|
||||
|
||||
if [ ! $# -eq 3 ]; then
|
||||
echo "usage: $0 [ -t ] DATABASE VARIANT BENCHMARK" >&2
|
||||
echo " -t Display output in table format (tab-separated CSV otherwise)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
MYSQL="mysql $FORMAT $DATABASE"
|
||||
|
||||
$MYSQL << EOT
|
||||
SELECT s.name, s.address, r.resulttype, SUM(t.time2-t.time1+1) AS occurrences
|
||||
FROM variant v
|
||||
JOIN symbol s
|
||||
ON s.variant_id = v.id
|
||||
JOIN trace t
|
||||
ON t.variant_id = s.variant_id AND t.instr2_absolute BETWEEN s.address AND s.address + s.size - 1
|
||||
JOIN fspgroup g
|
||||
ON g.variant_id = t.variant_id AND g.data_address = t.data_address AND g.instr2 = t.instr2
|
||||
JOIN result_GenericExperimentMessage r
|
||||
ON r.pilot_id = g.pilot_id
|
||||
WHERE v.variant="$VARIANT"
|
||||
AND v.benchmark="$BENCHMARK"
|
||||
GROUP BY s.variant_id, s.address, r.resulttype
|
||||
ORDER BY s.address, r.resulttype
|
||||
;
|
||||
EOT
|
||||
50
tools/analysis/data-aggregator/resulttype-occurrences.sh
Executable file
50
tools/analysis/data-aggregator/resulttype-occurrences.sh
Executable file
@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = -t ]; then
|
||||
FORMAT=-t
|
||||
shift
|
||||
else
|
||||
FORMAT=-B
|
||||
fi
|
||||
|
||||
if [ $# -ne 3 -a $# -ne 1 ]; then
|
||||
echo "usage: $0 [ -t ] DATABASE [ VARIANT BENCHMARK ]" >&2
|
||||
echo " -t Display output in table format (tab-separated CSV otherwise)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
MYSQL="mysql $FORMAT $DATABASE"
|
||||
|
||||
if [ -z "$VARIANT" ]; then
|
||||
$MYSQL << EOT
|
||||
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
|
||||
SELECT v.benchmark, v.variant, r.resulttype, SUM((t.time2-t.time1+1) * t.width) AS occurrences
|
||||
FROM result_GenericExperimentMessage r
|
||||
INNER JOIN fspgroup g ON g.pilot_id=r.pilot_id
|
||||
INNER JOIN trace t ON g.instr2=t.instr2
|
||||
AND g.data_address=t.data_address
|
||||
AND g.variant_id=t.variant_id
|
||||
INNER JOIN variant v ON t.variant_id=v.id
|
||||
GROUP BY v.id, r.resulttype
|
||||
ORDER BY v.benchmark, v.variant, r.resulttype;
|
||||
EOT
|
||||
else
|
||||
$MYSQL << EOT
|
||||
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
|
||||
SELECT r.resulttype, SUM((t.time2-t.time1+1) * t.width) AS occurrences
|
||||
FROM result_GenericExperimentMessage r
|
||||
INNER JOIN fspgroup g ON g.pilot_id=r.pilot_id
|
||||
INNER JOIN trace t ON g.instr2=t.instr2
|
||||
AND g.data_address=t.data_address
|
||||
AND g.variant_id=t.variant_id
|
||||
INNER JOIN variant v ON t.variant_id=v.id
|
||||
WHERE v.variant="$VARIANT"
|
||||
AND v.benchmark="$BENCHMARK"
|
||||
GROUP BY r.resulttype
|
||||
ORDER BY r.resulttype ASC;
|
||||
EOT
|
||||
fi
|
||||
70
tools/analysis/data-aggregator/resulttype-occurrences_coverage.sh
Executable file
70
tools/analysis/data-aggregator/resulttype-occurrences_coverage.sh
Executable file
@ -0,0 +1,70 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = -t ]; then
|
||||
FORMAT=-t
|
||||
shift
|
||||
else
|
||||
FORMAT=-B
|
||||
fi
|
||||
|
||||
if [ $# -ne 3 -a $# -ne 1 ]; then
|
||||
echo "usage: $0 [ -t ] DATABASE [ VARIANT BENCHMARK ]" >&2
|
||||
echo " -t Display output in table format (tab-separated CSV otherwise)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
MYSQL="mysql $FORMAT $DATABASE"
|
||||
|
||||
if [ -z "$VARIANT" ]; then
|
||||
$MYSQL << EOT
|
||||
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
|
||||
SELECT v.benchmark, v.variant, r.resulttype,
|
||||
SUM((t.time2-t.time1+1) * t.width)
|
||||
/
|
||||
(SELECT SUM(t.time2-t.time1+1)*t.width
|
||||
FROM result_GenericExperimentMessage r
|
||||
INNER JOIN fspgroup g ON g.pilot_id=r.pilot_id
|
||||
INNER JOIN trace t ON g.instr2=t.instr2
|
||||
AND g.data_address=t.data_address
|
||||
AND g.variant_id=t.variant_id
|
||||
WHERE t.variant_id = v.id -- refers to parent query
|
||||
) AS coverage
|
||||
FROM result_GenericExperimentMessage r
|
||||
INNER JOIN fspgroup g ON g.pilot_id=r.pilot_id
|
||||
INNER JOIN trace t ON g.instr2=t.instr2
|
||||
AND g.data_address=t.data_address
|
||||
AND g.variant_id=t.variant_id
|
||||
INNER JOIN variant v ON t.variant_id=v.id
|
||||
GROUP BY v.id, r.resulttype
|
||||
ORDER BY v.benchmark, v.variant, r.resulttype;
|
||||
EOT
|
||||
else
|
||||
$MYSQL << EOT
|
||||
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
|
||||
SELECT r.resulttype,
|
||||
SUM((t.time2-t.time1+1) * t.width)
|
||||
/
|
||||
(SELECT SUM(t.time2-t.time1+1)*t.width
|
||||
FROM result_GenericExperimentMessage r
|
||||
INNER JOIN fspgroup g ON g.pilot_id=r.pilot_id
|
||||
INNER JOIN trace t ON g.instr2=t.instr2
|
||||
AND g.data_address=t.data_address
|
||||
AND g.variant_id=t.variant_id
|
||||
WHERE t.variant_id = v.id -- refers to parent query
|
||||
) AS coverage
|
||||
FROM result_GenericExperimentMessage r
|
||||
INNER JOIN fspgroup g ON g.pilot_id=r.pilot_id
|
||||
INNER JOIN trace t ON g.instr2=t.instr2
|
||||
AND g.data_address=t.data_address
|
||||
AND g.variant_id=t.variant_id
|
||||
INNER JOIN variant v ON t.variant_id=v.id
|
||||
WHERE v.variant="$VARIANT"
|
||||
AND v.benchmark="$BENCHMARK"
|
||||
GROUP BY r.resulttype
|
||||
ORDER BY r.resulttype;
|
||||
EOT
|
||||
fi
|
||||
33
tools/analysis/data-aggregator/symbol-occurrences.sh
Executable file
33
tools/analysis/data-aggregator/symbol-occurrences.sh
Executable file
@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = -t ]; then
|
||||
FORMAT=-t
|
||||
shift
|
||||
else
|
||||
FORMAT=-B
|
||||
fi
|
||||
|
||||
if [ ! $# -eq 3 ]; then
|
||||
echo "usage: $0 [ -t ] DATABASE VARIANT BENCHMARK" >&2
|
||||
echo " -t Display output in table format (tab-separated CSV otherwise)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
MYSQL="mysql $FORMAT $DATABASE"
|
||||
|
||||
$MYSQL << EOT
|
||||
SELECT v.benchmark, v.variant, s.name, s.size, r.resulttype, SUM(t.time2-t.time1+1) AS occurrences
|
||||
FROM variant v
|
||||
INNER JOIN symbol s ON v.id = s.variant_id
|
||||
INNER JOIN trace t ON t.variant_id = v.id AND t.data_address BETWEEN s.address AND s.address + s.size - 1
|
||||
INNER JOIN fspgroup g ON t.variant_id = g.variant_id AND t.data_address = g.data_address AND t.instr2 = g.instr2
|
||||
INNER JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||
WHERE v.variant="$VARIANT"
|
||||
AND v.benchmark="$BENCHMARK"
|
||||
GROUP BY v.benchmark, v.variant, s.name, r.resulttype
|
||||
ORDER BY v.benchmark, v.variant, s.name, r.resulttype;
|
||||
EOT
|
||||
44
tools/analysis/data-aggregator/symbol-occurrences_coverage.sh
Executable file
44
tools/analysis/data-aggregator/symbol-occurrences_coverage.sh
Executable file
@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = -t ]; then
|
||||
FORMAT=-t
|
||||
shift
|
||||
else
|
||||
FORMAT=-B
|
||||
fi
|
||||
|
||||
if [ ! $# -eq 3 ]; then
|
||||
echo "usage: $0 [ -t ] DATABASE VARIANT BENCHMARK" >&2
|
||||
echo " -t Display output in table format (tab-separated CSV otherwise)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
MYSQL="mysql $FORMAT $DATABASE"
|
||||
|
||||
$MYSQL << EOT
|
||||
SELECT v.benchmark, v.variant, s.name, s.size, r.resulttype,
|
||||
SUM(t.time2-t.time1+1)
|
||||
/
|
||||
(SELECT SUM(t.time2-t.time1+1)
|
||||
FROM variant v
|
||||
INNER JOIN symbol s ON v.id = s.variant_id
|
||||
INNER JOIN trace t ON t.variant_id = v.id AND t.data_address BETWEEN s.address AND s.address + s.size - 1
|
||||
INNER JOIN fspgroup g ON t.variant_id = g.variant_id AND t.data_address = g.data_address AND t.instr2 = g.instr2
|
||||
INNER JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||
WHERE v.variant="$VARIANT"
|
||||
AND v.benchmark="$BENCHMARK"
|
||||
) AS coverage
|
||||
FROM variant v
|
||||
INNER JOIN symbol s ON v.id = s.variant_id
|
||||
INNER JOIN trace t ON t.variant_id = v.id AND t.data_address BETWEEN s.address AND s.address + s.size - 1
|
||||
INNER JOIN fspgroup g ON t.variant_id = g.variant_id AND t.data_address = g.data_address AND t.instr2 = g.instr2
|
||||
INNER JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||
WHERE v.variant="$VARIANT"
|
||||
AND v.benchmark="$BENCHMARK"
|
||||
GROUP BY v.benchmark, v.variant, s.name, r.resulttype
|
||||
ORDER BY v.benchmark, v.variant, s.name, r.resulttype;
|
||||
EOT
|
||||
40
tools/analysis/data-aggregator/translation-unit-occurrences.sh
Executable file
40
tools/analysis/data-aggregator/translation-unit-occurrences.sh
Executable file
@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = -t ]; then
|
||||
FORMAT=-t
|
||||
shift
|
||||
else
|
||||
FORMAT=-B
|
||||
fi
|
||||
|
||||
if [ ! $# -eq 3 ]; then
|
||||
echo "usage: $0 [ -t ] DATABASE VARIANT BENCHMARK" >&2
|
||||
echo " -t Display output in table format (tab-separated CSV otherwise)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
MYSQL="mysql $FORMAT $DATABASE"
|
||||
|
||||
$MYSQL << EOT
|
||||
SELECT v.benchmark, v.variant, f.path, r.resulttype, SUM(t.time2-t.time1+1) AS occurrences
|
||||
FROM variant v
|
||||
JOIN dbg_filename f
|
||||
ON f.variant_id = v.id
|
||||
JOIN dbg_mapping m
|
||||
ON f.variant_id = m.variant_id AND f.file_id = m.file_id
|
||||
JOIN trace t
|
||||
ON t.variant_id = m.variant_id AND t.instr2_absolute BETWEEN m.instr_absolute AND m.instr_absolute + m.line_range_size - 1
|
||||
JOIN fspgroup g
|
||||
ON g.variant_id = t.variant_id AND g.data_address = t.data_address AND g.instr2 = t.instr2
|
||||
JOIN result_GenericExperimentMessage r
|
||||
ON r.pilot_id = g.pilot_id
|
||||
WHERE v.variant="$VARIANT"
|
||||
AND v.benchmark="$BENCHMARK"
|
||||
GROUP BY v.id, f.file_id, r.resulttype
|
||||
ORDER BY v.benchmark, v.variant, f.path, r.resulttype
|
||||
;
|
||||
EOT
|
||||
44
tools/analysis/data-aggregator/variant-durations.sh
Executable file
44
tools/analysis/data-aggregator/variant-durations.sh
Executable file
@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = -t ]; then
|
||||
FORMAT=-t
|
||||
shift
|
||||
else
|
||||
FORMAT=-B
|
||||
fi
|
||||
|
||||
if [ $# -ne 3 -a $# -ne 1 ]; then
|
||||
echo "usage: $0 [ -t ] DATABASE [ VARIANT BENCHMARK ]" >&2
|
||||
echo " -t Display output in table format (tab-separated CSV otherwise)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
MYSQL="mysql $FORMAT $DATABASE"
|
||||
|
||||
if [ -z "$VARIANT" ]; then
|
||||
$MYSQL << EOT
|
||||
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
|
||||
SELECT v.benchmark, v.variant,
|
||||
MAX(t.time2)-MIN(t.time1)+1 AS duration,
|
||||
MAX(t.instr2)-MIN(t.instr1)+1 AS dyn_instr
|
||||
FROM trace t
|
||||
JOIN variant v ON t.variant_id = v.id
|
||||
GROUP BY v.id
|
||||
ORDER BY v.benchmark, v.variant;
|
||||
EOT
|
||||
else
|
||||
$MYSQL << EOT
|
||||
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
|
||||
SELECT
|
||||
MAX(t.time2)-MIN(t.time1)+1 AS duration,
|
||||
MAX(t.instr2)-MIN(t.instr1)+1 AS dyn_instr
|
||||
FROM trace t
|
||||
JOIN variant v ON t.variant_id = v.id
|
||||
WHERE v.variant = "$VARIANT"
|
||||
AND v.benchmark = "$BENCHMARK"
|
||||
EOT
|
||||
fi
|
||||
1
tools/analysis/faultspaceplot/CMakeLists.txt
Normal file
1
tools/analysis/faultspaceplot/CMakeLists.txt
Normal file
@ -0,0 +1 @@
|
||||
install(PROGRAMS faultspaceplot.sh fsp.compact-horizontal.sh fsp.compact.sh fsp.compact-vertical.sh fsp.plot.py DESTINATION bin)
|
||||
101
tools/analysis/faultspaceplot/faultspaceplot.sh
Executable file
101
tools/analysis/faultspaceplot/faultspaceplot.sh
Executable file
@ -0,0 +1,101 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = -k ]; then
|
||||
KEEPCSV=yes
|
||||
shift
|
||||
else
|
||||
KEEPCSV=no
|
||||
fi
|
||||
|
||||
if [ ! $# -eq 3 ]; then
|
||||
echo "usage: $0 [ -k ] DATABASE VARIANT BENCHMARK" >&2
|
||||
echo " -k Keep compacted plot (and symbols) CSV" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
MYSQL="mysql -B --quick $DATABASE"
|
||||
|
||||
MYDIR=$(dirname $0)
|
||||
|
||||
function table_exists()
|
||||
{
|
||||
N=$(echo "SHOW TABLES LIKE '$1'" | $MYSQL $DATABASE | wc -l)
|
||||
[ $N -gt 0 ]
|
||||
return
|
||||
}
|
||||
|
||||
# get data
|
||||
RAWCSV=$(mktemp)
|
||||
echo "getting faultspace data.."
|
||||
$MYSQL <<EOT > $RAWCSV
|
||||
SELECT t.time1 - (SELECT MIN(t2.time1) FROM trace t2 WHERE t.variant_id = t2.variant_id) AS time1,
|
||||
t.time2 - (SELECT MIN(t2.time1) FROM trace t2 WHERE t.variant_id = t2.variant_id) AS time2,
|
||||
t.data_address, r.bitoffset, r.injection_width,
|
||||
CASE
|
||||
WHEN r.resulttype = 'OK_MARKER' THEN '#FFFFFF'
|
||||
WHEN r.resulttype = 'FAIL_MARKER' THEN '#EE0000'
|
||||
WHEN r.resulttype = 'DETECTED_MARKER' THEN '#00FF00'
|
||||
WHEN r.resulttype = 'GROUP0_MARKER' THEN '#EAEAEA'
|
||||
WHEN r.resulttype = 'GROUP1_MARKER' THEN '#EBEBEB'
|
||||
WHEN r.resulttype = 'GROUP2_MARKER' THEN '#ECECEC'
|
||||
WHEN r.resulttype = 'GROUP3_MARKER' THEN '#EDEDED'
|
||||
WHEN r.resulttype = 'TIMEOUT' THEN '#CCCC00'
|
||||
WHEN r.resulttype = 'TRAP' THEN '#00CCCC'
|
||||
WHEN r.resulttype = 'WRITE_TEXTSEGMENT' THEN '#0000AA'
|
||||
WHEN r.resulttype = 'WRITE_OUTERSPACE' THEN '#0000BB'
|
||||
WHEN r.resulttype = 'SDC' THEN '#FF0000'
|
||||
WHEN r.resulttype = 'UNKNOWN' THEN '#000000'
|
||||
END AS color
|
||||
FROM trace t
|
||||
JOIN fspgroup g ON t.variant_id = g.variant_id AND t.data_address = g.data_address AND t.instr2 = g.instr2
|
||||
JOIN variant v ON v.id = t.variant_id
|
||||
JOIN result_GenericExperimentMessage r ON r.pilot_id=g.pilot_id
|
||||
WHERE
|
||||
v.variant = '$VARIANT' AND v.benchmark = '$BENCHMARK'
|
||||
AND r.resulttype != 'OK_MARKER'
|
||||
AND t.accesstype = 'R';
|
||||
EOT
|
||||
|
||||
# compact data
|
||||
echo "compacting data.."
|
||||
COMPACTCSV=$(mktemp)
|
||||
"$MYDIR"/fsp.compact.sh $RAWCSV $COMPACTCSV
|
||||
rm $RAWCSV
|
||||
|
||||
# fetch symbols if available
|
||||
SYMBOLCSV=
|
||||
if table_exists symbol; then
|
||||
SYMBOLCSV=$(mktemp)
|
||||
echo "getting symbol information ..."
|
||||
$MYSQL <<EOT > $SYMBOLCSV
|
||||
SELECT s.address, s.size, s.name
|
||||
FROM variant v
|
||||
JOIN symbol s ON s.variant_id = v.id
|
||||
WHERE v.variant = '$VARIANT' AND v.benchmark = '$BENCHMARK'
|
||||
ORDER BY s.address
|
||||
EOT
|
||||
fi
|
||||
|
||||
# plot data
|
||||
echo "plotting.."
|
||||
if [ $KEEPCSV = yes ]; then
|
||||
KEPT="$VARIANT"_"$BENCHMARK"-plot.csv
|
||||
mv "$COMPACTCSV" "$KEPT"
|
||||
COMPACTCSV=$KEPT
|
||||
fi
|
||||
if [ ! -z "$SYMBOLCSV" -a $(wc -l < $SYMBOLCSV) -gt 1 ]; then
|
||||
if [ $KEEPCSV = yes ]; then
|
||||
KEPT="$VARIANT"_"$BENCHMARK"-symbols.csv
|
||||
mv "$SYMBOLCSV" "$KEPT"
|
||||
SYMBOLCSV=$KEPT
|
||||
fi
|
||||
"$MYDIR"/fsp.plot.py "$COMPACTCSV" "$SYMBOLCSV"
|
||||
[ $KEEPCSV = no ] && rm "$SYMBOLCSV"
|
||||
else
|
||||
"$MYDIR"/fsp.plot.py "$COMPACTCSV"
|
||||
fi
|
||||
[ $KEEPCSV = no ] && rm "$COMPACTCSV"
|
||||
52
tools/analysis/faultspaceplot/fsp.compact-horizontal.sh
Executable file
52
tools/analysis/faultspaceplot/fsp.compact-horizontal.sh
Executable file
@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
TMP=$(mktemp)
|
||||
|
||||
read HEADER
|
||||
echo "$HEADER"
|
||||
|
||||
BASE=''
|
||||
LAST=''
|
||||
sort -snk 1 | sort -snk 4 | sort -snk 3 > $TMP
|
||||
|
||||
while read CUR
|
||||
do
|
||||
a=($CUR)
|
||||
C_I1=${a[0]}
|
||||
C_I2=${a[1]}
|
||||
C_ADDR=${a[2]}
|
||||
C_BIT=${a[3]}
|
||||
C_BW=${a[4]}
|
||||
C_COL=${a[5]}
|
||||
|
||||
if [ -z "$BASE" ]
|
||||
then
|
||||
BASE=$CUR
|
||||
LAST=$CUR
|
||||
elif (($C_I1 != $L_I2 + 1 || $L_ADDR != $C_ADDR || $L_BIT != $C_BIT || $L_BW != $C_BW)) || \
|
||||
[ "$C_COL" != "$L_COL" ]
|
||||
then
|
||||
a=($BASE)
|
||||
B_I1=${a[0]}
|
||||
|
||||
echo -e "$B_I1\t$L_I2\t$L_ADDR\t$L_BIT\t$L_BW\t$L_COL"
|
||||
|
||||
BASE=$CUR
|
||||
fi
|
||||
|
||||
LAST="$CUR"
|
||||
L_I1=$C_I1
|
||||
L_I2=$C_I2
|
||||
L_ADDR=$C_ADDR
|
||||
L_BIT=$C_BIT
|
||||
L_BW=$C_BW
|
||||
L_COL=$C_COL
|
||||
done < $TMP
|
||||
|
||||
a=($BASE)
|
||||
B_I1=${a[0]}
|
||||
|
||||
echo -e "$B_I1\t$L_I2\t$L_ADDR\t$L_BIT\t$L_BW\t$L_COL"
|
||||
|
||||
rm $TMP
|
||||
63
tools/analysis/faultspaceplot/fsp.compact-vertical.sh
Executable file
63
tools/analysis/faultspaceplot/fsp.compact-vertical.sh
Executable file
@ -0,0 +1,63 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
TMP=$(mktemp)
|
||||
|
||||
read HEADER
|
||||
echo "$HEADER"
|
||||
|
||||
BASE=''
|
||||
LAST=''
|
||||
sort -snk 4 | sort -snk 3 | sort -snk 1 > $TMP
|
||||
|
||||
while read CUR
|
||||
do
|
||||
a=($CUR)
|
||||
C_I1=${a[0]}
|
||||
C_I2=${a[1]}
|
||||
C_ADDR=${a[2]}
|
||||
C_BIT=${a[3]}
|
||||
C_BW=${a[4]}
|
||||
C_COL=${a[5]}
|
||||
C_N=$(($C_ADDR*8 + $C_BIT))
|
||||
|
||||
if [ -z "$BASE" ]
|
||||
then
|
||||
BASE=$CUR
|
||||
LAST=$CUR
|
||||
elif (($C_I1 != $L_I1 || $C_I2 != $L_I2 || \
|
||||
$L_N + $L_BW != $C_N)) || \
|
||||
[ "$C_COL" != "$L_COL" ]
|
||||
then
|
||||
a=($BASE)
|
||||
B_ADDR=${a[2]}
|
||||
B_BIT=${a[3]}
|
||||
B_N=$(($B_ADDR*8 + $B_BIT))
|
||||
|
||||
BW=$(($L_N + $L_BW - $B_N))
|
||||
|
||||
echo -e "$L_I1\t$L_I2\t$B_ADDR\t$B_BIT\t$BW\t$L_COL"
|
||||
|
||||
BASE=$CUR
|
||||
fi
|
||||
|
||||
LAST="$CUR"
|
||||
L_I1=$C_I1
|
||||
L_I2=$C_I2
|
||||
L_ADDR=$C_ADDR
|
||||
L_BIT=$C_BIT
|
||||
L_BW=$C_BW
|
||||
L_COL=$C_COL
|
||||
L_N=$C_N
|
||||
done < $TMP
|
||||
|
||||
a=($BASE)
|
||||
B_ADDR=${a[2]}
|
||||
B_BIT=${a[3]}
|
||||
B_N=$(($B_ADDR*8 + $B_BIT))
|
||||
|
||||
BW=$(($L_N + $L_BW - $B_N))
|
||||
|
||||
echo -e "$L_I1\t$L_I2\t$B_ADDR\t$B_BIT\t$BW\t$L_COL"
|
||||
|
||||
rm $TMP
|
||||
43
tools/analysis/faultspaceplot/fsp.compact.sh
Executable file
43
tools/analysis/faultspaceplot/fsp.compact.sh
Executable file
@ -0,0 +1,43 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
FIRST=vertical
|
||||
|
||||
[ $# -lt 2 -o $# -gt 3 ] && echo "usage: $0 input.csv output.csv [vertical|horizontal]" >&2 && exit 1
|
||||
|
||||
if [ -z $3 ]; then
|
||||
FIRST=vertical
|
||||
else
|
||||
FIRST=$3
|
||||
fi
|
||||
|
||||
TMP1=$(mktemp)
|
||||
TMP2=$(mktemp)
|
||||
|
||||
cp $1 $TMP1
|
||||
COUNT=$(wc -l <$TMP1)
|
||||
|
||||
NEXT=$FIRST
|
||||
|
||||
while true
|
||||
do
|
||||
echo "at $COUNT, $NEXT ..."
|
||||
fsp.compact-$NEXT.sh < $TMP1 > $TMP2
|
||||
|
||||
PREVCOUNT=$COUNT
|
||||
COUNT=$(wc -l <$TMP2)
|
||||
|
||||
if (($COUNT >= $PREVCOUNT))
|
||||
then
|
||||
echo "no improvement (now $COUNT), stop."
|
||||
cp $TMP1 $2
|
||||
break
|
||||
fi
|
||||
|
||||
mv $TMP2 $TMP1
|
||||
if [ $NEXT = vertical ]; then
|
||||
NEXT=horizontal
|
||||
else
|
||||
NEXT=vertical
|
||||
fi
|
||||
done
|
||||
167
tools/analysis/faultspaceplot/fsp.plot.py
Executable file
167
tools/analysis/faultspaceplot/fsp.plot.py
Executable file
@ -0,0 +1,167 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Import modules
|
||||
import csv, sys
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
import matplotlib.patches as mpatches
|
||||
import matplotlib.pylab as pylab
|
||||
|
||||
ENTRY_COUNT_PER_LINE = 6
|
||||
RESULT_RECT_HEIGHT = 1.0/8
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Basic drawing class
|
||||
class Rectangle:
|
||||
def __init__(self, x, y, w, h, color):
|
||||
# w
|
||||
self.xpos = x # |-------------------|
|
||||
self.ypos = y # | | h
|
||||
self.width = w # | |
|
||||
self.height = h # (x,y)---------------|
|
||||
self.color = color # fill color
|
||||
self.alpha = None # transparency level [0,1]
|
||||
def draw(self):
|
||||
""" Draw the rectangle. """
|
||||
if self.color == (1,1,1):
|
||||
return
|
||||
tmp = self.xpos, self.ypos,
|
||||
p = mpatches.Rectangle(tmp, self.width, self.height, color=self.color, \
|
||||
alpha=self.alpha)
|
||||
plt.gca().add_patch(p)
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Check provided arguments:
|
||||
if len(sys.argv) <= 1:
|
||||
print "ERROR: Not enough arguments provided! See -h for more infos."
|
||||
exit(1)
|
||||
if sys.argv[1] == '-h':
|
||||
print "Displays experiment results for the weather-monitor-experiment."
|
||||
print " CALL-SYNTAX: fsp.plot.py DATA_FILE [USER_TAG_FILE]"
|
||||
print "DATA_FILE is a CSV-file, storing the tab-separated values"
|
||||
print "retrieved by the experiment run. USER_TAG_FILE is an optional"
|
||||
print "CSV-file which can be used to add user-specific marks to the"
|
||||
print "plot." # TODO: be more precise here
|
||||
exit(0)
|
||||
|
||||
print "Opening and processing \"" + sys.argv[1] + "\"..."
|
||||
file = open(sys.argv[1], "r")
|
||||
dialect = csv.Sniffer().sniff(file.read(1024))
|
||||
file.seek(0)
|
||||
reader = csv.reader(file, dialect)
|
||||
reader.next() # Move down a line to skip the header
|
||||
|
||||
if len(sys.argv) >= 3:
|
||||
print "Opening and processing \"" + sys.argv[2] + "\"..."
|
||||
symbolfile = open(sys.argv[2], "r")
|
||||
dialect = csv.Sniffer().sniff(symbolfile.read(1024))
|
||||
symbolfile.seek(0)
|
||||
symbolreader = csv.reader(symbolfile, dialect)
|
||||
symbolreader.next() # Move down a line to skip the header
|
||||
have_symbols = True
|
||||
else:
|
||||
have_symbols = False
|
||||
|
||||
fig = plt.figure()
|
||||
|
||||
xmin = 99999999
|
||||
xmax = 0
|
||||
ymin = 99999999
|
||||
ymax = 0
|
||||
|
||||
line_counter = 1
|
||||
for row in reader:
|
||||
line_counter += 1
|
||||
# Check if there are at least ENTRY_COUNT_PER_LINE entries per line:
|
||||
if len(row) != ENTRY_COUNT_PER_LINE:
|
||||
print "ERROR: Line " + str(line_counter) + " is invalid (" +\
|
||||
str(ENTRY_COUNT_PER_LINE) + " entries expected)"
|
||||
sys.exit(1)
|
||||
|
||||
# Some constants to access the row-entries much easier:
|
||||
IDX_INSTR1 = 0; IDX_INSTR2 = 1; IDX_DATA_ADDRESS = 2;
|
||||
IDX_BITNR = 3; IDX_BITWIDTH = 4; IDX_COLOR = 5;
|
||||
|
||||
# Update xmin/xmax/ymin/ymax
|
||||
x1 = int(row[IDX_INSTR1])
|
||||
x2 = int(row[IDX_INSTR2]) + 1 # inclusive
|
||||
width = x2 - x1
|
||||
if xmin > x1:
|
||||
xmin = x1
|
||||
if xmax < x2:
|
||||
xmax = x2
|
||||
|
||||
y1 = float(row[IDX_DATA_ADDRESS]) + float(row[IDX_BITNR]) / 8.0
|
||||
height = float(row[IDX_BITWIDTH]) / 8.0
|
||||
y2 = y1 + height
|
||||
|
||||
if ymin > y1:
|
||||
ymin = y1
|
||||
if ymax < y2:
|
||||
ymax = y2
|
||||
|
||||
Rectangle(x1, y1, width, height, row[IDX_COLOR]).draw()
|
||||
if line_counter == 50000: # debug stuff
|
||||
pass
|
||||
#break
|
||||
|
||||
# round down to nearest 1000
|
||||
#ymin = int(ymin / 1000) * 1000
|
||||
|
||||
file.close()
|
||||
plt.xlim(xmin, xmax)
|
||||
plt.ylim(ymin, ymax)
|
||||
|
||||
plt.ylabel('Data Memory (RAM)')
|
||||
plt.xlabel('Time (Cycles)')
|
||||
|
||||
# show symbols
|
||||
if have_symbols:
|
||||
# Adding 2nd y-axis for object names
|
||||
ax1 = fig.add_subplot(111)
|
||||
ax2 = ax1.twinx()
|
||||
ax2.set_ylabel('Symbols')
|
||||
|
||||
# necessary for proper symbol placement
|
||||
plt.ylim(ymin, ymax)
|
||||
|
||||
ticks = []
|
||||
symbols = []
|
||||
|
||||
IDX_SYMBOL_ADDRESS = 0; IDX_SYMBOL_SIZE = 1; IDX_SYMBOL_NAME = 2;
|
||||
|
||||
for row in symbolreader:
|
||||
# TODO: somehow plot size as well
|
||||
address = int(row[IDX_SYMBOL_ADDRESS])
|
||||
size = int(row[IDX_SYMBOL_SIZE])
|
||||
if (address >= ymin) and (address <= ymax):
|
||||
ticks.append(address)
|
||||
symbols.append(row[IDX_SYMBOL_NAME])
|
||||
#print "symbol: " + str(address) + " " + str(size) + " " + row[IDX_SYMBOL_NAME]
|
||||
elif (address < ymin) and (address + size >= ymin):
|
||||
ticks.append(ymin)
|
||||
symbols.append("(" + row[IDX_SYMBOL_NAME] + ")")
|
||||
#print "partial symbol: " + str(address) + " " + str(size) + " " + row[IDX_SYMBOL_NAME]
|
||||
else:
|
||||
#print "skipped symbol: " + str(address) + " " + str(size) + " " + row[IDX_SYMBOL_NAME]
|
||||
pass
|
||||
|
||||
# list of interesting addresses
|
||||
ax2.yaxis.set_ticks(ticks)
|
||||
ax2.yaxis.grid(b=True, color='gray')
|
||||
|
||||
# create minor ticks centered between major tick marks
|
||||
centered_ticks = []
|
||||
major_locator = ax2.yaxis.get_major_locator()
|
||||
major_locs = major_locator()
|
||||
for i in range(1,len(major_locs)):
|
||||
y_last,y = major_locs[i-1],major_locs[i]
|
||||
centered_ticks.append(0.5*(y+y_last))
|
||||
ax2.yaxis.set_ticks(centered_ticks, minor=True)
|
||||
|
||||
# list of corresponding symbol names
|
||||
ax2.set_yticklabels(symbols, minor=False, rotation=0, rotation_mode='anchor')
|
||||
|
||||
plt.show()
|
||||
#pylab.savefig('baseline.pdf', bbox_inches='tight')
|
||||
@ -42,3 +42,4 @@ if (BUILD_LLVM_DISASSEMBLER)
|
||||
endif (BUILD_LLVM_DISASSEMBLER)
|
||||
|
||||
install(TARGETS import-trace RUNTIME DESTINATION bin)
|
||||
install(PROGRAMS import-symbols.sh DESTINATION bin)
|
||||
|
||||
86
tools/import-trace/import-symbols.sh
Executable file
86
tools/import-trace/import-symbols.sh
Executable file
@ -0,0 +1,86 @@
|
||||
#!/bin/bash
|
||||
# TODO: make this part of import-trace
|
||||
set -e
|
||||
|
||||
# handle command line arguments
|
||||
if [ ! $# -eq 4 ]; then
|
||||
echo "usage: $0 DATABASE VARIANT BENCHMARK ELF" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE=$1
|
||||
VARIANT=$2
|
||||
BENCHMARK=$3
|
||||
ELF=$4
|
||||
TABLE=symbol
|
||||
MYSQL="mysql -B --quick $DATABASE"
|
||||
|
||||
|
||||
# check if ELF exists
|
||||
if [ ! -e $ELF ]; then
|
||||
echo "$ELF not found" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "importing $VARIANT/$BENCHMARK symbols from $ELF ..."
|
||||
|
||||
|
||||
# get fail*'s variant_id
|
||||
ID=$(echo "SELECT id FROM variant WHERE variant='$VARIANT' AND benchmark='$BENCHMARK'" | $MYSQL -N)
|
||||
if [ -z $ID ]; then
|
||||
echo "no such variant/benchmark!" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# generate huge SQL statement and execute
|
||||
$MYSQL <<EOT
|
||||
CREATE TABLE IF NOT EXISTS $TABLE (
|
||||
variant_id INT NOT NULL,
|
||||
address INT UNSIGNED NOT NULL,
|
||||
size INT UNSIGNED NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (variant_id, address)
|
||||
) ENGINE=MyISAM;
|
||||
EOT
|
||||
(
|
||||
# clean symbol table
|
||||
echo "DELETE FROM $TABLE WHERE variant_id = $ID;"
|
||||
|
||||
LAST_ADDR=
|
||||
LAST_SYMBOL=
|
||||
|
||||
# The "dummy" entry at the end makes sure the last real symbol from the
|
||||
# nm output makes it into the database.
|
||||
(nm -n -S -C $ELF; echo ffffffff a dummy) \
|
||||
| egrep '^[0-9a-fA-F]' | while read line
|
||||
do
|
||||
ADDR=$(echo "$line"|awk '{print $1}')
|
||||
SIZE=$(echo "$line"|awk '{print $2}')
|
||||
if echo $SIZE | egrep -q '^[0-9a-fA-F]{8}'; then
|
||||
SYMBOL=$(echo "$line"|awk '{for (i=1; i<=NF-3; i++) $i = $(i+3); NF-=3; print}')
|
||||
else
|
||||
SIZE=unknown
|
||||
SYMBOL=$(echo "$line"|awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}')
|
||||
fi
|
||||
|
||||
if [ $LAST_ADDR ]; then
|
||||
# only create INSERT-line, if $ADDR is new to us
|
||||
if [ ! $ADDR = $LAST_ADDR ]; then
|
||||
echo "INSERT INTO $TABLE (variant_id, address, size, name) VALUES "
|
||||
echo "($ID, cast(0x$LAST_ADDR AS UNSIGNED), CAST(0x$ADDR AS UNSIGNED)-CAST(0x$LAST_ADDR AS UNSIGNED), '$LAST_SYMBOL');"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $SIZE != unknown ]; then
|
||||
echo "INSERT INTO $TABLE (variant_id, address, size, name) VALUES "
|
||||
echo "($ID, cast(0x$ADDR AS UNSIGNED), CAST(0x$SIZE AS UNSIGNED), '$SYMBOL');"
|
||||
LAST_ADDR=
|
||||
LAST_SYMBOL=
|
||||
else
|
||||
LAST_ADDR=$ADDR
|
||||
LAST_SYMBOL=$SYMBOL
|
||||
fi
|
||||
done
|
||||
) | $MYSQL
|
||||
|
||||
echo "ANALYZE TABLE $TABLE;" | $MYSQL
|
||||
Reference in New Issue
Block a user