Wer ist schneller? RP2040 versus ESP32!

Seit ein paar Tagen habe ich das ganz neue TTGO T-Display RP2040! Da ich schon seit Jahren das TTGO T-Display mit dem ESP32 einsetze, interessiert es mich sehr, wie groß der Geschwindigkeitsunterschied zwischen den beiden Mikrocontrollern ist.

Für mich spielt bei der Beurteilung eines Mikrocontrollers die Geschwindigkeit des Mikroprozessors, der ja Bestandteil des Mikrocontrollers ist, die maßgebliche Rolle. Auch wenn der RP2040 durch seine 8 Zustandsautomaten ein Alleinstellungsmerkmal hat, ist es meistens die Geschwindigkeit, die den wesentlichen Unterschied macht. Zwar spielt für viele einfache Aufgaben, wie zum Beispiel die Abfrage von Sensoren, die Geschwindigkeit keine Rolle, aber wer zum Beispiel ein Display mit den Controllern ansteuert und darauf sich schnell veränderte Graphen zeigen möchte, oder einen Puffer mit Hunderten von Daten hat, die ständig ausgewertet werden (Stichwort: TensorFlow), profitiert sicher von einer größeren Geschwindigkeit.

Beide Mikrocontroller haben 2 Kerne und laufen mit einer ähnlichen Taktfrequenz. Beim ESP32 sind dies maximal 240 MHz. Leider ist es mir im Rahmen dieses Artikels nicht gelungen, die beim TTGO T-Display tatsächlich verwendete Taktfrequenz zu ermitteln. Auch beim RP2040 fand ich unter der Arduino IDE keine Möglichkeit die Taktfrequenz heraus zu finden. Allerdings fand ich im Internet ein Stückchen Code, mit dem dies unter Python möglich ist.

Kleiner Ausflug nach MicroPython

Darum installierte ich Thonny und flashte den RP2040 des TTGO T-Display RP2040 mit MicroPython. Das ist ganz einfach:

Auf dieser Seite von der Firma Raspberry Pi habe ich den Link ‘downloadable UF2‘ gefunden, mit dem ich eine Datei mit der Bezeichnung ‘rp2-pico-20220117-v1.18.uf2’ herunterladen konnte. Falls Ihr sie dort sucht, wird sie wahrscheinlich anders heißen, da der Name das Datum als Bestandteil enthält.

Anschließend habe ich den ‘BOOT’-Taster gedrückt und bei gedrücktem Taster das USB-Kabel ein gesteckt. Daraufhin öffnet sich ein Explorer-Fenster mit der Bezeichnung ‘RPI-RP2’. Dort habe ich die soeben heruntergeladen Datei ‘rp2-pico-20220117-v1.18.uf2’ hinein kopiert. Daraufhin wird der TTGO T-Display automatisch mit MicroPython geflasht. Er startet anschließend neu und ich kann bei Thonny rechts unten ‘MicroPython (Raspberry Pi Pico)’ auswählen.

Unten in der Shell von Thonny habe ich ‘machine.freq()’ eingeben und als Antwort ‘125000000’ erhalten. Der TTGO T-Display RP2040 läuft also mit 125 MHz! Übrigens kann die Frequenz mit ‘machine.freq(X)’ geändert werden. Aber sobald ihr wieder mit der Arduino IDE arbeitet, ist die Frequenz wieder bei 125 MHz.

Leider ist der TTGO T-Display RP2040 anschließend nicht mehr mit der Arduino IDE zu flashen! Um das TTGO T-Display wieder fit für die Arduino IDE zu machen, benötigte ich eine spezielle ‘uf2’-Datei. Diese habe ich hier gefunden. Diese Datei habe ich auf die eben schon beschriebene Weise auf das TTGO T-Display RP2040 geflasht. Anschließend war der RP2040 wieder unter der Arduino IDE ansprechbar!

Zum Test verwendete Programme

Um die Geschwindigkeit zu testen habe ich 2 Programme entwickelt. Ich habe sie ‘Prime’ und ‘Fractal Benchmark’ genannt. Prime berechnet Primzahlen ab einem Startwert von 1000000, so dass die gefundenen Primzahlen am Anfang nicht ganz so schnell durch die Anzeige fliegen. Es arbeitet nur mit Integer-Arithmetik, im Gegensatz zu Fractal Benchmark’, welches viel Fließkomma-Arithmetik verwendet. Die Programme sind auf beiden Mikrocontrollern bis auf winzige Details identisch. Die Unterschiede haben keinerlei Einfluss auf die Geschwindigkeit.

Ich habe ein Video erstellt, in dem beide Programme zu sehen sind:

Testergebnisse

