feat: add graph generator
This commit is contained in:
parent
eba22fb721
commit
4c2d75de0e
3
.gitignore
vendored
3
.gitignore
vendored
@ -64,4 +64,5 @@ modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
graphs/out/
|
||||
graphs/tmp/
|
||||
|
2
Makefile
2
Makefile
@ -71,7 +71,7 @@ ${install_bins_targets}: ${install_dir}/bin/%: ${build_dir}/%
|
||||
|
||||
.PHONY: graphs
|
||||
graphs:
|
||||
true
|
||||
cd graphs && bash generate_graphs.sh
|
||||
|
||||
.PHONY: valgrind
|
||||
valgrind: ${valgrind_targets}
|
||||
|
257
graphs/generate_graphs.sh
Normal file
257
graphs/generate_graphs.sh
Normal file
@ -0,0 +1,257 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# CONSTANTS
|
||||
|
||||
US="Équipe n°2 - 26137"
|
||||
ROOT_PATH=".."
|
||||
INSTALLED_BINARIES_PATH="$ROOT_PATH/install/bin"
|
||||
TMP_PATH="./tmp"
|
||||
BINARIES_PATH="$TMP_PATH/own"
|
||||
PTHREAD_BINARIES_PATH="$TMP_PATH/pthread"
|
||||
GRAPHS_OUTPUT="./out"
|
||||
|
||||
MIN_LEVEL=20
|
||||
MAX_LEVEL=80
|
||||
NB_THREAD_START=20
|
||||
NB_THREAD_STOP=200
|
||||
NB_THREAD_PAS=10
|
||||
NB_YIELD_START=10
|
||||
NB_YIELD_STOP=100
|
||||
NB_YIELD_PAS=20
|
||||
NB_PASS=100
|
||||
|
||||
set -e
|
||||
|
||||
# CREATE BINS
|
||||
|
||||
mkdir -p "$PTHREAD_BINARIES_PATH"
|
||||
|
||||
make -C "$ROOT_PATH" clean > /dev/null
|
||||
make -C "$ROOT_PATH" pthreads > /dev/null
|
||||
make -C "$ROOT_PATH" install > /dev/null
|
||||
cp "$INSTALLED_BINARIES_PATH"/* "$PTHREAD_BINARIES_PATH" > /dev/null
|
||||
|
||||
mkdir -p "$BINARIES_PATH"
|
||||
|
||||
make -C "$ROOT_PATH" clean > /dev/null
|
||||
make -C "$ROOT_PATH" > /dev/null
|
||||
make -C "$ROOT_PATH" install > /dev/null
|
||||
cp "$INSTALLED_BINARIES_PATH"/* "$BINARIES_PATH" > /dev/null
|
||||
|
||||
# FUNCTIONS
|
||||
|
||||
execute_test() {
|
||||
bin=$1
|
||||
shift 1
|
||||
# shellcheck disable=SC2046
|
||||
value="$($bin $(echo "$@" | xargs) 2>/dev/null | grep 'GRAPH' | sed 's/;SUCCESS//' | awk -F';' '{ print $NF }')"
|
||||
if [ -z "$value" ] || [ "$value" = "0" ]
|
||||
then
|
||||
return 1
|
||||
fi
|
||||
echo "$value"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 51-fibonacci
|
||||
number_argument() {
|
||||
for thread in $(seq 5 15)
|
||||
do
|
||||
time_own=0
|
||||
time_pthread=0
|
||||
for _ in $(seq 1 $NB_PASS)
|
||||
do
|
||||
value=$(execute_test "$1" "$thread")
|
||||
result=$?
|
||||
if [ ! $result = 0 ]
|
||||
then
|
||||
return $result
|
||||
fi
|
||||
value=$(printf "%.7f" "$value")
|
||||
executed=$(bc -l <<< "scale=0;$value*100000/1")
|
||||
time_own=$((time_own+executed))
|
||||
|
||||
value=$(execute_test "$2" "$thread")
|
||||
result=$?
|
||||
if [ ! $result = 0 ]
|
||||
then
|
||||
return $result
|
||||
fi
|
||||
value=$(printf "%.7f" "$value")
|
||||
executed=$(bc -l <<< "scale=0;$value*100000/1")
|
||||
time_pthread=$((time_pthread+executed))
|
||||
done
|
||||
time_pthread=$((time_pthread/NB_PASS))
|
||||
echo "$thread, $time_own, $time_pthread"
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
# 21-create-many, 22-create-many-recursive, 23-create-many-once, 61-mutex, 62-mutex
|
||||
only_thread_argument() {
|
||||
for thread in $(seq $NB_THREAD_START $NB_THREAD_PAS $NB_THREAD_STOP)
|
||||
do
|
||||
time_own=0
|
||||
time_pthread=0
|
||||
for _ in $(seq 1 $NB_PASS)
|
||||
do
|
||||
executed=$(execute_test "$1" "$thread")
|
||||
result=$?
|
||||
if [ ! $result = 0 ]
|
||||
then
|
||||
return $result
|
||||
fi
|
||||
time_own=$time_own+$(("$executed"))
|
||||
executed=$(execute_test "$2" "$thread")
|
||||
result=$?
|
||||
if [ ! $result = 0 ]
|
||||
then
|
||||
return $result
|
||||
fi
|
||||
time_pthread=$time_pthread+$(("$executed"))
|
||||
done
|
||||
time_own=$((time_own/NB_PASS))
|
||||
time_pthread=$((time_pthread/NB_PASS))
|
||||
echo "$thread, $time_own, $time_pthread"
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
# 31-switch-many, 32-switch-many-join, 33-switch-many-cascade
|
||||
thread_yield_argument() {
|
||||
for thread in $(seq $NB_THREAD_START $NB_THREAD_PAS $NB_THREAD_STOP)
|
||||
do
|
||||
for yield in $(seq $NB_YIELD_START $NB_YIELD_PAS $NB_YIELD_STOP)
|
||||
do
|
||||
time_own=0
|
||||
time_pthread=0
|
||||
for _ in $(seq 1 $NB_PASS)
|
||||
do
|
||||
executed=$(execute_test "$1" "$thread" "$yield")
|
||||
result=$?
|
||||
if [ ! $result = 0 ]
|
||||
then
|
||||
return $result
|
||||
fi
|
||||
time_own=$time_own+$(("$executed"))
|
||||
executed=$(execute_test "$2" "$thread" "$yield")
|
||||
result=$?
|
||||
if [ ! $result = 0 ]
|
||||
then
|
||||
return $result
|
||||
fi
|
||||
time_pthread=$time_pthread+$(("$executed"))
|
||||
done
|
||||
time_own=$((time_own/NB_PASS))
|
||||
time_pthread=$((time_pthread/NB_PASS))
|
||||
echo "$thread, $yield, $time_own, $time_pthread"
|
||||
done
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
# VERIFICATIONS
|
||||
|
||||
if ! which gnuplot 2>&1 >/dev/null
|
||||
then
|
||||
echo 'Please install gnuplot.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! which bc 2>&1 >/dev/null
|
||||
then
|
||||
echo 'Please install bc.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BINARIES_PATH" ] || [ "$(find "$BINARIES_PATH" | wc -c)" = "0" ]
|
||||
then
|
||||
echo 'Binaries are not in `'"$BINARIES_PATH"'`.'
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# LOGIC
|
||||
|
||||
mkdir -p "$GRAPHS_OUTPUT"
|
||||
|
||||
#for bin in $(find "$BINARIES_PATH" -type f | sort)
|
||||
for bin in "$BINARIES_PATH"/62-mutex
|
||||
do
|
||||
name=$(echo "$bin" | awk -F'/' '{ print $NF }')
|
||||
graph_filename="$GRAPHS_OUTPUT/$name.svg"
|
||||
level=$(("$(echo "$name" | awk -F'-' '{ print $1 }')"))
|
||||
if [ $MIN_LEVEL -gt $level ] || [ $MAX_LEVEL -lt $level ]
|
||||
then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo '[ ] Testing '"$name"'...'
|
||||
if [ ! -x "$bin" ]
|
||||
then
|
||||
echo ' '"$name"' is not executable.'
|
||||
chmod +x "$bin"
|
||||
fi
|
||||
|
||||
echo -n '' > $TMP_PATH/data
|
||||
SECONDS=0
|
||||
|
||||
gnu_commands="
|
||||
set term svg;
|
||||
set grid;
|
||||
set title \"Comparaison des temps d'execution de $name\";"
|
||||
case "$($bin)" in
|
||||
"argument manquant: entier x pour lequel calculer fibonacci(x)")
|
||||
if ! number_argument "$bin" "$PTHREAD_BINARIES_PATH/$name" >> $TMP_PATH/data
|
||||
then
|
||||
echo '[X] Command failed ('"$?"').'
|
||||
continue;
|
||||
fi
|
||||
gnu_commands="$gnu_commands
|
||||
set xlabel 'Nombre utilisé';
|
||||
set ylabel 'Temps (µs)';
|
||||
set output '$graph_filename';
|
||||
plot '$TMP_PATH/data' using 1:2 with lines title '$US', '$TMP_PATH/data' using 1:3 with lines title 'Pthread';
|
||||
"
|
||||
;;
|
||||
"argument manquant: nombre de threads")
|
||||
if ! only_thread_argument "$bin" "$PTHREAD_BINARIES_PATH/$name" >> $TMP_PATH/data
|
||||
then
|
||||
echo '[X] Command failed ('"$?"').'
|
||||
continue;
|
||||
fi
|
||||
gnu_commands="$gnu_commands
|
||||
set xlabel 'Nombre de threads';
|
||||
set ylabel 'Temps (µs)';
|
||||
set output '$graph_filename';
|
||||
plot '$TMP_PATH/data' using 1:2 with lines title '$US', '$TMP_PATH/data' using 1:3 with lines title 'Pthread';
|
||||
"
|
||||
;;
|
||||
"arguments manquants: nombre de threads, puis nombre de yield")
|
||||
if ! thread_yield_argument "$bin" "$PTHREAD_BINARIES_PATH/$name" >> $TMP_PATH/data
|
||||
then
|
||||
echo '[X] Command failed ('"$?"').'
|
||||
continue;
|
||||
fi
|
||||
gnu_commands="$gnu_commands
|
||||
set xlabel 'Nombre de threads';
|
||||
set ylabel 'Nombre de yields';
|
||||
set zlabel 'Temps (µs)';
|
||||
set output '$graph_filename';
|
||||
splot '$TMP_PATH/data' using 1:2:3 title '$US', '$TMP_PATH/data' using 1:2:4 title 'Pthread';
|
||||
"
|
||||
;;
|
||||
*)
|
||||
echo '[X] Can not determine which arguments are needed.'
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "[-] Execution finished. ($((SECONDS / 60))m$((SECONDS % 60))s)"
|
||||
SECONDS=0
|
||||
|
||||
echo "$gnu_commands" | gnuplot
|
||||
|
||||
echo "[+] Plot generated at \`""$graph_filename""\`. ($((SECONDS / 60))m$((SECONDS % 60))s)"
|
||||
done
|
||||
|
||||
rm -rf "$TMP_PATH"
|
Loading…
x
Reference in New Issue
Block a user