summaryrefslogtreecommitdiffstats
path: root/all_pairs
diff options
context:
space:
mode:
authorJoshua Bakita <jbakita@cs.unc.edu>2020-10-22 00:08:12 -0400
committerJoshua Bakita <jbakita@cs.unc.edu>2020-10-22 00:08:12 -0400
commit3b0aa125061b362b23ecf66afe8319e3a268c874 (patch)
tree9323b85d5a3a0d14e33a28caa9ffc3b8ce7225be /all_pairs
parentedb491490ccd0cae4bd28ca9c9a7e095a47c749b (diff)
Add pair benchmarking and isolation specification into run_bench.sh
This allows `run_bench.sh` to replace all previous general paired benchmarking scripts. See `run_everything.sh` for an example of how to use the new script. This also fixes two critical bugs present in the old scripts: 1. The cpus_list was incorrectly set for resctrl when running synchronous pair timing with L2+L3 isolation (i). Each write to that file replaces the previous contents, and it was previously written once for each core. This prevented the entire 1st core from using any L3 cache. 2. The competing task list was indexed improperly in the asynchronous pair timing script. This caused the competing task to always be identical to the task being profiled. These issues combine to imply that in the rejected RTSS'20 paper: - All Level-C SMT timing data is suspect - Level-A and -B SMT timing data with L2+L3 isolation (i) is wildly optimistic
Diffstat (limited to 'all_pairs')
-rwxr-xr-xall_pairs/run_all_pairs.sh168
-rwxr-xr-xall_pairs/run_all_pairs_L3_ONLY.sh170
-rw-r--r--all_pairs/tacleNames.txt18
3 files changed, 11 insertions, 345 deletions
diff --git a/all_pairs/run_all_pairs.sh b/all_pairs/run_all_pairs.sh
deleted file mode 100755
index 2260216..0000000
--- a/all_pairs/run_all_pairs.sh
+++ /dev/null
@@ -1,168 +0,0 @@
1#!/bin/bash
2
3firstCore=$1
4secondCore=$2
5maxJobs=$3
6userRunID=$4
7tacleNames=tacleNames.txt
8
9if [ $# -lt 4 ]; then
10 echo "Usage $0 <first core ID> <second core ID> <number of iterations> <run ID> [TACLe names file] [--contend]"
11 exit
12fi
13
14if [ $# -gt 4 ]; then
15 echo "Using alternate list of TACLe benchmarks from $5"
16 tacleNames=$5
17fi
18
19if [ "$EUID" -ne 0 ]
20then
21 echo "You need to be root to enable interrupt isolation and real-time execution!"
22 exit
23fi
24
25echo "Making sure that binaries are up to date..."
26while read i; do
27 make bin/$i
28done < $tacleNames
29echo "Done. Disabling real-time throttling..."
30
31# Turn off rt throttling
32echo -1 > /proc/sys/kernel/sched_rt_runtime_us
33echo "Done. Redirecting all interrupts to core 0..."
34
35# Redirect all interrupts to core 0
36i=0
37for IRQ in /proc/irq/*
38do
39 # Skip default_smp_affinity
40 if [ -d $IRQ ]; then
41 irqList[$i]=$(cat $IRQ/smp_affinity_list)
42 echo 0 2> /dev/null > $IRQ/smp_affinity_list
43 fi
44 i=$(( $i + 1 ))
45done
46
47# Read the names of each benchmark
48j=0
49while read i; do
50 tacleProg[$j]=$i
51 j=$(( $j + 1 ))
52done < $tacleNames
53
54echo "Done. Checking for wbinvd module..."
55if [[ ! -f "/proc/wbinvd" ]]; then
56 echo "ERROR: wbinvd module not loaded. Exiting..."
57 exit
58fi
59
60echo "Done. Setting cores $firstCore and $secondCore to 'performance'..."
61echo "performance" > /sys/devices/system/cpu/cpu$firstCore/cpufreq/scaling_governor
62echo "performance" > /sys/devices/system/cpu/cpu$secondCore/cpufreq/scaling_governor
63
64# Enable L3 isolation
65echo "Done. Enabling L3 isolation..."
66mount -t resctrl resctrl /sys/fs/resctrl
67mkdir -p /sys/fs/resctrl/benchmarks
68echo $firstCore > /sys/fs/resctrl/benchmarks/cpus_list
69echo $secondCore > /sys/fs/resctrl/benchmarks/cpus_list
70# Reset global bandwith control and remove L3 from global
71echo "L3:0=ffff;1=ffff;2=ffff;3=0000" > /sys/fs/resctrl/schemata
72echo "MB:0=2048;1=2048;2=2048;3=2048" > /sys/fs/resctrl/schemata
73# Alloc L3 to benchmark
74echo "L3:0=0000;1=0000;2=0000;3=ffff" > /sys/fs/resctrl/benchmarks/schemata
75echo "MB:0=2048;1=2048;2=2048;3=2048" > /sys/fs/resctrl/benchmarks/schemata
76echo "Done. Verifying configuration with user..."
77
78# Generate file name string
79# We append to this as we parse the environment settings
80runID=$(date +"%b%d-%H")
81
82# Confirm configuration with user
83echo "=== Global Config ==="
84cat /sys/fs/resctrl/schemata
85echo "=== Core $firstCore and $secondCore Config ==="
86cat /sys/fs/resctrl/benchmarks/schemata
87if [[ $6 == "--contend" ]]; then
88 if [[ ! -f "/playpen/mc2/imx6q-thrasher/thrasher" ]]; then
89 echo "ERROR: thrasher binary not fonud. Exiting..."
90 exit
91 fi
92 echo "Will run 6 contending tasks"
93 runID=$runID-c
94else
95 runID=$runID-xc
96fi
97if uname -a | grep -q "mc2"; then
98 echo "MC^2 Autodetected. Cache coloring will be enabled."
99 runID=$runID-i
100else
101 echo "MC^2 not detected. Cache coloring will be DISABLED."
102 runID=$runID-xi
103fi
104if pwd | grep -qi dis; then
105 echo "Autodetected DIS. Will use script-level looping."
106fi
107echo "Results will be saved as $runID-$userRunID-A.txt and $runID-$userRunID-B.txt"
108echo "Press enter to confirm environment, Ctrl-C to exit..."
109read
110
111# Start contending tasks
112if [[ $6 == "--contend" ]]; then
113 echo "Done. Starting 6 contending tasks..."
114 # Run two contending tasks on each other CCX
115 taskset -c 1 /playpen/mc2/imx6q-thrasher/thrasher &
116 taskset -c 2 /playpen/mc2/imx6q-thrasher/thrasher &
117 taskset -c 5 /playpen/mc2/imx6q-thrasher/thrasher &
118 taskset -c 6 /playpen/mc2/imx6q-thrasher/thrasher &
119 taskset -c 9 /playpen/mc2/imx6q-thrasher/thrasher &
120 taskset -c 10 /playpen/mc2/imx6q-thrasher/thrasher &
121fi
122sleep 1 # Wait for contending tasks to start
123echo "Done. Beginning benchmarks..."
124
125num_tests=$(wc -l < $tacleNames)
126for (( i = 0; i < $num_tests ; i++ ))
127do
128 for (( j = $i; j < $num_tests ; j++ )) #loop through programs
129 do
130 # If using DIS, we have to iterate in the script as DIS won't do it for us
131 pwd | grep -qi dis
132 iters=$(python3 -c "print(int(not "$?")*("$maxJobs"-1))")
133 for ((k=0;k<=iters;k++)); do
134 # Autodetect MC^2
135 if uname -a | grep -q "mc2"; then
136 chrt -r 97 numactl -m 0 taskset -c $firstCore ./bin/${tacleProg[$i]} ${tacleProg[$i]} $maxJobs $firstCore $secondCore ${tacleProg[$j]} $runID-$userRunID"-A" 1 & PID1=$!;
137 chrt -r 97 numactl -m 1 taskset -c $secondCore ./bin/${tacleProg[$j]} ${tacleProg[$j]} $maxJobs $secondCore $firstCore ${tacleProg[$i]} $runID-$userRunID"-B" 2 & PID2=$!;
138 else
139 chrt -r 97 taskset -c $firstCore ./bin/${tacleProg[$i]} ${tacleProg[$i]} $maxJobs $firstCore $secondCore ${tacleProg[$j]} $runID-$userRunID-A 1 & PID1=$!;
140 chrt -r 97 taskset -c $secondCore ./bin/${tacleProg[$j]} ${tacleProg[$j]} $maxJobs $secondCore $firstCore ${tacleProg[$i]} $runID-$userRunID-B 2 & PID2=$!;
141 fi
142 wait $PID1 $PID2
143 done
144 echo ${tacleProg[$i]} ${tacleProg[$j]}
145 done
146 echo COMPLETE: ${tacleProg[$i]}
147done
148
149# End contending tasks
150if [[ $6 == "--contend" ]]; then
151 killall thrasher
152fi
153
154# Remove semaphores from system
155# Leaving them won't hurt these tests, but would be messy and is bad practice
156# TODO: Do this directly in the benchmarks. They should clean up after themselves
157./bin/cleanupSemaphores
158
159# Put smp_affinty back the way it was
160i=0
161for IRQ in /proc/irq/*
162do
163 if [ -d $IRQ ]; then
164 echo ${irqList[$i]} 2> /dev/null > $IRQ/smp_affinity_list
165 fi
166 i=$(( $i + 1 ))
167done
168
diff --git a/all_pairs/run_all_pairs_L3_ONLY.sh b/all_pairs/run_all_pairs_L3_ONLY.sh
deleted file mode 100755
index 8ed5eeb..0000000
--- a/all_pairs/run_all_pairs_L3_ONLY.sh
+++ /dev/null
@@ -1,170 +0,0 @@
1#!/bin/bash
2
3firstCore=$1
4secondCore=$2
5maxJobs=$3
6userRunID=$4
7tacleNames=tacleNames.txt
8
9if [ $# -lt 4 ]; then
10 echo "Usage $0 <first core ID> <second core ID> <number of iterations> <run ID> [TACLe names file] [--contend]"
11 exit
12fi
13
14if [ $# -gt 4 ]; then
15 echo "Using alternate list of TACLe benchmarks from $5"
16 tacleNames=$5
17fi
18
19if [ "$EUID" -ne 0 ]
20then
21 echo "You need to be root to enable interrupt isolation and real-time execution!"
22 exit
23fi
24
25echo "Making sure that binaries are up to date..."
26while read i; do
27 make bin/$i
28done < $tacleNames
29echo "Do