Cela fait deux ans que la concurrence a présenté sa dernière proposition. Si vous avez lu l'article en question et commencez juste à lire celui-ci, je suppose que vous attendez toujours pour 'le truc' qui rend la PS2 aussi puissante qu'elle le semblait alors. À présent, laissez-moi vous présenter un ensemble très important de composants que Sony a placé dans l'Emotion Engine, les Vector Processing Units, ou 'VPU'.
Architecture
Un Vector Processing Unit est un petit processeur indépendant conçu pour traiter des vecteurs, en particulier des vecteurs de quatre float. Ces processeurs sont si rapides qu'ils n'effectuent qu'un cycle par opération, ce qui peut être extrêmement pratique pour le calcul géométrique. Bien qu'ils exposent un comportement non standardisé similaire au FPU du processeur.
Les VPUs comportent les composants suivants :
- De la Vector Unit Memory, ou'VU Mem' : utilisée comme espace de travail pour l'unité vectorielle. Elle stocke les valeurs devant être traitées et/ou les résultats des calculs précédents.
- Une Vector Unit : le cœur du processeur. Elle contient de la mémoire (intitulée Micro Mémoire) pour stocker un programme (appelé Microprogramme) indiquant à l'unité comment traiter les données stockées dans la 'VU Mem'.
- Elle met en œuvre un jeu d'instructions 64 bits et l'unité d'exécution est séparée en deux sous-unités parallèles. La première multiplie ou ajoute des flottants, alors que l'autre divise des flottants ou traite des entiers. Cela permet de traiter simultanément à la fois des flottants et des entiers.
- Une Vector Interface : décompresse automatiquement les données vectorielles en provenance de la mémoire principale, dans un format que l'unité vectorielle peut exploiter. Cette unité peut aussi transférer des microprogrammes vers la Micro Mémoire.
Fonctionnalités
Pour pouvoir fonctionner, l'unité vectorielle nécessite d'être 'démarrée'. Pour ce faire, le processeur principal est chargé de fournir le microcode.
Il y a deux VPUs intégrées à l'Emotion Engine, mais elles sont organisées différemment, laissant place à différentes utilisations et optimisations.
Vector Processing Unit 0
La première VPU, intitulée VPU0, est placée entre le processeur et l'autre unité vectorielle (VPU1). Elle est là pour 'assister' le processeur principal.
La VPU0 a deux modes de fonctionnement :
- Micromode : c'est le 'mode traditionnel'. La VPU exécute indépendamment des 'micro-instructions' d'un microprogramme stocké dans la Micro Mémoire.
- Macromode : La VPU0 devient le 'COP2' du processeur principal et exécute des 'macro-instructions', reçues depuis le processeur principal via un bus 128 bits dédié.
- Les macro-instructions ont les mêmes fonctionnalités que les micro-instructions mais utilisent des codes opération différents. Néanmoins, l'unité d'exécution VPU n'est plus scindée (ce qui signifie qu'elle ne peut exécuter qu'une instruction à la fois).
- Bien que ce mode n'exploite pas entièrement tous les composants de la VPU0, il accélère malgré tout les opérations vectorielles du processeur. En outre, en termes de simplicité, un coprocesseur est plus facile à programmer qu'une unité indépendante (c'est quelque chose que les programmeurs de PC apprécieront).
Le mappage mémoire de la VPU0 donne également accès à certains des registres et flags de l'autre VPU, vraisemblablement pour vérifier son état ou récupérer rapidement les résultats d'opérations qu'elle a réalisées.
Vector Processing Unit 1
La deuxième VPU disponible, VPU1, est une version améliorée de la VPU1 avec quatre fois sa quantité de Micro Mémoire et VU Memory. En outre, cette unité comporte un composant additionnel intitulé Elementary function unit, ou 'EFU', qui accélère l'exécution des fonctions exponentielles et trigonométriques.
La VPU1 est située entre la VPU0 et la Graphics Interface (le 'portail' vers la GPU), elle comporte donc des bus additionnels pour fournir la géométrie au GPU aussi vite que possible sans utiliser le bus principal.
D'autre part, et du fait de son emplacement, la VPU1 fonctionnement uniquement en Micromode.
Il est évident que cette VPU a été conçue pour les calculs trigonométriques, et pourrait servir de préprocesseur pour la GPU. Ainsi, elle est souvent chargée de fournir les fameuses Display Lists.
Des mondes infinis
Une approche utile qui peut être exploitée avec ces unités est la génération procédurale. En d'autres termes, au lieu de construire un niveau en utilisant de la géométrie définie en amont, laissez les VPUs la générer en utilisant des algorithmes. Dans ce cas, la VPU exécute des fonctions mathématiques produisant de la géométrie qui sera ensuite interprétée par le GPU (des triangles, lignes, quadrilatères, etc) et finalement utilisée pour rendre la scène.
En comparaison avec les données explicites, le contenu procédural est idéal pour les tâches parallélisées ; cela libère de la bande passante, requiert très peu d'espace de stockage, et est dynamique (les programmeurs peuvent définir des paramètres pour obtenir des résultats différents) . De nombreuses disciplines peuvent hautement tirer parti de cette technique :
- Les surfaces complexes (par exemple, les sphères et tores).
- Le world rendering (le terrain, les particules, les arbres).
- Courbes de Bézier, une équation très populaire en imagerie numérique, utilisée pour tracer des courbes. Elles sont transformées en une surface de Bézier (géométrie explicite) et permettent différents degrés de précision en fonction du niveau de détail requis.
D'un autre côté, le contenu procédural peut être difficile à animer et, si l'algorithme est trop complexe, la VPU pourrait ne pas générer la géométrie à temps.
Pour résumer, le rendu procédural n'est pas une technique nouvelle, mais grâce aux VPUs, il ouvre la porte à des optimisations plus poussées et des visuels plus riches. Néanmoins, ce n'est pas une technique simple à implémenter, et la R&D de Sony a publié divers documents décrivant des approches différentes pour l'utiliser sur leur console .
Vous choisissez le workflow
Avec ces ajouts, les programmeurs ont maintenant une grande flexibilité pour concevoir leurs moteurs graphiques. Pour aller en ce sens, Sony a mobilisé des ressources supplémentaires pour imaginer et documenter des designs de pipeline efficaces. Les exemples suivants illustrent des pipelines graphiques optimisés pour différentes tâches :

Design d'un pipeline parallèle.
Dans le premier exemple, le design Parallèle, le processeur est combiné avec la VPU0 en macromode pour produire de la géométrie en parallèle avec la VPU1. Le groupe CPU/VPU0 utilise pleinement la Scratchpad et le cache pour éviter d'utiliser le bus principal, sur lequel la VPU1 se repose pour récupérer des données depuis la mémoire principale. A la fin, les deux groupes de rendu envoient simultanément leur Display Lists respectives au GPU.
Le second exemple, le design en Série, propose une approche différente où le groupe CPU/VPU0 travaille en tant que préprocesseur pour la VPU1. La première étape consiste à récupérer et traiter la géométrie que la VP1 va ensuite transformer en Display List.
Il s'agissait jusqu'ici d'exemples d'un point de vue théorique, mais pour expliquer une implémentation plus 'pratique', je vais faire référence à une vidéo que Jon Burton a publié au sujet du développement d'un jeu PS2 .

Crash Bandicoot: The Wrath of Cortex (2001). Les particules forment la flamme de la bougie et la lumière vient de la fenêtre vitrée.
L'ancien directeur de Traveller's Tales a expliqué comment son équipe a conçu un système de particules totalement contenu dans la VPU1. En résumé, la VPU1 était concentrée sur la lecture d'une base de données préremplie sur sa mémoire VU. Cette base de données était utilisée pour calculer les coordonnées des particules à n'importe quel instant sans dépendre sur d'autres composants. Le résultat du calcul pouvait être transformé en Display Lists et envoyé aussitôt.
Avec cette approche, le processeur principal était considérablement allégé, lui permettant de prendre en charge d'autres tâches comme l'IA et la physique.
Il y a de nombreux autres exemples de disponibles, mais pour résumer : c'est désormais au programmeur de trouver une configuration optimale, et cela est une bonne chose.


