| April 12, 2009 10:00 PM PDT | |
Cet article traite des cœurs graphiques Intel® GMA 4500, X4500 et X4500HD (Graphics Media Accelerator) qu’intègrent les chipsets Intel® série 4 (chipsets Intel® G41, G43 et G45 pour PC de bureau, GM45 et GM47 pour PC portables). Il propose en particulier des conseils et astuces de développement pour rendre vos jeux ou vos applications interactives 3D aussi visuellement attractifs que possible. Les commentaires de la communauté des développeurs et de nos clients sont les bienvenus, nous permettant ainsi d’approfondir davantage de conseils et astuces.
En général, les cœurs graphiques Intel GMA appartiennent à une génération donnée, dont la désignation générique est « GenX » (Gen3, Gen4, Gen5, etc.) et qui couvre environ une année. Chaque génération voit les capacités et les performances de ces moteurs graphiques se renforcer par rapport à la précédente. Ils représentent ainsi actuellement la solution graphique numéro un pour les acheteurs de nouveaux PC. Il semble donc logique d’optimiser vos applications 3D pour ce vaste marché et de proposer ainsi le meilleur confort visuel possible au plus grand nombre. Les conseils et astuces fournis dans cet article vous donnent la possibilité de faire profiter vos applications des performances offertes par Intel, leader des sous-systèmes graphiques de grande série.
L’architecture des derniers-nés des sous-systèmes graphiques intégrés d’Intel a été pensée pour la prise en charge de DirectX* 10. Autrement dit, ils disposent de caractéristiques cohérentes sans que des bits d’aptitude (capability bits ou cap bits) ne soient nécessaires. Leur architecture exploite également un modèle de nuanceurs (shaders) généralisé et universel. Ils exécutent les nuanceurs de vertex, de géométrie et de pixels sur l’ensemble des unités d’exécution (Execution Units, EU). Pour renforcer le débit, celles-ci sont parallélisées.
Les solutions graphiques intégrées d’Intel continueront d’appliquer l’architecture UMA (Unified Memory Architecture). De même que pour leurs devancières, cette architecture leur permet d’utiliser, le cas échéant, des ressources mémoire en tant que mémoire vidéo. Intel poursuit par ailleurs son action auprès des fondeurs de puces DRAM, qui vise une augmentation continue de la bande passante mémoire. La progression enregistrée en un an (cf. tableau ci-dessous) devrait par ailleurs se poursuivre.
|
|
2007 |
2008 |
||
|
Chipset |
G35 |
GM965 |
G41, G43, G45 |
GM45, GM47 |
|
Segment |
PC de bureau |
PC portables |
PC de bureau |
PC portables |
|
Archi Gfx |
Gen 4.0 |
Gen 5.0 |
||
|
BP mémoire (Go/s) |
10,7 – 12,8 |
8,5 – 10,7 |
12,8 – 23,1 |
10,7 – 17,1 |
|
Capacité UMA |
2 x DDR2-667/800 |
2 x DDR2-533/667 |
2 x DDR3-800/1066/1333 |
2 x DDR3-667/800/1067 |
|
DVMT maxi (XP) |
384 Mo |
> 512 Mo |
||
|
DVMT maxi (Vista*) |
256 ou 384 Mo |
256 ou > 512 Mo |
||
Les cœurs graphiques Intel GMA considérés ici assurent le traitement matériel (Hardware Vertex Processing, HWVP) et logiciel (Software Vertex Processing, SWVP) des vertex. Or le débit HWVP s’est considérablement amélioré en Gen5, puisqu’il a doublé par rapport à la génération précédente. Par défaut, c’est le traitement HWVP qui intervient pour tous les logiciels. En revanche, il est possible que, dans le cas des processeurs Intel® Core ™2 Duo ou Quad, le traitement des vertex enregistre des gains de performances encore plus importants s’il est confié au processeur. Dans tous les cas, le pilote déclarera toujours une prise en charge HWVP complète. Nous conseillons d’utiliser D3DCREATE_PUREDEVICE à la création, ce qui permet, en fonction des performances requises par telle ou telle configuration (dont le GPU) ou charge logicielle, d’assurer le traitement SWVP. Ce type de traitement bénéficie d’optimisations qui vont au-delà du pipeline PSGP (Processor Specific Graphics Pipeline) du moteur d’exécution de DirectX et qui permettent d’exploiter les instructions et les capacités des processeurs dans leur évolution. Les étapes VS/Clip correspondent à une transmission sans intervention et réattribuent les ressources de calcul au traitement des pixels. Cette situation peut se traduire par une progression globale des performances : nous avons ainsi enregistré dans certains cas des gains de 30 % grâce au traitement SWVP. Là encore, tout dépend de la configuration et de la charge concernées.
ASTUCES POUR LE TRAITEMENT DES VERTEX/PRIMITIVES
- Pour maximiser la réutilisation du vertex cache, utiliser DrawIndexedPrimitive().
- Autant que possible, préférer les bandes de triangles aux listes. Renoncer complètement aux éventails (dépréciés dans DirectX 10).
- Pour rejeter les objets qui sont en dehors du champ de vision et ainsi réduire l’incidence du clipping, réaliser des tests de visibilité.
a. Pour les objets qui ne nécessitent pas de clipping, utiliser D3DRS_CLIPPING == FALSE. - Pour amortir le délai d’exécution et le temps système correspondant aux pilotes, prévoir un batching adéquat.
a. Prévoir entre 200 et 1000 : mieux vaut prévoir large.
b. Limiter les changements d’état entre les batches, ce qui réduira les vidages matériels du pipeline. - Exploiter l’early-z rejection.
a. Effectuer le rendu avec une passe z-only (sans écritures en tampon des couleurs ni exécution du nuanceur de pixels), suivie par une passe de rendu normale, plus ou moins de l’avant vers l’arrière. Cette opération tire parti des gains de performances propres à l’early-z pour le rejet des fragments occlus, ce qui réduit les délais de calculs et les opérations de tramage (raster).
b. Il faut bien entendu la mettre en balance avec le coût de la passe supplémentaire : donc à éviter si elle augmente les changements d’état de rendu ou fait empirer le batching à cause du tri.
c. Eviter l’utilisation de valeurs z modifiées (tampon de profondeur) dans le nuanceur de pixels. - Pour réduire l’overdraw dans les scènes complexes, utiliser une requête d’occlusion. Effectuer le rendu de la boîte englobante ou d’un modèle simplifié : si le résultat est nul, c’est que l’objet ne nécessite aucun rendu.
Si les deux générations de cœurs graphiques qui sont envisagées ici gèrent le Shader Model 4.0 de DirectX 10, les capacités de calcul sont cependant nettement plus élevées pour la Gen5 que pour la Gen4. Le différentiel est en effet de 25 % pour les calculs bruts, et tout à fait conséquent en termes de performances des instructions dites « transcendantales ». La Gen5 bénéficie également d’une gestion renforcée de la latence à des fréquences plus élevées. En dernier lieu, les nuanceurs aux instructions plus longues sont mieux gérés.
ASTUCES POUR LES NUANCEURS
- Toujours préférer la version la plus récente de Shader Model : la version 4.0 est préférable à la 3.0, et la 3.0 préférable à la 2.0, etc.
- Plutôt que des fonctions figées, utilisez autant que possible des nuanceurs programmables. Par exemple, utiliser un brouillard basé sur un nuanceur de préférence à un brouillard créé par une fonction figée.
- Lorsque c’est possible, effectuer une passe d’« échauffement » d’un nuanceur pour éliminer ses délais de compilation. Les nuanceurs se compilent au moment du « dessin », puis sont réutilisés. Grâce à la passe d’« échauffement », le nuanceur sera déjà compilé et donc prêt à l’emploi pour la scène concernée.
- Mettez en balance les échantillons de textures et la complexité du nuanceur. Un ratio d’ALU supérieur à 4:1 est conseillé :
a.Echantillon pour mieux régler les problèmes de latence.
b. Un ratio plus important peut être préférable pour les textures en virgule flottante, pour un filtrage d’ordre supérieur et pour les textures 3D. - Le nombre de registres par unité d’exécution par fil étant limité, les utiliser à bon escient.
- Réduire, quand c’est possible, le recours aux fonctions macro/transcendantales. Les instructions telles que LOG, LIT, ARL, POW et EXP sont en effet coûteuses.
- Pour les instructions non transcendantales, travailler en pleine précision.
- Masquer alpha si on ne l’utilise pas.
- Utiliser l’instanciation pour renforcer le débit du nuanceur en limitant les données de vertex, surtout pour les batches de taille réduite.
- Utiliser le contrôle du flux à bon escient :
a. En dynamique, il peut dégager d’intéressants avantages en sautant un grand nombre de calculs. L’utiliser quand il est possible de sauter une grande partie du nuanceur.
b. Préférer la prédication au contrôle dynamique du flux, surtout pour les séquences courtes de branchement d’instructions.
c. Le nuanceur opère sur seize pixels en parallèle. Autrement dit, les bénéfices dépendent alors de la probabilité du nombre de pixels empruntant la même branche. - Pour des performances optimales, employer moins de 32 constantes. Limiter l’usage des constantes indexées (C[ax]), car elles sont synonymes de forte latence pour les nuanceurs. On les trouve normalement dans les nuanceurs de vertex.
- Le cas échéant, utiliser des constantes immédiates (def). Le pilote les exploitera à la compilation du nuanceur.
- Ne pas mettre toutes les constantes d’un nuanceur donné dans un même tampon constant, faute de quoi il sera envoyé au GPU à chaque draw call. A la place, classer les tampons de constantes par fréquence de mise à jour.
- Eviter UpdateSubresource() pour les textures. Au lieu de cela, effectuer des mises à jour par une préparation à l’aide de Map() et transférer à partir de la zone de préparation avec CopyResource() et CopySubresourceRegion().
Tous les types de filtrage par échantillonneur sont pris en charge, y compris le filtrage anisotropique dynamique. En Gen5, les performances en filtrage trilinéaire en nombres entiers à 32 bits/pixel et bilinéaire en virgule flottante à 16 bits/pixel sont doublées.
ASTUCES POUR L’ÉCHANTILLONNAGE DE TEXTURES / LES OPÉRATIONS SUR LES PIXELS
- Eviter autant que possible le flottant 32 bits (FP32). Le filtrage FP32 est facultatif pour DirectX 9 et 10. Vérifier la prise en charge par les caps.
- Limitez les MRT à une valeur inférieure à 4. Utiliser le même format et, si possible, limiter la taille à moins de 128 x 128.
- Limiter le nombre d’appels Clear(). Quand ils sont utilisés tous les deux, vider les tampons des couleurs et Z/Stencil en même temps.
- Limiter Lock/Blt des tampons Z et stencil.
- A chaque fois que possible, utiliser des textures compressées et des mipmaps. Eviter l’utilisation de textures volumineuses même si 8K x 8K est pris en charge.
- Préférer les Shadow Maps aux Stencil Shadows.
- Attribuer les surfaces par ordre de priorité : les surfaces de rendu les plus utilisées sont à attribuer en premier. Pour la mémoire verrouillable (tampons vertex/index dynamiques), utiliser D3DPOOL_DEFAULT ; pour la mémoire non verrouillable (textures, tampons d’arrière-plan, etc.), utiliser D3DPOOL_MANAGED.
En appliquant les conseils et astuces ci-dessus pour optimiser vos applications à destination des cœurs graphiques Intel®, celles-ci fonctionneront de manière très satisfaisante sur une palette de plates-formes graphiques extrêmement large. Pour toute difficulté dans la mise en œuvre de ces indications, cliquez sur l’un des liens ci-dessous. Par ailleurs, n’hésitez pas à nous faire part de vos commentaires pour compléter les informations fournies par ce guide.
Pour toute question ou commentaire sur les jeux de composants Intel® dotés d’un cœur graphique, les programmeurs sont invités à les publier sur les forums Intel correspondants.Les développeurs de jeux trouveront par ailleurs une abondante documentation sur leur domaine de spécialité, sur des thèmes allant du multithreading au son, à la rubrique correspondante du site Intel® Software Network.
Reportez-vous à notre Notice d'optimisation pour plus d'informations sur les choix et l'optimisation des performances dans les produits logiciels Intel.
Commentaires (0) 
Trackbacks (0)
Réagir 
Day Kol (Intel)
|
