- Eine maßgeschneiderte Grafikverarbeitungseinheit, die von der Hardware bis zum Treiber selbst entwickelt wurde, um in modernen PCs wie eine echte GPU verwendet zu werden
- Die Kernimplementierung erfolgt auf einem Xilinx Zynq UltraScale+ FPGA und ist auf einer maßgeschneiderten PCB untergebracht
- Sie ist per PCIe mit dem Host-Computer verbunden und funktioniert nicht als Softwareexperiment, sondern als echte Hardware-GPU
- Der Funktionsumfang ist auf das Niveau hochwertiger Grafikkarten aus der Mitte der 1990er-Jahre ausgelegt und zielt auf das Rendering damaliger Spiele ab
- Mit einem modernen Windows-Treiber-Stack kann sie echte Spiele dieser Ära mit Bildraten über Echtzeit rendern
Hardwareaufbau
- FuryGpu ist eine vollständig maßgeschneiderte GPU, die von Grund auf für den Einsatz in modernen Computern entwickelt wurde
- Die Grafikverarbeitungslogik ist auf einem Xilinx Zynq UltraScale+ FPGA implementiert
- Sie sitzt auf einer maßgeschneiderten PCB und ist per PCIe mit dem Host-Computer verbunden
Grafikfunktionen und Treiber
- Die Hardwarefunktionen unterstützen ein Niveau, das hochwertigen Grafikkarten aus der Mitte der 1990er-Jahre entspricht
- Zusammen mit einem modernen Windows-Software-Treiber-Stack kann sie in realen Umgebungen als GPU verwendet werden
Ausführbare Aufgaben
- FuryGpu kann echte Spiele aus dieser Ära rendern
- Die Rendering-Leistung kann Bildraten über Echtzeit erreichen
1 Kommentare
Hacker-News-Kommentare
Um die häufigste Frage zu beantworten: Irgendwann will ich den gesamten Stack als Open Source veröffentlichen. Dazu gehören PCB-Schaltplan/Layout, sämtliches HDL, der Windows-WDDM-Treiber, der API-Runtime-Treiber und sogar Quake, das ich auf diese API portiert habe.
Allerdings muss ich noch rechtliche Fragen im Zusammenhang mit meiner Arbeit klären und Details wie die Lizenz festlegen. Es ist nicht mein Hauptjob, aber nah genug dran, dass ich vorsichtig sein muss.
Der erste Commit für dieses Projekt war am 22. August 2021; ich habe etwas mehr als zweieinhalb Jahre daran gearbeitet. Ich habe währenddessen keine Artikel geschrieben, aber in der YouTube-Playlist zu FuryGpu (https://www.youtube.com/playlist?list=PL4FPA1MeZF440A9CFfMJ7...) gibt es einige Videos, in denen man den Fortschritt grob nachvollziehen kann.
Die nächsten Blogposts werden sich mit dem PCIe-Interface befassen; daraus wird wohl eine mehrteilige Serie, die beim PCB-Schaltplan/Layout beginnt und über das FPGA-Design bis zum Windows-Treiber führt. Schon nach dem einen Artikel zur Texture Unit respektiere ich Leute noch mehr, die solche technischen Texte in regelmäßigem Rhythmus schreiben.
Ich wünsche mir sehnlichst etwas, das sich ähnlich einfach wie ein 6502 einstecken lässt, aber ein paar Register mehr und Features wie Hardware-Division hat – doch das ist wirklich keine Kleinigkeit.
Am Ende landet man wieder bei „einfach einen MCU nehmen und fertig“, und danach stößt man auf das Problem der Grafikerzeugung.
Da man mit diskreten Logikgattern nicht viel Hochgeschwindigkeitsverarbeitung machen kann, dachte ich, es wäre viel spannender zu lernen, was sich mit FPGAs machen lässt.
Bei Grafik kann man anfangs mit serieller Ausgabe beginnen. Das ist eine Art, das Problem zu abstrahieren, bis man bereit ist, es anzugehen. Wenn man einen Arduino maximal ausreizt, kann man daraus eine sehr einfache VGA-Grafikkarte machen [1]. ESP32 to VGA ist noch einfacher und bietet auch Tastatur und Maus [2].
[1] https://www.instructables.com/Arduino-Basic-PC-With-VGA-Outp...
[2] https://www.aliexpress.us/item/1005006222846299.html
Videoausgabe ist wegen der für die digitalen Ausgänge nötigen Bandbreite ein großes Problem. Mit Composite- oder VGA-Ausgabe könnte es noch mit leicht erhältlichen Chips machbar sein. Der neuere Commander X16 hat für dieses Problem ein FPGA gewählt.
Tatsächlich sehen vermutlich weniger als 100.000 Menschen die Videos bis zum Ende, und von denen probieren noch weniger selbst etwas aus. Für die heutige Zeit wirkt Hobby-Elektronik überraschend klein.
Beim Lesen wirkt es vor allem wie ein Hobbyprojekt aus Spaß, und offenbar will er künftig viel darüber schreiben, wie er es gebaut hat.
Besonders beeindruckend ist, dass der gesamte Stack funktioniert. Der Windows-Treiber implementiert eine Custom-Grafik-API, und darauf läuft Quake. Dass es keine DX/GL-Unterstützung gibt, ist schade, aber es ist gut nachvollziehbar, warum er den Weg über eine Custom API gewählt hat.
Ich frage mich, ob er das Design als Open Source veröffentlichen wird.
Es ist nicht einfach nur ein Problem von „Shadern“; allein der Window Manager des OS stellt ziemlich viele Anforderungen, damit er läuft. Die üblichen Akteure in diesem Bereich – also AMD, Nvidia, Intel, Imagination usw. – haben schrittweise auf Technologien aufgebaut, die sich über mehr als 20 Jahre entwickelt haben.
Im vergangenen Jahr habe ich an einer 2D-zentrierten GPU für Mikrocontroller mit starken I/O-Beschränkungen gearbeitet (https://github.com/KallDrexx/microgpu). Damit kann man Benutzeroberflächen auf großen Displays selbst über langsame SPI-Geräte rendern, und die Arbeit war sehr spannend
Als ich aber die Grenzen der Prozessor-Pipeline gesehen habe, dachte ich immer wieder, dass man das mit einem FPGA schneller machen könnte. Kürzlich habe ich ein paar günstige FPGAs besorgt und angefangen zu lernen, um den ESP32-basierten microgpu auf FPGA-Basis umzustellen
Wegen Kindern und begrenzter Freizeit weiß ich nicht, ob ich jemals auf dieses Niveau komme, aber ich würde gern wenigstens ein Hundertstel davon schaffen
Schon ein „einfaches“ 1080p-RGB-60-Hz-Signal erfordert Hochfrequenz-Signalverarbeitung, die allein mit reiner FPGA-Logik sehr schwer zu bewältigen ist
Es gibt kaum nennenswerte Open-Hardware-GPUs. Je nach Lizenz mag es anders aussehen, aber ich konnte keine Informationen finden, und das hier könnte der erste Fall und ein Ausgangspunkt für mehr Arbeit sein
https://github.com/asicguy/gplgpu
https://github.com/schlae/graphics-gremlin ist ein MDA/CGA-kompatibler Adapter
https://github.com/OmarMongy/VGA ist ein VGA-Core
https://github.com/archlabo/Frix ist ein vollständiger IBM-PC-kompatibler SoC inklusive VGA
Ich will einfach nur eine eigenständige M.2-GPU. Die Leistung darf modest sein, etwa auf dem Niveau integrierter GPUs wie Intel UHD Graphics, AMD Radeon oder Qualcomm Adreno
Ich habe eine Idee für ein kleines Embedded-Produkt, das viel Compute und Networking braucht, aber nur sehr wenig Grafikleistung. Der NXP Layerscape LX2160A [1] wäre fast perfekt gewesen, aber weil er keine integrierte GPU hat, musste ich ihn verwerfen. Ich brauche einfach nur eine kleine GPU
[1]: https://www.nxp.com/products/processors-and-microcontrollers...
Die Leistung kommt modernen integrierten GPUs bei Weitem nicht nahe. Integrierte GPUs können Systemspeicher, Cache und das Leistungsbudget vollständig nutzen, ein einfaches M.2-Gerät hat all das nicht. Selbst Low-End-PCIe-GPUs, also Single-Slot-Karten mit halber Länge/halber Bauhöhe, schaffen es kaum, gute integrierte GPUs zu übertreffen, und ergeben nur dann Sinn, wenn man unbedingt grundlegende Display-Funktionen braucht
Ebenfalls sehenswert ist das Vortex-Projekt der Georgia Tech [1]. Das wirkt wie ein Ansatz, der eher in die Zukunft blickt, statt die Fixed-Function-Vergangenheit des GPU-Designs zu wiederholen. Im Kern ist es ein hochgradig parallelisierter Computer auf RISC-V-Basis mit Erweiterungen, um GPU-Aufgaben besser zu bewältigen
Die Boards, auf denen es läuft, kosten Tausende Dollar und sind daher nicht gerade hobbyfreundlich, aber sie sind definitiv zugänglicher als geschlossene proprietäre Entwicklung. Vor ein paar Monaten gab es auch ein 2.0-Release
[1]: https://vortex.cc.gatech.edu/
Im Blog ist von einem Xilinx Kria SoM die Rede, aber wenn ich dem Link folge und mir die Modulspezifikationen ansehe, scheint dort ein ARM-SoC statt eines Xilinx-FPGA verbaut zu sein. Vielleicht übersehe ich etwas, weil ich mit der FPGA-Welt nicht vertraut bin
https://www.amd.com/en/products/system-on-modules/kria/k26/k...
Wie an anderer Stelle in diesem Thread gesagt: Das Kria SoM ist so aufgebaut, dass es FPGA-Fabric zusammen mit einem fest verdrahteten ARM-Core für die Steuerung enthält. Abgesehen davon, dass es damals verfügbar war und das Kria-Entwicklungsboard mit etwa 350 Dollar wirklich günstig war, enthalten diese Geräte Dinge wie fest verdrahtete DisplayPort-IP am ARM-Core, sodass Aufgaben wie Videoausgabe und Audio an die Firmware abgegeben werden können
Eine frühere Version dieses Projekts lief auf einem Zynq 7020; damals musste man die HDMI-bezogenen Teile selbst schreiben. Das ist nicht extrem kompliziert, belegt aber ziemlich viel Logik, und wenn man es konfigurierbar machen will, wird es deutlich komplexer
Wie im Blogbeitrag beschrieben, ist schon das Entwerfen und Bring-up eines FPGA-Boards eine hohe Hürde. Es wäre schön, wenn eines Tages Schaltpläne und Quellen veröffentlicht würden
[1] https://docs.amd.com/v/u/en-US/zynq-ultrascale-plus-product-...