Des unités remaniées : Vertex Shader

Cette spécificité est particulièrement importante pour les GeForce 6 & 7 car, dans le cas de branchements dynamiques, les sommets peuvent prendre des branches divergentes. Grâce à leur architecture et à la présence d’une unité dédiée au traitement des branchements, leur coût est donc particulièrement faible (2 cycles).
D’un point de vue puissance de calcul, chaque unité de vertex dispose d’une unité vectorielle travaillant sur 4 flottants simple précision et capable d’effectuer une instruction MAD (multiply-add fusionnés) par cycle. Notons également la présence d’une unité scalaire capable d’effectuer une instruction complexe par cycle (calcul d’exponentiel et d’inverse). NVIDIA indique d’ailleurs une amélioration de performance de cette unité scalaire de l’ordre de 20 à 30 % par rapport à celle du NV40.
Il est bien évidemment toujours possible d’échantillonner une texture dans un vertex shader et selon NVIDIA les performances auraient été améliorées par rapport au NV40. Dans quelle proportion ? Mystère pour l’instant, il faudra mener quelques tests pour y répondre mais il s’agissait d’un des principaux points faibles du NV40. En effet les textures étant utilisées depuis longtemps dans les Pixel Shaders pour un coût minime, on a tendance à oublier que chaque échantillonnage de textures a une latence importante vu qu’il nécessite un accès à la mémoire. Dans le cas des Pixel Shaders ce n’est pas bien grave, le grand nombre de pixels en cours de traitement à un instant donné permet de masquer cette latence en passant à un autre groupe de pixels dés que le traitement est bloqué par un accès mémoire. Mais dans le cas des Vertex Shaders les choses se compliquent vu que ces unités sont beaucoup moins adaptées, de part leur conception même, à masquer de longues latences.

De plus comme le montre le schéma de la page suivante les Vertex Shaders partagent le texture cache avec les Pixel Shaders, cache configuré pour être particulièrement optimal dans le cadre d’accès cohérents ce qui est le cas avec les Pixel Shaders mais pas forcément avec les Vertex Shaders. La latence d’un accès à une texture dans un Vertex Shader étant à peu prés équivalente à l’exécution d’une vingtaine d’instructions, NVIDIA conseillait donc aux programmeurs de masquer eux-mêmes la latence d’accès aux textures en insérant autant d’instructions arithmétiques que possible entre l’échantillonnage de texture et la première instruction utilisant le résultat de celui-ci. Même si les choses ont été améliorées à ce niveau il y a donc quand même de fortes chances pour que l’accès à une texture dans un Vertex Shader reste suffisamment coûteux cette génération.