| dstdir=.; |
dstdir=.; |
| |
|
| [ -n "$srcdir" ] || srcdir=$root; |
[ -n "$srcdir" ] || srcdir=$root; |
| |
[ -d "$srcdir" ] || srcdir=$root/submissions/$1; |
| |
[ -d "$srcdir" ] || srcdir=$root/benchmarks/$1; |
| |
[ -d "$srcdir" ] || srcdir=$root; |
| |
|
| |
srcdir=$(relative "$srcdir" "$PWD"); |
| |
|
| |
vectors=verified.test-vectors; |
| |
|
| |
if [ -z "$(find "$srcdir" -name "*$vectors")" ]; then |
| |
error 0 "no test vectors found in $srcdir"; |
| |
exit; |
| |
fi |
| |
|
| |
if [ -z "$(find "$srcdir" -name "Makefile")" ]; then |
| |
error 0 "no Makefile found in $srcdir"; |
| |
exit; |
| |
fi |
| |
|
| vectors=unverified.test-vectors; |
|
| cpu_speed=$(tail -n 1 "$reports/cpuinfo"); |
cpu_speed=$(tail -n 1 "$reports/cpuinfo"); |
| |
|
| if [ -r "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" ]; then |
if [ -r "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" ]; then |
| status 1; |
status 1; |
| fi |
fi |
| |
|
| |
[ -r "$reports/.skip-slow" ] && skip=$(<"$reports/.skip-slow"); |
| |
|
| # ----------------------------------------------------------------------------- |
# ----------------------------------------------------------------------------- |
| |
|
| run () |
run () |
| { |
{ |
| srcdir=$1; |
srcdir=$1; |
| var=$2; |
vecdir=$2; |
| conf=$3; |
var=$3; |
| |
conf=$4; |
| |
|
| ext=${var}_${conf}; |
ext=${var}_${conf}; |
| make="make var=$var conf=$conf"; |
make="make var=$var conf=$conf"; |
| name=$($make name); |
name=$($make name); |
| [ "$var" = "1" ] || name="$name (variant $var)"; |
[ "$var" = "1" ] || name="$name (variant $var)"; |
| |
|
| |
report=$(ls *_$ext 2> /dev/null | head -1); |
| |
|
| |
if [ -n "$report" ]; then |
| |
touch timestamp -r $report; |
| |
|
| |
if $make -q timestamp; then |
| |
warning 1 "nothing to be done. $report is up to date."; |
| |
rm -f timestamp; |
| |
return; |
| |
fi |
| |
|
| |
rm -f timestamp *_$ext; |
| |
fi |
| |
|
| |
if [ -n "$skip" -a -r "$vecdir/fastest" ]; then |
| |
slow=$(awk '{ if ($1 > '$skip') print "true"; }' "$vecdir/fastest"); |
| |
|
| |
if [ "$slow" = "true" ]; then |
| |
warning 1 "skipping slow implementation."; |
| |
return; |
| |
fi |
| |
fi |
| |
|
| status 1 "compiling $name under $conf"; |
status 1 "compiling $name under $conf"; |
| |
|
| $make clean &> /dev/null; |
$make clean &> /dev/null; |
| |
|
| run=$($make run); |
run=$($make run); |
| |
|
| status 1 "generating test vectors"; |
|
| |
|
| error=$($run -v -q &> vectors_$ext; echo "$?"); |
|
| |
|
| status 1; |
|
| |
|
| if [ "$error" -gt "1" ]; then |
|
| mv vectors_$ext errors_$ext; |
|
| mv info_current info_$ext; |
|
| error 0 "execution failed."; |
|
| |
|
| $make clean &> /dev/null; |
|
| return; |
|
| fi |
|
| |
|
| status 1 "verifying test vectors"; |
|
| |
|
| if diff -waq vectors_$ext "$srcdir/$vectors" > /dev/null; then |
|
| status 1; |
|
| rm -f vectors_$ext; |
|
| else |
|
| if diff -wad vectors_$ext "$srcdir/$vectors" \ |
|
| | grep '<' > /dev/null; then |
|
| status 1; |
|
| mv info_current info_$ext; |
|
| error 0 "vectors do not match. check vectors_$ext."; |
|
| |
|
| $make clean &> /dev/null; |
|
| return; |
|
| else |
|
| status 1; |
|
| warning 1 "vectors are incomplete but match."; |
|
| rm -f vectors_$ext; |
|
| fi |
|
| fi |
|
| |
|
| detailed=false; |
detailed=false; |
| |
|
| for flags in "-s -k -p" "-s"; do |
for flags in "-pak -s 128 64 64" "-s 128 64 64 -s 256 128 128"; do |
| status 1 "running speed measurements on $cpu_speed MHz CPU"; |
status 1 "running speed measurements on $cpu_speed MHz CPU"; |
| |
|
| error=$($run -q -c $cpu_speed $flags &> speed_$ext; echo "$?"); |
error=$($run -qc $cpu_speed $flags \ |
| |
2> /dev/null > speed_current; echo "$?"); |
| |
|
| cat >> speed_$ext <<EOF |
cat >> speed_current <<EOF |
| |
|
| ******************************************************************************* |
******************************************************************************* |
| |
|
| status 1; |
status 1; |
| |
|
| cycles=$(awk '{ sub(/\r/, ""); } /cycles\/byte/ { print $4; exit; }' \ |
cycles=$(awk '{ sub(/\r/, ""); } /cycles\/byte/ { print $4; exit; }' \ |
| speed_$ext); |
speed_current); |
| |
|
| if [ -z "$cycles" -o "$error" -gt "0" ]; then |
if [ -z "$cycles" -o "$error" -gt "0" ]; then |
| mv speed_$ext errors_$ext; |
mv speed_current errors_$ext; |
| rm -f info_current |
rm -f info_current |
| error 0 "execution failed. check errors_$ext."; |
error 0 "execution failed. check errors_$ext."; |
| |
|
| return; |
return; |
| fi |
fi |
| |
|
| if [ -r fastest ]; then |
if [ -r "$vecdir/fastest" ]; then |
| comparison=$(awk '{ \ |
comparison=$(awk '{ \ |
| if ('$cycles' < $1) \ |
if ('$cycles' < $1) \ |
| print "better"; \ |
print "better"; \ |
| else if ('$cycles' / $1 < 1.01) \ |
else if ('$cycles' / $1 < 1.01) \ |
| print "similar"; \ |
print "similar"; \ |
| else \ |
else \ |
| print "worse"; }' fastest); |
print "worse"; }' "$vecdir/fastest"); |
| else |
else |
| comparison="better"; |
comparison="better"; |
| fi |
fi |
| |
|
| [ "$comparison" = "worse" ] && break; |
[ "$comparison" = "worse" ] && break; |
| [ "$detailed" = "true" ] && [ "$comparison" = "better" ] \ |
|
| && echo "$cycles" > fastest; |
if [ "$detailed" = "false" ]; then |
| |
status 1 "generating test vectors"; |
| |
|
| |
error=$($run -qv > vectors_current 2> /dev/null; echo "$?"); |
| |
mv vectors_current vectors_$ext; |
| |
|
| |
status 1; |
| |
|
| |
if [ "$error" -gt "1" ]; then |
| |
mv vectors_$ext errors_$ext; |
| |
mv speed_current info_$ext; |
| |
error 0 "execution failed."; |
| |
|
| |
$make clean &> /dev/null; |
| |
return; |
| |
fi |
| |
|
| |
status 1 "verifying test vectors"; |
| |
|
| |
if diff -waq vectors_$ext "$srcdir/$vecdir/"*"$vectors" \ |
| |
> /dev/null; then |
| |
status 1; |
| |
rm -f vectors_$ext; |
| |
else |
| |
if diff -wad vectors_$ext "$srcdir/$vecdir/"*"$vectors" \ |
| |
| grep '<' > /dev/null; then |
| |
status 1; |
| |
mv speed_current info_$ext; |
| |
error 0 "vectors do not match. check vectors_$ext."; |
| |
|
| |
$make clean &> /dev/null; |
| |
return; |
| |
else |
| |
status 1; |
| |
warning 1 "vectors are incomplete but match."; |
| |
rm -f vectors_$ext; |
| |
fi |
| |
fi |
| |
|
| detailed=true; |
detailed=true; |
| |
elif [ "$comparison" = "better" ]; then |
| |
echo "$cycles" > "$vecdir/fastest"; |
| |
fi |
| done |
done |
| |
|
| $make clean &> /dev/null; |
$make clean &> /dev/null; |
| rm -f info_current |
|
| |
rm -f info_current; |
| |
mv speed_current speed_$ext; |
| |
|
| info 1 "Current implementation of $name encrypts at $cycles cycles/byte." |
info 1 "Current implementation of $name encrypts at $cycles cycles/byte." |
| info 1 "Previous implementations reached $(<fastest) cycles/byte." |
info 1 "Previous implementations reached $(<$vecdir/fastest) cycles/byte." |
| } |
} |
| |
|
| # ----------------------------------------------------------------------------- |
# ----------------------------------------------------------------------------- |
| { |
{ |
| srcdir=$1; |
srcdir=$1; |
| dstdir=$2; |
dstdir=$2; |
| conf=$3; |
vecdir=$3; |
| |
conf=$4; |
| |
|
| if ! mkdir -p "$dstdir"; then |
if ! mkdir -p "$dstdir"; then |
| error 0 "Cannot create directory $dstdir."; |
error 0 "Cannot create directory $dstdir."; |
| return; |
return; |
| fi |
fi |
| |
|
| info 1 "Entering directory ${srcdir##*../}"; |
|
| |
|
| cd "$dstdir"; |
cd "$dstdir"; |
| |
info 1 "Entering directory $(relative "$srcdir" "$root")"; |
| |
|
| |
if [ -n "$vecdir" ]; then |
| |
vecdir="../$vecdir"; |
| |
elif [ -r "$srcdir/"*"$vectors" ]; then |
| |
vecdir="."; |
| |
fi |
| |
|
| for subdir in "$srcdir"/*; do |
for subdir in "$srcdir"/*; do |
| if [ -d "$subdir" ] \ |
if [ -d "$subdir" ]; then |
| && [ -n "$(find "$subdir" -name "$vectors")" ]; then |
[ -n "$(find "$subdir" -name "Makefile")" ] || break; |
| (process_dir "../$subdir" "$(basename $subdir)" "$conf"); |
[ -n "$vecdir" ] || [ -n "$(find "$subdir" -name "*$vectors")" ] \ |
| |
|| break; |
| |
|
| |
(process_dir "../$subdir" "$(basename $subdir)" "$vecdir" "$conf"); |
| fi |
fi |
| done |
done |
| |
|
| [ -r "$srcdir/$vectors" -a -r "$srcdir/Makefile" ] || return; |
[ -n "$vecdir" -a -r "$srcdir/Makefile" ] || return; |
| |
|
| sed 's/srcdir = ./srcdir = '${srcdir//\//\\\/}'/' "$srcdir/Makefile" \ |
sed 's/srcdir = ./srcdir = '${srcdir//\//\\\/}'/' "$srcdir/Makefile" \ |
| > Makefile; |
> Makefile; |
| make variants &> /dev/null; |
make variants &> /dev/null; |
| |
|
| for var in $(<variants); do |
for var in $(<variants); do |
| ls *_${var}_${conf} &> /dev/null || run $srcdir $var $conf; |
run $srcdir $vecdir $var $conf; |
| done |
done |
| } |
} |
| |
|
| |
|
| echo $((score + 0)) ${conf%.mk}; |
echo $((score + 0)) ${conf%.mk}; |
| done | sort -rn | while read score conf; do |
done | sort -rn | while read score conf; do |
| info 1 "Testing $conf configuration (score: $score)."; |
[ "$score" = "0" ] && [ -e "$reports/.shortlist-only" ] && break; |
| |
|
| process_dir "$srcdir" "$dstdir" $conf < /dev/null; |
info 1 "Testing $conf configuration (score: $score)."; |
| |
process_dir "$srcdir" "$dstdir" "" $conf < /dev/null; |
| done |
done |
| |
|
| # ----------------------------------------------------------------------------- |
# ----------------------------------------------------------------------------- |