Si j'ai plusieurs textures (disons 5+ cartes) liées à la même unité de texture, cela fonctionne-t-il moins bien pour le cache que si je n'avais que 2 ou 3 textures?
Si j'ai plusieurs textures (disons 5+ cartes) liées à la même unité de texture, cela fonctionne-t-il moins bien pour le cache que si je n'avais que 2 ou 3 textures?
Réponses:
Pour ajouter à la réponse d' imallett , il est vrai que l'augmentation du nombre d'accès à différentes données de texture dans un shader augmentera la pression sur le (s) cache (s) GPU, mais plusieurs autres facteurs peuvent influencer considérablement l'effet. C'est aussi peut-être compliqué par le fait que, comme les caches CPU, il peut y avoir plusieurs couches de cache dans un GPU, c'est-à-dire. Unité de texture <= L0 <= L1 <= .. Mémoire
Si vous avez une scène qui a une minification des données de texture, que ce soit en raison de la perspective ou d'une simple mise à l'échelle et que vous n'utilisez pas le mappage MIP, vous obtiendrez un alias. Cela ne va pas seulement produire des artefacts visuels; il est très probable qu'il s'agisse d'un problème de performances.
Dès que vous obtenez un alias, les accès d'adresse à la texture deviendront incohérents, ce qui non seulement finira par détruire les caches, mais introduira également de nombreux sauts de page DRAM (plus précisément, les sauts de ligne) qui peuvent être coûteux. Le mappage MIP permet de réduire l'incohérence.
Peut-être un peu une option évidente, mais si vous pouvez utiliser la compression de texture (par exemple DXTn | ETC * | PVRTC * | etc) en ciblant de 8bpp à, disons, 2bpp, vous pouvez augmenter considérablement l'efficacité de la bande passante / cache mémoire en facteurs de 4x à 16x. Maintenant, je ne peux pas parler pour tous les GPU, mais certains schémas de compression de texture (par exemple ceux énumérés ci-dessus) sont si simples à décoder dans le matériel, que les données pourraient rester compressées dans toute la hiérarchie du cache et être décompressées uniquement dans l'unité de texture, donc multiplier efficacement la taille de ces caches.
De toute évidence, certaines données, par exemple les cibles de rendu utilisées comme données de texture dans les rendus suivants, ne peuvent pas utiliser la compression de texture. Chaque fois que vous le pouvez, utilisez le plus petit format de pixels qui fera le travail, c'est-à-dire que si 32 / 16bpp (A) RGB le fera, n'utilisez pas de formats flottants 4x32!
Ceci est quelque peu lié à l'exemple d'alias ci-dessus, mais nous avons vu des cas où de grandes cibles de rendu sont créées, mais seulement très peu échantillonnées. Les lignes de cache, que ce soit dans les processeurs ou les GPU, sont assez longues, donc si vous n'utilisez qu'un pixel dans chaque ligne de cache, vous perdrez des transferts.
En outre, les textures compressées WRT permettent d'obtenir une compression en partageant efficacement les données entre une région locale de texels. Si vous ne disposez pas d'un accès cohérent, à part la réduction de l'empreinte mémoire, la compression n'aidera probablement pas.
Ce n'est pas vraiment un problème de cache (enfin, à moins que les accès calculés soient assez incohérents), mais les accès aux textures qui ne sont pas directement définis par les coordonnées UV fournies avec les sommets peuvent être plus lents que ceux qui sont directement définis.
Bien que je soupçonne que la plupart des textures de nos jours seront stockées dans un ordre en mosaïque ou semblable à Morton (aka Twiddled / Swizzled) (ou même une combinaison des deux), certaines textures peuvent toujours être dans l'ordre de la ligne de balayage, ce qui signifie que la rotation de la texture est susceptible d'entraîner un nombre important de ratés de cache / sauts de page. Malheureusement, je ne sais pas vraiment comment repérer si un format particulier est organisé de cette manière.
(Pour une lecture de fond, essayez Blinn's The Truth About Texture Mapping . FWIW, en prenant quelques étapes supplémentaires, vous avez utilisé des textures d'ordre Twiddled (c'est-à-dire ordre Morton) dans au moins certains des premiers PC ).
La réponse dépend de ce que vous voulez dire. Le matériel moderne (par exemple avec des textures sans reliure) ne se soucie pas vraiment du nombre de textures "liées". La vraie question est de savoir combien vous en utilisez .
Les textures stockent généralement les données d'une manière compatible avec le cache (une courbe de Morton, je crois). Si vous utilisez plus de textures, vous obtiendrez plus de ratés de cache, car maintenant les textures se font concurrence pour l'espace.
Cela se résume vraiment à l'ancienne heuristique de programmation de shader bien connue: les tapotements de texture sont lents; n'en utilisez pas trop.