Linpack auf Raspberry Pi 1 Model B

Die letzten Abende habe ich mal getestet, wie schnell so ein Raspi praktisch ist.
Theoretisch sollten bei 900 MHz und 2 Takten pro Gleitkommaoperation 450 MFlops drin sein. Also habe ich die beiden in Raspbian enthaltenen Versionen von BLAS (http://www.netlib.org/blas/) und ATLAS (http://math-atlas.sourceforge.net/) installiert sowie OpenBLAS (http://www.openblas.net/) selbst kompiliert.

Zum Testen habe ich den Linpack-Benchmark hpcc (http://icl.cs.utk.edu/hpcc/software/index.html) genutzt.

Neben den üblichen Compilerschaltern kamen dann nach einigem Suchen für den Raspberry Pi 1 noch „-march=armv6 -mfloat-abi=hard -mfpu=vfp“ beim Übersetzen von OpenBLAS und hpcc dazu.

Für BLAS waren die Benchmark-Resultate echt deprimierend. Ganze 25 MFlop, also gerade mal 1/20 der theoretischen Leistung, waren zu erreichen. Hier ist beim Übersetzen „vergessen“ worden, das der Raspberry eine integrierte Gleitkommaeinheit hat.

Mit ATLAS wurde das Ganze schon deutlich besser. Und wie fast schon zu erwarten, war die selbst übersetzte OpenBLAS-Version die schnellste. Für die beiden letzteren wurden dann folgende Ergebnisse erreicht (Angabe in der letzten Spalte in ):

T/V N NB P Q Time Gflops
-----------------------------------------------------------------
WR11C2R4 6400 160 1 1 837.57 2.087e-01 (ATLAS)
WR11C2R4 6400 160 1 1 655.59 2.667e-01 (OpenBLAS)

Damit ist OpenBLAS für diesen Fall ca. 25% schneller als ATLAS und ganze 10x schneller als BLAS. Verglichen mit der theoretischen Leistung sind aber nur knapp 60% erreicht. Vielleicht lässt sich da mit anderen Matrixgrößen noch etwas mehr erreichen.

Wenn man nicht (fast) alles selber macht …

Damit sich die Minnowboards nicht langweilen, habe ich noch ein bißchen mit dem Linpack Benchmark getestet.

Nach einigen Durchläufen war das beste Ergebnis dann:

8,983 GFlops

(Effizienz: 84,2%, 256,6 MFlops/Watt)

Konfiguration:
Ubuntu 14.04
openblas-base 0.2.8
openmpi  1.6.5-8

Make.Ubuntu
HPL.out
HPL.dat

Wer noch eine Stelle zum optimieren findet, bitte melden. Das „lokale“ Maximum (2 Cores) der Effizienz liegt bei 90%, das geht bestimmt besser.

Update 04.12.2014:
Habe dann doch noch OpenBLAS neu übersetzt mit den passenden(?) Optionen.

9,048 GFlops (84,9%, 258,5 MFlops/MFlop)

Update 05.12.2014:
Nach einigen Durchläufen mit unterschiedlichen NB/N-Kombinationen:

9,282 GFlops (87%, 265,2 MFlops/Watt)

HPL.dat
HPL.out

 

Noch mehr Spielzeug

Vor einigen Tagen kam ein Päckchen mit 4 niegelnagelneuen Minnowboards. Und nachdem auch noch ein paar Kleinteile angekommen sind, dürfen die 4 seit heute im Team arbeiten. Natürlich muss da auch gleich ein Linpack-Benchmark durchlaufen. Zum Glück gibt es unter Ubuntu gleich das passende Paket „hpcc“ (HPC Challenge).

Nach ein paar Optimierungen (danke an die Seite Top500 HPL Calculator) kommt mein Minicluster auf:

8,796 GFlops

Meine hpccinf.txt: Download

Das Ergebnis: hpccoutf.txt

Bei einem theoretischen Maximum von 10,64 GFlops (4 Boards x 2 Cores x 1,33 GHz) macht das eine Effizienz von 82,67 %. Und bei maximal 35 Watt Leistungsaufnahme (inkl. Switch und aller Netzteile) sind das dann 251 MFlops/Watt. Das würde zur Zeit sogar für Platz 318 in den Green500 reichen ;-).

Jetzt gehts noch ein bißchen ans Optimieren, mal sehen, ob da noch was geht.

IPv6

Wenn schon der Vodafone-Router schon kein IPv6 kann, muss der Raspi halt dafür herhalten, den Sixxs-Tunnel bereitstellen. Seit heute also kann der Raspi auch via IPv6 kommunizieren. Jetzt noch den passenden DNS-Eintrag, dann gibt es die WordPress-Seiten auch über den Tunnel.

Wie fühlen wir uns den heute?

Hab die letzten Tage mal ein Plugin für Nagios/Icinga geschrieben, das die Temperatur meines Pi prüft. Die Arithmetik der Dash-Shell hat wohl ein Problem mit Dezimalzahlen, daher musste das Ganze dann auch noch ausschließlich mit Integern funktionieren. Und weil ich schon dabei war, funktioniert das ganze auch mit Fahrenheit.

check_pi_temp:

#!/bin/sh
#
# Author: Rajko Zschiegner
# Date: 14/01/12
# Purpose: Check Raspberry Pi temperature
#

PROGNAME=basename $0
PROGPATH=echo $0 | sed -e 's,[\\/][^\\/ [^\\/]*$,,'
REVISION=echo '$Revision: 1.00 $' | sed -e 's/[^0-9.]//g'

. $PROGPATH/utils.sh

print_usage() {
    echo "Usage: ${PROGNAME} -w  -c  [-f]"
    echo "\t-f calculate temperatures in Fahrenheit"
    echo "\te.g. ${PROGNAME} -w 60 -c 70"
    echo "\t60°C is equiv. to 140°F, 70°C to 158°F"
}

# Make sure the correct number of command line
# arguments have been supplied

if [ $# -lt 4 ]; then
    print_usage
    exit $STATE_UNKNOWN
fi

FAHRENHEIT=0
UNIT="°C"
UNIT_EQ="°F"

while [ $# -gt 0 ]; do
    case $1 in
        ("-w") {
                shift
                if [ $1 -gt 0 ] 2>/dev/null; then
                    w_temp=$1
                else
                    print_usage
                    exit $STATE_UNKNOWN
                fi
                };;
        ("-c") {
                shift
                if [ $1 -gt 0 ] 2>/dev/null; then
                    c_temp=$1
                else
                    print_usage
                    exit $STATE_UNKNOWN
                fi
                };;
        ("-f") FAHRENHEIT=1;;
    esac
    shift
done

if [ $FAHRENHEIT -eq 1 ] ; then
    UNIT="°F"
    UNIT_EQ="°C"
fi

TEMPERATURE=cat /sys/class/thermal/thermal_zone0/temp

if [ $FAHRENHEIT -eq 0 ] ; then
    TEMP_DEGREE=echo $(((TEMPERATURE + 500) / 1000))
    TEMP_DEGREE_EQ=echo $(((TEMPERATURE * 18 + 5000) / 10000 + 32))
else
    TEMP_DEGREE=echo $(((TEMPERATURE * 18 + 5000) / 10000 + 32))
    TEMP_DEGREE_EQ=echo $(((TEMPERATURE + 500) / 1000))
fi

if [ $TEMP_DEGREE -gt $c_temp ] ; then
    echo "Temperature: critical ${TEMP_DEGREE}${UNIT} (or ${TEMP_DEGREE_EQ}${UNIT_EQ})"
    exit $STATE_CRITICAL
elif [ $TEMP_DEGREE -gt $w_temp ] ; then
    echo "Temperature: warning ${TEMP_DEGREE}${UNIT} (or ${TEMP_DEGREE_EQ}${UNIT_EQ})"
    exit $STATE_WARNING
else
    echo "Temperature: ok ${TEMP_DEGREE}${UNIT} (or ${TEMP_DEGREE_EQ}${UNIT_EQ})"
    exit $STATE_OK
fi

Und damit das ganze auch noch vernünftig mit nagiosgraph angezeigt wird, der passende Eintrag für die /etc/nagiosgraph/map:

# Service type: Raspi Temp
# output:Temperature: ok 47°C (or 117°F)
# or with -f output:Temperature: ok 117°F (or 47°C)
/output:Temperature\:.*?([.\d]+)°C \(or ([.\d]+)°F\)/
and push @s, ['raspitemp',
                ['Celsius', GAUGE, $1 ],
                ['Fahrenheit', GAUGE, $2 ] ];

/output:Temperature\:.*?([.\d]+)°F \(or ([.\d]+)°C\)/
and push @s, ['raspitemp',
                ['Celsius', GAUGE, $2 ],
                ['Fahrenheit', GAUGE, $1 ] ];

Sicher doch!

Nun läuft der Webserver nur noch über SSL. Owncloud läuft auch schon und ist befüllt, z.B. mit den Mercedes Benz Mixed Tapes.

Erstellen des Zertifikates:

cd /etc/apache2
sudo mkdir ssl.key
sudo mkdir ssl.crt
sudo mkdir ssl.csr
sudo openssl genrsa -out ssl.key/raspi.madavi.de.key 4096
sudo openssl req -new -sha256 -key ssl.key/raspi.madavi.de.key -out ssl.csr/raspi.madavi.de.csr

Der Zertifikats-Request kann dann bei einer CA verwendet werden, um ein Zertifikat zu bekommen (z.B. kostenlos bei StartSSL).

Dann muss das Ganze nur noch in der Apache-Konfig angepasst werden.

    SSLEngine on

    SSLProtocol All -SSLV2
    SSLHonorCipherOrder On
    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AES:RC4:!ADH:!AECDH:!MD5:!DSS

    SSLCertificateFile      /etc/apache2/ssl.crt/raspi.madavi.de.crt
    SSLCertificateKeyFile   /etc/apache2/ssl.key/raspi.madavi.de.key
    SSLCertificateChainFile /etc/apache2/ssl.crt/sub.class1.server.ca.pem
    SSLCACertificatePath    /etc/apache2/ssl.crt/
    SSLCACertificateFile    /etc/apache2/ssl.crt/startssl_ca.pem

Das Ganze gibt dann Verbindungen mit Perfect Forward Secrecy für alle Browser außer den IE-Varianten.