- Il s’agit d’un processeur graphique sur mesure conçu intégralement du matériel jusqu’aux pilotes pour être utilisé comme un vrai GPU sur un PC moderne
- L’implémentation centrale repose sur un FPGA Xilinx Zynq UltraScale+, intégré sur un PCB personnalisé
- Il se connecte à l’ordinateur hôte en PCIe, ce qui en fait un véritable GPU matériel et non une simple expérimentation logicielle
- Les fonctionnalités prises en charge correspondent au niveau des cartes graphiques haut de gamme du milieu des années 1990, avec pour objectif le rendu des jeux de cette époque
- Il dispose même d’une pile de pilotes Windows moderne, permettant de rendre en temps réel de véritables jeux de cette période à une fréquence d’images supérieure au temps réel
Configuration matérielle
- FuryGpu est un GPU entièrement sur mesure conçu dès le départ pour être utilisé sur des ordinateurs modernes
- La logique de traitement graphique est implémentée sur un FPGA Xilinx Zynq UltraScale+
- Il est monté sur un PCB personnalisé et se connecte à l’ordinateur hôte via PCIe
Fonctionnalités graphiques et pilotes
- Les capacités matérielles prises en charge sont équivalentes à celles des cartes graphiques haut de gamme du milieu des années 1990
- Une pile de pilotes logiciels Windows moderne est également fournie, ce qui permet de l’utiliser comme GPU dans un environnement réel
Tâches réalisables
- FuryGpu peut assurer le rendu de véritables jeux de cette époque
- Les performances de rendu peuvent atteindre une fréquence d’images supérieure au temps réel
1 commentaires
Avis de Hacker News
Pour répondre à la question qu’on me pose le plus souvent : j’ai bien l’intention de publier un jour toute la stack en open source. Cela inclut le schéma/PCB, tout le HDL, le pilote Windows WDDM, le pilote runtime de l’API, et même Quake porté pour utiliser cette API.
Je dois toutefois régler des questions juridiques liées à mon emploi, et décider de détails comme la licence. Ce n’est pas mon activité principale, mais c’est suffisamment proche pour que je doive être prudent.
Le premier commit de ce projet date du 22 août 2021, et j’y travaille depuis un peu plus de deux ans et demi. Je n’ai pas écrit d’articles pendant le processus, mais il y a pas mal de vidéos dans la playlist YouTube FuryGpu (https://www.youtube.com/playlist?list=PL4FPA1MeZF440A9CFfMJ7...) qui donnent une idée générale de l’avancement.
Les prochains billets de blog porteront sur l’interface PCIe et devraient former une série en plusieurs parties, en commençant par le schéma/le layout du PCB, puis la conception FPGA, jusqu’au pilote Windows. Rien que le fait d’avoir écrit l’article sur la Texture Unit m’a donné encore plus de respect pour les personnes qui publient régulièrement ce genre d’articles techniques.
J’aimerais énormément quelque chose d’aussi facile à enficher et utiliser qu’un 6502, mais avec quelques registres en plus et des fonctions comme la division matérielle ; seulement, c’est vraiment loin d’être trivial.
Au final, on revient à « autant utiliser un MCU et basta », puis on se heurte au problème de la génération graphique.
Comme il est difficile de faire beaucoup de traitements rapides uniquement avec des portes logiques discrètes, je me suis dit qu’apprendre ce qu’on pouvait faire avec un FPGA serait bien plus intéressant.
Pour les graphismes, on peut commencer avec une sortie série. C’est une façon de garder le problème abstrait jusqu’à être prêt à s’en occuper. En poussant un Arduino au maximum, on peut en faire une carte graphique VGA très basique [1]. ESP32 to VGA est encore plus simple et fournit aussi clavier et souris [2].
[1] https://www.instructables.com/Arduino-Basic-PC-With-VGA-Outp...
[2] https://www.aliexpress.us/item/1005006222846299.html
La sortie vidéo est un gros problème à cause de la bande passante requise sur les sorties numériques. Une sortie composite ou VGA peut encore être possible avec des puces faciles à trouver. Le récent Commander X16 a choisi un FPGA pour résoudre ce problème.
En pratique, j’imagine que moins de 100 000 personnes regardent réellement les vidéos jusqu’au bout, et que celles qui essayent ensuite de faire quelque chose elles-mêmes sont encore moins nombreuses. À l’époque actuelle, l’électronique amateur paraît étonnamment petite.
À la lecture, cela semble avant tout être un projet hobby fait pour le plaisir, et il prévoit manifestement d’écrire beaucoup d’articles sur la façon dont il l’a construit.
Ce qui m’impressionne surtout, c’est que toute la stack fonctionne. Le pilote Windows implémente une API graphique custom, et Quake tourne par-dessus. C’est dommage qu’il n’y ait pas de prise en charge DX/GL, mais on comprend très bien pourquoi il a choisi la voie d’une API custom.
Je me demande s’il publiera la conception en open source.
Le problème ne se limite pas aux « shaders » : rien que le gestionnaire de fenêtres de l’OS a déjà beaucoup d’exigences pour fonctionner. Les acteurs habituels de ce domaine — AMD, Nvidia, Intel, Imagination, etc. — ont construit tout cela progressivement sur plus de vingt ans d’évolution technologique.
Depuis un an, je travaille sur un GPU centré sur la 2D pour microcontrôleurs avec de fortes contraintes d’E/S (https://github.com/KallDrexx/microgpu). Je l’ai conçu pour permettre de rendre des interfaces utilisateur sur de grands écrans, même avec des périphériques SPI lents, et le travail a été très intéressant
Mais en voyant les limites du pipeline du processeur, je me suis dit qu’avec un FPGA on pourrait aller plus vite. J’ai récemment récupéré quelques FPGA bon marché et commencé à apprendre pour essayer de remplacer le microgpu basé sur ESP32 par une version basée sur FPGA
Avec les enfants et le manque de temps libre, je ne sais pas si j’arriverai à ce niveau, mais j’aimerais en faire ne serait-ce qu’un centième
Même un signal RGB 1080p 60 Hz « basique » exige un traitement de signaux à haute fréquence très difficile à gérer uniquement avec la logique FPGA pure
Il existe très peu de GPU open hardware dignes de ce nom. Selon la licence, je n’ai pas trouvé d’informations, et cela pourrait être un premier exemple ainsi qu’un point de départ pour davantage de travaux
https://github.com/asicguy/gplgpu
https://github.com/schlae/graphics-gremlin est un adaptateur compatible MDA/CGA
https://github.com/OmarMongy/VGA est un cœur VGA
https://github.com/archlabo/Frix est un SoC complet compatible IBM PC, incluant du VGA
Tout ce que je veux, c’est un GPU M.2 autonome. Les performances peuvent être modestes, du niveau d’un GPU intégré comme Intel UHD Graphics, AMD Radeon ou Qualcomm Adreno
J’ai une idée de petit produit embarqué qui a besoin de beaucoup de calcul et de réseau, mais de très peu de capacités graphiques. Le NXP Layerscape LX2160A [1] aurait été presque parfait, mais j’ai dû l’écarter faute de GPU intégré. J’ai juste besoin d’un petit GPU
[1]: https://www.nxp.com/products/processors-and-microcontrollers...
Les performances sont très loin de celles des GPU intégrés modernes. Un GPU intégré peut exploiter la mémoire système, le cache et le budget énergétique, alors qu’un simple périphérique M.2 ne le peut pas. Même un GPU PCIe bas de gamme, c’est-à-dire une carte simple slot demi-longueur/demi-hauteur, aura du mal à dépasser un bon GPU intégré, et n’a vraiment de sens que lorsqu’une fonction d’affichage de base est indispensable
À regarder aussi, il y a le projet Vortex de Georgia Tech [1]. L’approche semble regarder vers l’avenir plutôt que répéter le passé des GPU à fonctions fixes. Le cœur est un ordinateur hautement parallélisé basé sur RISC-V, avec des extensions pour mieux gérer les tâches GPU
Les cartes d’exécution coûtent plusieurs milliers de dollars, donc ce n’est pas très accueillant pour les amateurs, mais c’est clairement plus accessible qu’un développement propriétaire fermé. La version 2.0 est aussi sortie il y a quelques mois
[1]: https://vortex.cc.gatech.edu/
Le blog parle d’un Xilinx Kria SoM, mais quand je suis le lien vers les spécifications du module, on dirait qu’il contient un SoC ARM plutôt qu’un FPGA Xilinx. Je ne connais pas bien le monde des FPGA, donc je rate peut-être quelque chose
https://www.amd.com/en/products/system-on-modules/kria/k26/k...
Comme indiqué ailleurs dans ce fil, le Kria SoM combine une matrice FPGA et un cœur ARM matériel chargé du contrôle. Outre le fait qu’il était disponible à l’époque et que la carte de développement Kria était vraiment peu chère, autour de 350 dollars, ces dispositifs incluent des éléments comme une IP DisplayPort matérielle reliée au cœur ARM, ce qui permet de déléguer au firmware des tâches comme la sortie vidéo et l’audio
La version précédente de ce projet tournait sur un Zynq 7020, et il fallait alors écrire soi-même les parties liées au HDMI. Ce n’est pas extrêmement complexe, mais cela consomme pas mal de logique, et cela devient beaucoup plus compliqué si l’on veut le rendre configurable
Comme le montre l’article de blog, concevoir une carte FPGA et la bring-up représente déjà une barrière élevée. J’espère qu’un jour les schémas et le code source seront publiés
[1] https://docs.amd.com/v/u/en-US/zynq-ultrascale-plus-product-...