Archive for projekt

Geschwindigkeitsvergleich von Matlab und C

Im Rahmen meines Projekt musste ich ein Programm in Matlab schreiben, dass relativ große Dateien einliest und daraus bestimmte Dinge berechnet.

Konkret sieht das so aus: Die Dateien bestehen aus einem etwa 500 byte großen Header, in dem unter anderem die Anzahl der folgenden Datensätze kodiert ist, und dann einige zig bis mehrere hunder Megabyte an binärdaten, die als 32 bit unsigned Integer vorliegen. Die ersten vier Bit geben die Nummer eines Kanals an, oder wenn alle ersten vier bits auf 1 gesetzt sind, einen Überlauf.

Die hinteren 28 Bits sind ein Zeitstempel, der eingehende Signale auf 4ps (Picosekunden) auflöst.

Die Aufgabe war nun im Wesentlichen (auch wenn mir das etwas anders gesagt wurde), aus den Daten ein Histogramm zu bauen (bei den Testdaten etwa 64000 Bins lang), und damit eine Korrelation zu berechnen, und dann aus den ursprünglichen Daten noch ein paar Werte zu extrahieren.

Das Programm in Matlab war relativ schnell fertig geschrieben, aber es ist langsam. Grauenhaft langsam. Für eine 155MB große Eingabedatei rechnet das Programm etwa 6 Stunden auf meinem Laptop. Dafür mache ich vor allem die I/O-Operationen und Arrayzugriffe verantwortlich, die anscheinend nicht besonders effizient implementiert sind.

Also habe ich das gleiche noch in C implementiert. Ergebnis: die Laufzeit ist unter einer Minute, locker. Es ist noch nicht ganz fertig, bisher braucht es knapp 20s, unter 50s werde ich sicher bleiben. Und dabei ist das ganze noch ohne jegliche Optimierungen kompiliert.

Jetzt kann man ja sagen: Ist ja alles schön und gut, Matlab ist eher dafür geeignet, Vektoroperationen durchzuführen, die internen Matlabfunktionen sind da recht schnell.

Aber das beste kommt noch: Ich führe die Korrelation auf die Faltung zurück, und die scheint in Matlab auch nicht sehr effizient implementiert zu sein. Tatsächlich scheint Matlab mehrere Minuten an der Faltung zu rechnen.

Meine C-Implementierung führt die Faltung auf die schnelle Fouriertransformation zurück, berechnet mit der FFTW-Bibliothek. Und bleibt damit unter 5s.

Alles in allem war matlab in diesem Fall für rapid prototyping gar nicht schlecht, scheidet aber aufgrund grauenhafter Performance aus.

Comments

Labor für Quantenkryptographie

Optische Bank mit vielen kleinen Elementen und dünnen Glasfasernkabeln dazwischen

Sieht so ein Labor aus, das weltweit führend auf seinem Fachgebiet ist? Man möchte es nicht glauben. Doch normalerweise sieht man diese Labors nur, wenn sie für Besucher herausgeputzt sind. Da ich das Glück habe, bis zu vier mal die Woche dort zu arbeiten, geht es mir anders.

In dem Labor wird an dem weltweit schnellsten System zur Verteilung kryptografischer Schlüssel mit Hilfe der Quantenmechanik gearbeitet.

Mit Taktraten bis zu 3.3GHz und effektiven Bitraten von über 10kbps über mehr als drei Kilometer Glasfaser hält die Gruppe Photon Counting Technologies um Professor Gerald S. Buller zur Zeit den Weltrekord.

Optische Bank mit vielen kleinen Elementen und dünnen Glasfasernkabeln dazwischen

Die Verschlüsselung, die man damit erreichen kann, ist beweisbar sicher, und die Verteilung der Schlüssel ist nach bisherigem Verständnis der Quantenphysik auch sicher.

Meine Aufgabe ist es im Moment, die Software zu erweitern, die die Messungen auswertet. Später werde ich an den Lichtequellen arbeiten, um höhere Netto-Bitraten zu erzielen. Im Moment werden dazu VCSELs (Vertical Cavity Surface Emitting Lasers) verwenden, ich soll entweder bessere VCSELs finden oder andere Quellen

Comments

Matlab Sourcecode

So, gestern habe ich den Matlab Sourcecode bekommen, der die Quantum Bit Error Rate (QBER) aus Meßdaten des QKD-Systems berechnet.
Und ich hatte schlimmeres erwartet. Die meisten Variablennamen haben ausführliche, vielsagende Namen, und wenn man davon absieht, dass etwa 70% des Codes aus unbenutzten Callbackfunktionen besteht, ist das ganze auch gar nicht so unübersichtlich.

Ein paar kleinere Fehler sind mir beim ersten durchlesen aufgefallen, aber die sind größtenteils leicht zu beheben.

Etwas merkwürdig ist, dass man den Variablen nicht ansieht, ob sie Skalare, Arrays oder Matrizen sind. Das kann sich auch im Laufe des Programms ändern, was nicht besonders schön ist.
Meine Lektion daraus:
Schwach typisierte Sprachen sind schwer lesbar, wenn der Programmierer Mist gebaut hat.

Natürlich ist jede Sprache schwer lesbar, wenn der Programmierer Mist gebaut hat, aber es gibt ja noch Abstufungen…

Comments