summaryrefslogtreecommitdiffstats
path: root/baseline/run_baseline.sh
blob: c5b67b64c5cd879d1dfa2efd099d05457798edf8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/bin/bash

core=$1
maxJobs=$2
userRunID=$3
tacleNames=tacleNames.txt

if [ $# -lt 3 ]; then
    echo "Usage $0 <core ID> <number of iterations> <run ID> [TACLe names file] [--contend]"
    exit
fi

if [ $# -gt 3 ]; then
    echo "Using alternate list of TACLe benchmarks from $4"
    tacleNames=$4
fi

if [ "$EUID" -ne 0 ]
then
    echo "You need to be root to enable interrupt isolation and real-time execution!"
    exit
fi

echo "Making sure that binaries are up to date..."
while read i; do
    make bin/$i
done < $tacleNames
echo "Done. Disabling real-time throttling..."

# Turn off rt throttling
echo -1 > /proc/sys/kernel/sched_rt_runtime_us
echo "Done. Redirecting all interrupts to core 0..."

# Redirect all interrupts to core 0
i=0
for IRQ in /proc/irq/*
do
    # Skip default_smp_affinity
    if [ -d $IRQ ]; then
        irqList[$i]=$(cat $IRQ/smp_affinity_list)
        echo 0 2> /dev/null > $IRQ/smp_affinity_list
    fi
    i=$(( $i + 1 ))
done

# Read the names of each benchmark
j=0
while read i; do
    tacleProg[$j]=$i
    j=$(( $j + 1 ))
done < $tacleNames

echo "Done. Checking for wbinvd module..."
if [[ ! -f "/proc/wbinvd" ]]; then
    echo "ERROR: wbinvd module not loaded. Exiting..."
    exit
fi

echo "Done. Setting cores $firstCore and $secondCore to 'performance'..."
echo "performance" > /sys/devices/system/cpu/cpu15/cpufreq/scaling_governor
echo "performance" > /sys/devices/system/cpu/cpu31/cpufreq/scaling_governo

# Enable L3 isolation
echo "Done. Enabling L3 isolation..."
mount -t resctrl resctrl /sys/fs/resctrl
mkdir -p /sys/fs/resctrl/benchmarks
echo $1 > /sys/fs/resctrl/benchmarks/cpus_list
# Reset global bandwith control and remove L3 from global
echo "L3:0=ffff;1=ffff;2=ffff;3=0000" > /sys/fs/resctrl/schemata
echo "MB:0=2048;1=2048;2=2048;3=2048" > /sys/fs/resctrl/schemata
# Alloc L3 to benchmark
echo "L3:0=0000;1=0000;2=0000;3=ffff" > /sys/fs/resctrl/benchmarks/schemata
echo "MB:0=2048;1=2048;2=2048;3=2048" > /sys/fs/resctrl/benchmarks/schemata
echo "Done. Verifying configuration with user..."

# Generate file name string
# We append to this as we parse the environment settings
runID=$(date +"%b%d-%H")

# Confirm configuration with user
echo "=== Global Config ==="
cat /sys/fs/resctrl/schemata
echo "=== Core $1 Config ==="
cat /sys/fs/resctrl/benchmarks/schemata
if [[ $5 == "--contend" ]]; then
    if [[ ! -f "/playpen/mc2/imx6q-thrasher/thrasher" ]]; then
        echo "ERROR: thrasher binary not fonud. Exiting..."
        exit
    fi
    echo "Will run 6 contending tasks"
    runID=$runID-c
else
    runID=$runID-xc
fi
if uname -a | grep -q "mc2"; then
    echo "MC^2 Autodetected. Cache coloring and interleaving will be enabled."
    runID=$runID-i
else
    echo "MC^2 not detected."
    runID=$runID-xi
fi
if pwd | grep -qi dis; then
    echo "Autodetected DIS. Will use script-level looping."
fi
echo "Results will be saved as $runID-$userRunID.txt"
echo "Press enter to confirm environment, Ctrl-C to exit..."
read

# Start contending tasks
if [[ $5 == "--contend" ]]; then
    echo "Done. Starting 6 contending tasks..."
    # Run two contending tasks on each other CCX
    taskset -c 1 /playpen/mc2/imx6q-thrasher/thrasher &
    taskset -c 2 /playpen/mc2/imx6q-thrasher/thrasher &
    taskset -c 5 /playpen/mc2/imx6q-thrasher/thrasher &
    taskset -c 6 /playpen/mc2/imx6q-thrasher/thrasher &
    taskset -c 9 /playpen/mc2/imx6q-thrasher/thrasher &
    taskset -c 10 /playpen/mc2/imx6q-thrasher/thrasher &
fi
sleep 1 # Wait for contending tasks to start
echo "Done. Beginning benchmarks..."

num_tests=$(wc -l < $tacleNames)
for (( i = 0; i < $num_tests ; i++ ))
do
    # If using DIS, we have to iterate in the script as DIS won't do it for us
    pwd | grep -qi dis
    iters=$(python3 -c "print(int(not "$?")*("$maxJobs"-1))")
    for ((k=0;k<=iters;k++)); do
        # Check if we're using LITMUS^RT or not
        if [[ -f source/extra.h ]] && grep -q "#define LITMUS 1" source/extra.h; then
            ./bin/${tacleProg[$i]} ${tacleProg[$i]} $maxJobs $core $runID-$userRunID 1
        else
            # Interleave memory allocations between all nodes (only 1 node w/out MC^2)
            chrt -r 97 numactl --interleave=all taskset -c $core ./bin/${tacleProg[$i]} ${tacleProg[$i]} $maxJobs $core $runID-$userRunID 1
#chrt -r 97 numactl -m 0 taskset -c $core ./bin/${tacleProg[$i]} ${tacleProg[$i]} $maxJobs $core $runID-$userRunID-NOINTERLEAVE 1
        fi
    done
    echo COMPLETE: ${tacleProg[$i]}
done

# End contending tasks
if [[ $5 == "--contend" ]]; then
    killall thrasher
fi

# Put smp_affinty back the way it was
i=0
for IRQ in /proc/irq/*
do
    if [ -d $IRQ ]; then
        echo ${irqList[$i]} 2> /dev/null > $IRQ/smp_affinity_list
    fi
    i=$(( $i + 1 ))
done