totosssfr a écrit :
J'arrive sûrement après la bataille mais je me risque quand même à poster mon pavé.
j'espère que j'ai pas raconté trop de conneries.
est ce que quelque part on parle de ne pas exploiter les 3 cores? Il me semble que non. <Mode gros Pavé = On>
Aparté sur les processeurs next gen:
Programmation multi-thread
Je ne peux peux rentrer dans les détails (j'ai pas le niveau pour ) mais il me semble qu'il n'existe que deux façons (en gros ) d'augmenter l'efficacité d'un programme mono-thread sur une architecture multi-thread:
-soit on réparti l'ensemble des données à traiter en groupes. Ces groupes sont assignés à un core qui effectue les traitements dessus. Avec un processeur tri-core, on peut donc espèrer un gain de +200% par rapport à un processeur single-core. Par exemple, on dispose d'une liste (p1, p2, p3 ... p9) de prix hors taxes et on veut obtenir le prix TTC. Pour cela, on dispose des 3 cores C1, C2, C3. Il suffit de faire des paquets de 3 et de les assigner à chaque core:
- 1.196*(p1, p2, p3) sur C1
- 1.196*(p4, p5, p6) sur C2
- 1.196*(p7, p8, p9) sur C3
- soit on décompose un traitement en plusieurs taches qui vont être effectuées sur chacun des cores. Par exemple, on veut obtenir le résultat de l'addition suivante : (1+2)*(3+4)*(5+6) et on dispose des 3 cores C1, C2, C3, on peut décomposer l'opération de cette manière :
- 1+2 sur C1
- 3+4 sur C2
- 5+6 sur C3
- puis la multiplication des 3 résultats précédents par C1
On conçoit bien que les opérations simples que j'ai énoncées à l'instant sont facilement parallélisables (les données ou les opérations à traiter sont indépendantes) . Dans un jeu vidéo, c'est beaucoup plus complexe. En effet, les algorithmes utilisés nécessitent de disposer de l'ensemble des données avant de commencer leurs exécution. Il faut donc effectuer chaque tâche à la queueleuleu. Très schématiquement, je dirais que ça se passe dans cet ordre:
- récupérer les infos transmises par les périphériques d'entrée
- calculer le "comportement" du jeu (IA des ennemis, calculs physiques tels que les trajectoires et les déplacements)
- calculer le monde et les sons.
Réussir à paralléliser un jeu vidéo est un véritable tour de force car, à ma connaissance (limitée, je suis pas développeur de jeu), il n'y a pas grand chose qui puissent se faire en parallèle à part au niveau graphique.
XENON versus Processeur PC
Carmack a dit récemment ici:
Citation :
"The difference between theoretical performance and real-world performance on the CPU level is growing fast. On, say, a regular Xbox, you can get very large fractions of theoretical performance with not a whole lot of effort. The PlayStation 2 was always a mess with the multiple processors on there, but the new generations, with Cell or the Xbox 360, make it much, much worse. They can quote these incredibly high numbers of giga-flops or tera-flops or whatever, but in reality, when you do a straightforward development process on them, theyre significantly slower than a modern high-end PC."
|
En gros, les processeurs des consoles Nextgen ont beau être théoriquement plus performants que les processeurs PC actuels, dans le cadre du développement d'un jeu, les processeurs PC conservent le leadership. On sait depuis un moment que la programmation multi thread est un véritable casse tête pour les développeurs (de jeux) et à mon avis, ça ne va pas s'améliorer.
Pour résumer, programmer pour le processeur d'une xboite 360, c'est très loin d'être aussi "facile" que de programmer pour un processeur PC. Personnellement, je trouve que les processeurs pour console next gen ne sont pas adaptés à la tâche qui leur incombe. Ce sont des processeurs Low Cost où on a privilégié le rapport puissance théorique/taille du die au lieu d'aller chercher la sophistication qu'on peut trouver sur les processeurs PC. Le Xenon est un processeur tri-core sans mécanisme d'ordonnancement des tâches ("In-Order" processor).Ce qui veut dire que les tâches sont exécutées dans l'ordre où elles arrivent et donc c'est le programmeur du jeu (et son ami de presque-toujours, le compilateur) qui doit se démerder pour trouver 6 threads pour nourir les trois cores poussifs. Sur un PC, le processeur dispose d'un ordonnanceur qui travaille sur les instructions stockées dans ce qu'on appelle la fenêtre d'exécution. cet ordonnanceur est capable (tout seul comme un grand ) d'extraire les instructions qui sont exécutables parallèlement. On parle de Parallélisme au niveau Instruction (ILP: instruction level parallelism) en opposition au parallélisme au niveau Processus (TLP: Thread Level Parallelism). Pour cela, le processeur va choisir de traiter en même temps plusieurs instructions parmi toutes celles qu'il a reçu. On parle de traitement "Out of Order" littéralement : dans le désordre. Par exemple, on a trois opérations à traiter: (1)- 1+2=C
(2)- C+54=G
(3)- 3*5=F
Les opérations sont reçue par le processeur dans cet ordre.
Xenon : traitement des opérations "In Order", pas de question à se poser : on traite les 3 opérations à la suite dans l'ordre où elles arrivent. Athlon : l'ordonnanceur détecte que (1) et (3) sont deux opérations indépendantes mais que (1) et (2) sont liées ( (2) attends le résultat de (1) pour pouvoir effectuer son opération). L'ordonnanceur décide donc de traiter (1) et (3) en même temps et donc (3) est traitée avant (2) d'où l'expression "Out Of Order". Il existe d'autres cas pour lesquels l'ordonnanceur change l'ordre d'exécution des instructions. Mais ils n'est pas utile de les connaître dans cette discussion.
L'ILP n'est efficace que sur des processeurs qui disposent de nombreuses unités de calculs. c'est pour ça qu'un athlon qui possède 3 ALU et 3 FPU profite pleinement de son ordonnanceur de sa fenêtre d'exécution très large (plus la fenêtre est large plus on peut extraire d'ILP). Par opposition, on constate que le Xenon ne dispose que d'une ALU et une FPU. Microsoft a clairement préféré avoir 3 cores "poussifs" (nombre peu élevé d'unités de calculs, pas d'ordonnanceur) qu'un gros core comme sur PC.
remarque : le fait que le Xenon ne dispose pas d'ordonnanceur est je pense un corollaire du fait que chaque core ne dispose pas de beaucoup d'unités de calcul. En effet, à quoi servirai un ordonnanceur s'il ne peut lancer qu'un calcul à la fois (c'est pas tout à fait comme ça pour le xenon mais bon l'idée est là)
XENON, un processeur qu'il est pas si mal?
Heureusement pour les développeurs de jeu, Microsoft n'est pas forcément tombé sur la tête en choisissant son Xenon. Car chaque core du xenon dispose, on le sait, d'une FPU et d'une ALU mais surtout il dispose aussi d'une unité VMX 128bits. C'est une unité de calcul vectoriel, c'est à dire qu'elle est capable de travailler sur des vecteurs en appliquant la même opération à chaque composante du vecteur. Le fait que ce soient des unités 128 bits est très important car 128 bits est la taille d'un vecteur 4D (x, y, z, w) utilisé en modélisation "3d".
Remarque : plus d'infos sur le pourquoi du comment de vecteurs 4D (ou quaternions) pour des objets 3D ici et plus précisément la deuxième partie qui parle de translation.
Les unités VMX vont être très utiles dans la manière que la xbox peut rendre une scène 3D. En effet, la Xboite 360 peut utiliser une nouvelle technique de rendu appelée : »Procedural Synthesis ». Pour faire simple, je reprend l'exemple de Ars Tecnica. Imaginons un jeu qui se passe dans la forêt. On veut que le jeu soit réaliste donc il faut que les arbres que l'ont rencontre soient aussi différents que possible. Comment fait-on dans les jeux actuellement, on demande à un graphiste de pondre 3 arbres différents et on peuple la forêt avec. Forcément, le résultat ne fait pas très réaliste. La solution au problème? Embaucher plus de graphistes . Trop cher et ça pose problème au niveau stockage (10000 arbres « haute résolution » différents ça prends plus de place que 3). De plus, tout objet 3D est représenté à l'écran sous forme de vertices (sommets des polygones qui sont texturés par la suite) et les arbres hires, c'est pareil. Si on doit afficher une pleine colline remplie d'un millions d'arbres, il va falloir un débit énorme pour faire transiter les vertices vers le CPU puis vers le GPU. La solution à ce problème est le « procedural synthesis ». « procedural synthesis », comment ça marche?
En fait, on ne va pas stocker les vertices des arbres en RAM. On va stocker une description de haut-niveau en opposition à description de bas niveau (Vertices). On va donc stocker des informations comme le type d'arbre, sa taille, la position de chaque feuille.. et c'est le xenon via ses unités VMX qui va s'occuper de générer les vertices à partir de la description de haut niveau. Il va stocker le résultat dans son cache L2. Dès que le GPU a besoin de ces données, il va directement chercher ces données dans le cache du processeur.
En quoi c'est intéressant au niveau parallélisme de traitement?
On peut imaginer le traitement suivant: 1 thread principal qui s'occupe du moteur 3D et qui pilote 1 autre thread qui s'occupe de la génération à la volée des vertices. Youpi!! ça nous fait déjà deux threads Mais on peut aller plus loin et ne pas avoir un thread de génération de vertices mais deux ou trois Il « ne reste plus qu'à » occuper le ou les autres cores avec les calculs physiques ou l'IA ce qui n'est pas une mince affaire.
Et je terminerai ma prose incompréhensible en disant que la programmation multi-thread, c'est déjà pas très simple à la base mais qu'en plus appliqué aux jeux, on commence à s'arracher les cheveux alors quand on se rend compte que c'est pour la xboite 360, on devient chauve . Même si tous n'est pas noir puisque les devs disposent de nouvelles techniques intéressantes comme le "procedural synthesis" mais surtout que Microsoft fournit surement le meilleur environnement de développement pour console.
Je concluerai sur cette phrase "dans la xbox360, tout est bon sauf le xenon" M'enfin toutça pour dire que la programmation de jeux vidéos, c'était plus simple avant et que je trouve que dire Citation :
mais c'est quand meme dommage de ne pas exploiter les 3 cores et de le faire tourner en 60.
|
est très facile mais que fournir le boulot dernière pour passer de 1 core à 3 l'est beaucoup moins.
<Mode Gros pavé = Off>
PS: Pour en revenir à la niouze de Nofrag, il me semble avoir lu que le jeu sur Xboite serait au niveau graphique moyen sur PC. Je pense donc plutôt que le jeu est "GPU limited" plutot que CPU limited. S'il était CPU limited, le niveau graphique ne sera sûrement pas au niveau moyen mais plutôt élevé. Même si en repensant au « procedural synthesis », le CPU est beaucoup plus mis à contribution qu'avant.
Néanmoins, il y a peut être une autre explication au niveau "moyen" des graphismes. Peut être que le fait que le jeu sur XBoite soit au mieux en 720p fait que les textures du niveau élevé du PC ne seraient d'aucune utilité.
D'ailleurs, est ce que quelqu'un sait si chaque galette de jeu contient des textures lowres (pour l'affichage en SD) et highres (pour HD)?je ne me rappelle plus si ça été dit. PPS: pour ceux qui n'ont rien compris à ce que j'ai raconté, voici les urls des articles sur lesquels je me suis basé:
- XENON et parallèlisme
- XENON et procedural synthesis : - A quoi servent les matrices dans un moteur 3D ?
|