Am Anfang sieht man zwei Listen mit grünen Zahlen scrollen. Das sind die gefundenen Primzahlen von ‘Prime’. Die linke wird vom RP2040 berechnet und ist deutlich langsamer als die rechte Liste, die vom ESP32 erzeugt wird.  Die beiden Listen werden auf den Displays der beiden Mikrocontroller dargestellt. Mein Programm zeigt links oben im Display die Anzahl der bisher gefundenen Primzahlen und rechts oben die für die Prüfung der letzten gefundenen Primzahl erforderliche Zeit. Nachdem der ESP32 1000 Primzahlen gefunden hat, hat der RP2040 erst 183 gefunden! Das entspricht gerundet ungefähr einem Faktor von 5. Der ESP32 ist also bei dieser Aufgabe rund 5 mal so schnell wie der RP2040!

Wie ich anfangs schon schrieb, weiß ich nicht genau wie hoch der ESP32 im TTGO T-Display getaktet ist. Aber angenommen, er wäre mit seinem maximal möglichen Takt von 240 MHz getaktet, so entspricht dies einem Faktor von 1.92 (240/125) alleine durch den unterschiedlichen Takt! Das heißt, alleine durch die Taktfrequenz lässt sich der große Unterschied zwischen den beiden Mikrocontrollern nicht klären. Der Unterschied kann nun im Compiler liegen: Wie effizient kompiliert der Compiler aus dem C++ Code Maschinencode für den im Mikrocontroller enthaltenen Mikroprozessor? Aber auch wie effizient ist der Mikroprozessor entwickelt worden? Wie viele Taktzyklen benötigt er für einen Maschinenbefehl (Opcode)? An dieser Stelle kann ich ohne weitere Recherchen und Experimente leider keine Auskunft geben.

Nach knapp einer Minute des Videos könnt Ihr den gleichzeitigen Start von ‘Fractal Generator’ auf beiden Mikrocontrollern beobachten. Anfangs seht Ihr links eine Fläche mit zufälligen Pixelfarben, da der RP2040 eine ganze Zeit benötigt um allein das erste Bild zu berechnen. In dieser Zeit geht es beim ESP32 schon richtig ab. Er benötigt nur Sekundenbruchteile für die einzelnen Bilder und man denkt ein Film läuft ab. Aber es sind tatsächlich in Echtzeit berechnete Bilder, die dort in schneller Folge erscheinen!

Nach 30 Minuten hat der ESP32 6960 Bilder berechnet! Der RP2040 dagegen erst 102. Das entspricht einem Faktor von 68 (6960/102)! Das ist richtig viel schneller! Immerhin werden hier 240*135 = 32400 Pixel berechnet! Und für jeden einzelnen davon sind 8 Multiplikationen, 5 Additionen und 3 Subtraktionen notwendig.

Also mindestens 518000 Fließkommaoperationen in weniger als einer Zehntelsekunde, da die innerste Schleife meines Codes auch noch mehrmals durchlaufen werden kann!

Ich überlegte eine Zeit lang ob ich irgendeinen Fehler gemacht habe, aber mir fiel nichts ein. Der ESP32 ist bei der Berechnung der Fraktale krass schneller.

Was könnte der Grund für diesen großen Unterschied sein?

Der ESP32 hat im Gegensatz zum RP2040 eine Unterstützung für die Berechnung von Fließkommazahlen eingebaut. Er kann Division und Addition von Fließkommazahlen mit seinem Mikroprozessor ausführen. Er hat – sozusagen – eine FPU (Gleitkommaeinheit) integriert!

Während also der RP2040 jede Multiplikation und Addition als Folge von vielen einzelnen Maschinenbefehlen berechnen muss, kann das der ESP32 möglicherweise mit einer einzigen Anweisung. Genau weiß ich das natürlich nicht, da müsste ich einen Blick auf den erzeugten Maschinencode werfen, aber so ungefähr, denke ich, kann man sich das vorstellen.

Was bedeutet das Ergebnis für die Praxis?

Für spezielle Aufgaben, die das Vorhandensein eines Zustandsautomaten, eine individuelle Schnittstelle oder eine besondere Stromversorgung erforderlich machen, mag der RP2040 bzw. Pico eine brauchbare Auswahl sein. Ich frage mich allerdings, warum ein für Anfänger gedachter Mikrocontroller so etwas schwierig Anzuwendendes wie die programmierbaren PIOs und die Zustandsautomaten besitzt? Für alles andere ist der ESP32, der auch nicht teurer ist, die bessere Wahl. Vor allem auch weil er noch Bluetooth und WiFi dabei hat. Denn nur letzteres ermöglicht es zum Beispiel Sensorwerte direkt per SQL und kabellos in einen Datenbank einzutragen. Und ich denke nicht, dass die VGA Ausgabe der vom RP2040 erzeugten Informationen die zukünftige Hauptaufgabe des RP2040 sein wird.

 

 

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.