Les GPU modernes ont de nombreuses unités d'ombrage parallèles. Je voudrais savoir comment le cache de texture est géré dans ce scénario.
Au niveau supérieur, un GPU est subdivisé en un certain nombre de cœurs de shader. Un petit GPU dans un ordinateur portable ou une tablette peut n'avoir que quelques cœurs tandis qu'un GPU de bureau haut de gamme peut en avoir des dizaines.
En plus des noyaux de shader, il existe également des unités de texture. Ils peuvent être regroupés avec une unité de texture par noyau de shader ou une unité de texture partagée entre deux ou trois noyaux de shader, selon le GPU.
La puce entière partage un seul cache L2, mais les différentes unités auront des caches L1 individuels. Les unités de texture ont des caches de texture, et les unités de shader ont des caches pour les instructions et les constantes / uniformes, et peut-être un cache séparé pour les données de tampon selon que les charges de tampon sont un chemin distinct des charges de texture ou non (varie selon l'architecture du GPU).
Les unités de texture fonctionnent indépendamment et de manière asynchrone à partir des noyaux de shader. Lorsqu'un shader effectue une lecture de texture, il envoie une requête à l'unité de texture via un petit bus entre eux; le shader peut ensuite continuer à s'exécuter si possible, ou il peut être suspendu et permettre à d'autres threads de shader de s'exécuter pendant qu'il attend la fin de la lecture de la texture.
L'unité de texture regroupe un tas de demandes et effectue les calculs d'adressage sur celles-ci - sélection des niveaux de mip et de l'anisotropie, conversion des UV en coordonnées texels, application des modes de serrage / enroulement, etc. Une fois qu'elle sait de quels texels elle a besoin, elle les lit à travers le la hiérarchie du cache, de la même façon que la mémoire fonctionne sur un CPU (regardez d'abord dans L1, sinon là, puis L2, puis DRAM). Si de nombreuses requêtes de texture en attente veulent toutes le même texel ou des texels proches (comme elles le font souvent), vous obtenez ici beaucoup d'efficacité, car vous pouvez satisfaire de nombreuses requêtes en attente avec seulement quelques transactions en mémoire. Toutes ces opérations sont redirigées, donc pendant que l'unité de texture attend de la mémoire sur un lot, elle peut effectuer les calculs d'adressage pour un autre lot de demandes, etc.
Une fois les données récupérées, l'unité de texture décode les formats compressés, effectue la conversion sRGB et le filtrage si nécessaire, puis renvoie les résultats au noyau du shader.