Comment fonctionne le cache de texture en considérant plusieurs unités de shader

11

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.

Felipe Lira
la source

Réponses:

14

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.

Nathan Reed
la source
1
Merci! C'était vraiment utile. Regading des constantes / cache uniforme. Y a-t-il des conseils en plus de la précision (mediump, lowp) que je pourrais utiliser pour améliorer le taux de réussite du cache des uniformes? L'ordre dans lequel je déclare les uniformes fait-il une différence (comme pour un emballage plus serré)?
Felipe Lira
2
@PhilLira Packing peut faire la différence, oui. Le compilateur insérera un remplissage pour empêcher les vecteurs d'être divisés sur des limites de 16 octets, essayez donc d'éviter cela. Je ne pense pas que mediump / lowp fasse quoi que ce soit sur les uniformes, du moins sur les GPU de bureau (peut-être le fait sur mobile). Je ne m'inquiéterais pas trop du taux de réussite du cache uniforme. C'est extrêmement rarement, voire jamais, un goulot d'étranglement.
Nathan Reed