Dans le contexte: Apple garde le fonctionnement interne de la famille de processeurs M1 secret du public, mais des développeurs dédiés l’ont rétro-ingénierie pour créer des pilotes open source et une distribution Linux, Asahi Linux, pour les Mac M1. Au cours du processus, ils ont découvert des fonctionnalités intéressantes.
Dans ses efforts pour développer un pilote graphique open source pour le M1, Alyssa Rosenzweig a récemment trouvé une bizarrerie dans le pipeline de rendu du GPU du M1. Elle rendait des géométries 3D de plus en plus compliquées et est finalement arrivée à un lapin qui a fait sortir le bogue du GPU.
Fondamentalement – et veuillez noter que ceci et tout ce que je suis sur le point de dire est une simplification excessive – le problème commence par le faible accès du GPU à la mémoire. C’est un GPU puissant, mais comme le SoC de l’iPhone de la série A avec lequel il partage un ancêtre, il faut des raccourcis pour préserver l’efficacité.
Au lieu de rendre directement dans le framebuffer comme le ferait un GPU discret, le M1 prend deux passes d’une image : la première trouve les sommets, et la seconde fait tout le reste. De toute évidence, la deuxième passe est beaucoup plus intensive, donc entre les passes, le matériel dédié segmente le cadre en tuiles (mini-frames, essentiellement) et la deuxième passe est prise une tuile à la fois.
La mosaïque résout le problème de ne pas avoir suffisamment de ressources mémoire, mais pour pouvoir reconstituer les tuiles dans un cadre plus tard, le GPU doit conserver une mémoire tampon de toutes les données par sommet. Rosenzweig a constaté que chaque fois que ce tampon débordait, le rendu ne fonctionnait pas. Voir le premier lapin, ci-dessus.
Dans l’une des présentations d’Apple, il est expliqué que lorsque le tampon est plein, le GPU produit un rendu partiel – c’est-à-dire la moitié du lapin. Dans le logiciel d’Apple, le tampon en question s’appelle le tampon de paramètresun nom apparemment tiré de la documentation PowerVR d’Imagination.
Imagination est une société basée au Royaume-Uni qui, comme Arm, conçoit des processeurs qu’elle octroie sous licence à d’autres sociétés. Apple a signé un accord avec la société au début de 2020 qui permet à Apple de concéder sous licence une large gamme de sa propriété intellectuelle. Il est clair que le M1, qui a été mis sur le marché fin 2020, utilise son architecture GPU PowerVR comme une sorte de base pour son GPU.
Quoi qu’il en soit, revenons au lapin. Comme vous l’avez peut-être deviné, les rendus partiels peuvent être additionnés pour créer un rendu du lapin entier (mais avec une douzaine d’étapes supplémentaires entre les deux, bien sûr).
Mais ce rendu toujours n’est pas tout à fait juste. Vous pouvez voir des artefacts sur le pied du lapin. Il s’avère que c’est parce que différentes parties du cadre sont divisées entre un tampon de couleur et un tampon de profondeur, et ce dernier se comporte mal lorsqu’il est chargé avec des rendus partiels.
Une configuration rétro-conçue du pilote d’Apple résout le problème, puis vous pouvez enfin rendre le lapin (ci-dessous).
Il n’y a pas que le pilote graphique open source de Rosenzweig pour le M1 qui saute à travers tous ces cerceaux pour rendre une image : c’est ainsi que fonctionne le GPU. Son architecture n’a probablement pas été conçue avec le rendu 3D à l’esprit, mais malgré cela, Apple en a fait quelque chose qui peut rivaliser avec les derniers GPU discrets, voire les surpasser, comme le prétend Apple. C’est cool.
Pour une explication plus approfondie (et techniquement précise) du rendu du lapin et pour d’autres explorations du M1, assurez-vous de consulter Le blog de Rosenzweig et le Asahi-Linux site Internet.
Crédit d’en-tête : Maçonnerie