In dieser Folge erzählt Lucas Stach uns wie er in die Entwicklung der offenen Grafiktreiber Nouveau und Etnaviv hineingeraten ist und was so ein Grafiktreiber eigentlich tut. Wir reden darüber warum Grafikkarten überhaupt Software ausführen und wie diese Software von der Anwendung bis in die Grafikkarte kommt.
In dieser Folge erzählt Lucas Stach uns wie er in die Entwicklung der offenen Grafiktreiber Nouveau und Etnaviv hineingeraten ist und was so ein Grafiktreiber eigentlich tut. Wir reden darüber warum Grafikkarten überhaupt Software ausführen und wie diese Software von der Anwendung bis in die Grafikkarte kommt.
Diese Folge ist die letzte in der Techweek vorproduzierte Folge, deshalb kann es bei der Veröffentlichung der nächsten Folge zu Verspätungen kommen. Wir haben aber schon Ideen für weitere Folgen, früher oder später geht es also bestimmt weiter.
In wahrscheinlich jedem Berufsfeld gibt es Schauergeschichten, die man sich abends am Lagerfeuer mit einer Taschenlampe am Kinn erzählen kann. So auch in der Welt der Software. In diesem Podcast geben wir in unregelmäßigen Abständen Entwicklerinnen und Entwicklern die Möglichkeit ihre Schauergeschichten zu erzählen. Es geht um monatelange Fehlersuchen, deren Ergebnis nur eine Hand voll Zeilen falscher Code sind, um subtil fehlerhafte Hardware, die zu sporadisch auftretenden Geistern im System führt, um bröckelnde Software, deren Quellcode schon vor Jahren verloren gegangen ist, und manchmal auch um ganz was anderes.
Wer nicht die ganze Folge hören möchte kann sich an den folgenden Zeitmarken orientieren:
00:00Einleitende warme Worte. Was macht das Pengutronix Grafikteam so im Allgemeinen und Lucas im Speziellen?
Die Antwort ist natürlich wie immer „alles!”, nur mit etwas anderem Fokus als andere Teams es machen.
03:30 Lucas erzählt wie er eigentlich dazu gekommen ist Grafiktreiber unter Linux zu schreiben. Nämlich von der ganz anderen Seite her, indem er als Hobby Spiele unter Windows programmiert hat und darüber immer weiter in die Materie programmierbarer Shader-Einheiten eingestiegen ist. Damals passierte diese Programmierung noch direkt im Assembler der jeweiligen Grafikeinheit anstatt sie aus einer high level Sprache wie GLSL zu erzeugen. 06:20 Was ist überhaupt ein Shader und wie werden aus Befehlen für die Grafikeinheit Pixel auf dem Bildschirm? 07:45 Der Weg von Spielen unter Windows zu Grafiktreibern unter Linux. Das Nouveau-Projekt, das einen freien Treiber für NVIDIA-Grafikkarten programmiert, war gerade so weit, dass es erste sichtbare Ergebnisse gab. Die perfekte Gelegenheit also mal wieder in die low level Grafikentwicklung einzusteigen und dort mit zu arbeiten. 10:45 Wie funktionieren Grafiktreiber? Es gibt eine Kernel-Komponente, die aber mehr oder weniger nur Kommandos einer Komponente im Userspace durchreicht. Das ist sowohl bei offenen Treibern als auch bei den closed-source Treibern von z.B. NVIDIA, so. Das ermöglicht ein Reverse-Engineering des Verhalten des closed-source Treibers indem man z.B. auf der Userspace-Seite des Treibers den Auftrag gibt etwas bestimmtes zu zeichnen und dann auf der anderen Seite die an die Grafikeinheit übergebenen Befehle anschaut. 14:00 Eine Tangente darüber wie sichergestellt wird, dass Programme, die die Grafikeinheit nicht den Speicher anderer Programme auslesen und so z.B. Informationen extrahieren. 15:15 Zurück zum eigentlichen Thema mit einer kurzen Zusammenfassung des Gehörten. 19:50 Warum brauchte es zur Entwicklung von Nouveau eigentlich Reverse-Engineering? Gibt es denn keine Dokumentation für die Grafikeinheiten? Nein, gibt es nicht. 21:20 Der Übergang von Nouveau in der Freizeit programmieren zu beruflich Etnaviv mitentwickeln. 23:00 Mit dem Aufkommen von Touch-Bedienung wurde auch im Embedded-Bereich Grafik relevant. Deshalb wurde in den i.MX6 von Freescale (heute NXP) eine vergleichbar performante Grafikeinheit eingebaut. Diese ließ sich aber nur per closed-source Treiber ansprechen. Für Industriekunden mit langen Produktlaufzeiten ist so ein closed-source Treiber ein großes Risiko, weil Updates jederzeit eingestellt werden können. Deshalb gab es damals der Auftrag den freien Etnaviv Treiber für diese Hardware in einen nutzbaren Zustand zu bringen. 33:45 Eine kleine Erläuterung was das Mesa-Projekt tut. Es stellt eine gemeinsame Basis für Grafiktreiber da, damit nur noch die wirklich hardwarespezifischen Teile der Treiber jeweils neu implementiert werden müssen. Gemeinsame Teile sind z.B. die Bereitstellung der OpenGL und Vulkan API und State Machines oder das Kompilieren und Optimieren von Shader-Programmen in eine Intermediate Representation . Die tatsächliche Umsetzung in Befehle für die Grafikeinheit ist dann hardwarespezifisch. 37:00Wie sieht der Maschinencode, der auf einer Grafikeinheit ausgeführt wird, eigentlich aus? Wie muss man sich die parallele Ausführung auf vielen Shader Cores vorstellen?
Shader-Programme sind aus Sicht eines Pixels geschrieben und dadurch massiv parallel ausführbar. Aus Sicht der Anwendung ist die Art wie schlussendlich parallelisiert wird ziemlich egal. Tatsächlich kann es in vielen Fällen sogar dem Treiber egal sein, da die GPU selbst entscheidet was wann wie auf welchem Core ausgeführt wird.
40:00 Kleiner Umweg über PCI und PCI-Express. Über PCI-Express angebundene Grafikkarten können per DMA selbstständig Daten aus dem Arbeitsspeicher der CPU anfragen und in ihren eigenen Speicher übertragen. 48:00 Ein bisschen Lagerfeuergeschichte. Auf einer bestimmten Hardware war die Grafikeinheit sehr instabil und es wurden immer mehr Workarounds in die Treiber eingebaut. Schlussendlich stellte sich heraus, dass ein Teil der GPU aus Versehen übertaktet wurde. 56:30 Neuerdings finden auch in Embedded-SoCs Beschleunigereinheiten für neuronale Netze Einzug. In manchen Fällen sind das einfach Erweiterungen für bestehende Grafikeinheiten, an die Einheiten für größere Matrixmultiplikationen angebaut werden. 59:45 Abschließende Worte