diff --git a/README.adoc b/README.adoc index e950232..e3feeae 100644 --- a/README.adoc +++ b/README.adoc @@ -1210,7 +1210,11 @@ You can make QEMU or gem5 <> by passing ena ./run -K .... -but it was broken in gem5 with pending patches: https://www.mail-archive.com/gem5-users@gem5.org/msg15046.html +but it was broken in gem5 with pending patches: https://www.mail-archive.com/gem5-users@gem5.org/msg15046.html It fails immediately on: + +.... +panic: KVM: Failed to enter virtualized mode (hw reason: 0x80000021) +.... KVM uses the link:https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine[KVM Linux kernel feature] of the host to run most instructions natively. @@ -2401,17 +2405,17 @@ arch=aarch64 # Generate a checkpoint after Linux boots. # The boot takes a while, be patient young Padawan. -printf 'm5 exit' >data/readfile +printf 'm5 exit' > data/readfile ./run -a "$arch" -g -E 'm5 checkpoint;m5 readfile > a.sh;sh a.sh' # Restore the checkpoint, and run the benchmark with parameter 1.000. # We skip the boot completely, saving time! -printf 'm5 resetstats;dhrystone 1000;m5 exit' >data/readfile +printf 'm5 resetstats;dhrystone 1000;m5 exit' > data/readfile ./run -a "$arch" -g -- -r 1 ./gem5-stat -a "$arch" # Now with another parameter 10.000. -printf 'm5 resetstats;dhrystone 10000;m5 exit' >data/readfile +printf 'm5 resetstats;dhrystone 10000;m5 exit' > data/readfile ./run -a "$arch" -g -- -r 1 ./gem5-stat -a "$arch" .... @@ -2550,7 +2554,39 @@ So we take a performance measurement approach instead: cat out/aarch64/gem5/bench-cache.txt .... -TODO: sort out HPI, and then paste results here, why the `--cpu-type=HPI` there always generates a `switch_cpu`, even if the original run was also on HPI? +which gives: + +[options="header",cols="3*>"] +|=== +|test size +|cache size +|cycle count + +|1000 +|1k +|52.432.956 + +|1000 +|1M +|6.328.325 + +|10000 +|1k +|141.637.834 + +|10000 +|1M +|16.969.057 + +|100000 +|1k +|1.034.500.724 + +|100000 +|1M +|121.728.035 + +|=== ===== gem5 memory latency @@ -3024,7 +3060,7 @@ Internals: * <> is a guest utility present inside the gem5 tree which we cross-compiled and installed into the guest [[gem5-restore-new-scrip]] -===== gem5 checkpoint restore and run a different script +==== gem5 checkpoint restore and run a different script You want to automate running several tests from a single pristine post-boot state. @@ -3036,11 +3072,11 @@ The problem is that after the checkpoint, the memory and disk states are fixed, There is however one loophole: <>, which reads whatever is present on the host, so we can do it like: .... -printf 'echo "setup run";m5 exit' >data/readfile +printf 'echo "setup run";m5 exit' > data/readfile ./run -a aarch64 -g -E 'm5 checkpoint;m5 readfile > a.sh;sh a.sh' -printf 'echo "first benchmark";m5 exit' >data/readfile +printf 'echo "first benchmark";m5 exit' > data/readfile ./run -a aarch64 -g -- -r 1 -printf 'echo "second benchmark";m5 exit' >data/readfile +printf 'echo "second benchmark";m5 exit' > data/readfile ./run -a aarch64 -g -- -r 1 .... diff --git a/gem5-bench-cache b/gem5-bench-cache index 7d227a3..1efc715 100755 --- a/gem5-bench-cache +++ b/gem5-bench-cache @@ -1,11 +1,15 @@ #!/usr/bin/env bash set -eu . common -while getopts a:gh OPT; do +generate_checkpoints=true +while getopts a:C OPT; do case "$OPT" in a) arch="$OPTARG" ;; + C) + generate_checkpoints=false + ;; esac done shift "$(($OPTIND - 1))" @@ -13,51 +17,80 @@ shift "$(($OPTIND - 1))" # Vars set_common_vars "$arch" true cmd="./run -a $arch -g" -cpt="-E 'm5 checkpoint;m5 readfile > a.sh;sh a.sh'" -cache_small='--caches --l2cache --l1d_size=1024 --l1i_size=1024 --l2_size=1024 --l3_size=1024' +cache_small='--caches --l2cache --l1d_size=1024 --l1i_size=1024 --l2_size=1024 --l3_size=1024 ' cache_large='--caches --l2cache --l1d_size=1024kB --l1i_size=1024kB --l2_size=1024kB --l3_size=1024kB' result_file="${gem5_out_dir}/bench-cache.txt" bench() ( cmd="$1" + printf 'cmd ' >> "$result_file" ./eeval "$cmd" "$result_file" - ./gem5-ncycles -a "$arch" >> "$result_file" + { + printf 'cycles ' + ./gem5-stat -a "$arch" + # RESTORE_INVESTIGATION + #cycles_switch="$(./gem5-stat -a "$arch" system.switch_cpus.numCycles)" + #if [ -n "$cycles_switch" ]; then + # printf "cycles_switch ${cycles_switch}\n" + #fi + } >> "$result_file" ) bench-all() ( - bench "$cmd -- -r 1" - bench "$cmd -- -r 2 $cache_small" - bench "$cmd -- -r 3 $cache_large" - bench "$cmd -- -r 4 $cache_small --cpu-type=HPI" - bench "$cmd -- -r 5 $cache_large --cpu-type=HPI" + bench "${cmd} -- -r 1 ${cache_small} --cpu-type=HPI --restore-with-cpu=HPI" + bench "${cmd} -- -r 1 ${cache_large} --cpu-type=HPI --restore-with-cpu=HPI" + # RESTORE_INVESTIGATION + # These were mostly to investigate what happens on restore: + # https://stackoverflow.com/questions/49011096/how-to-switch-cpu-models-in-gem5-after-restoring-a-checkpoint-and-then-observe-t + #bench "$cmd -- -r 1" + #bench "$cmd -- -r 1 $cache_small" + #bench "$cmd -- -r 1 $cache_large" + #bench "$cmd -- -r 2 $cache_small" + #bench "$cmd -- -r 3 $cache_large" + #bench "$cmd -- -r 4 $cache_small --cpu-type=HPI" + #bench "$cmd -- -r 5 $cache_large --cpu-type=HPI" + ## Restore from AtomicSimpleCPU to HPI. + #bench "$cmd -- -r 2 $cache_small --cpu-type=HPI --restore-with-cpu=HPI" + #bench "$cmd -- -r 3 $cache_large --cpu-type=HPI --restore-with-cpu=HPI" + #bench "$cmd -- -r 2 $cache_small --restore-with-cpu=HPI" + #bench "$cmd -- -r 3 $cache_large --restore-with-cpu=HPI" + #bench "$cmd -- -r 2 $cache_small --cpu-type=HPI" + #bench "$cmd -- -r 3 $cache_large --cpu-type=HPI" + ## Restore HPI with different cache sizes and see if it is used. + #bench "$cmd -- -r 4 $cache_large --cpu-type=HPI" + #bench "$cmd -- -r 5 $cache_small --cpu-type=HPI" + #bench "$cmd -- -r 2 $cache_large --cpu-type=HPI" + #bench "$cmd -- -r 3 $cache_small --cpu-type=HPI" ) -# Files. -rm -rf \ - "$result_file" \ - "${m5out_dir}/cpt.*" \ -; -# Create the checkpoints after the kernel boot. -printf 'm5 exit' >"${readfile_file}" -./eeval "$cmd $cpt" -./eeval "$cmd $cpt -- $cache_small" -./eeval "$cmd $cpt -- $cache_large" -./eeval "$cmd $cpt -- $cache_small --cpu-type=HPI" -./eeval "$cmd $cpt -- $cache_large --cpu-type=HPI" +if "$generate_checkpoints"; then + # Create the checkpoints after the kernel boot. + rm -rf "${m5out_dir}/cpt.*"; + printf 'm5 exit' >"${readfile_file}" + cpt_cmd="-E 'm5 checkpoint;m5 readfile > a.sh;sh a.sh'" + # 1 + ./eeval "$cmd $cpt_cmd" + # RESTORE_INVESTIGATION + ## 2 + #./eeval "$cmd $cpt_cmd -- $cache_small" + ## 3 + #./eeval "$cmd $cpt_cmd -- $cache_large" + ## 4 + #./eeval "$cmd $cpt_cmd -- $cache_small --cpu-type=HPI" + ## 5 + #./eeval "$cmd $cpt_cmd -- $cache_large --cpu-type=HPI" +fi -# dhrystone 1.000 +# Restore and run benchmarks. +rm -f "$result_file" printf '#!/bin/sh m5 resetstats -dhrystone 1000 +dhrystone XXX m5 exit ' >"${readfile_file}" -bench-all - -# dhrystone 10.000 -sed -Ei 's/^dhrystone .*/dhrystone 10000/' "${readfile_file}" -bench-all - -# dhrystone 100.000 -sed -Ei 's/^dhrystone .*/dhrystone 100000/' "${readfile_file}" -bench-all +for n in 1000 10000 100000; do + printf "n ${n}\n" >> "$result_file" + sed -Ei "s/^dhrystone .*/dhrystone ${n}/" "${readfile_file}" + bench-all +done