Bof pas tellement, c'est purement logique.
On a deux cartes.
Les deux calculent en 32 bits sauf ... pour les cores des shaders.
- Les core des nvidia utilisent soit un mode 16 bits, soit un mode 32 bits (64 ou 128 bits en fait)
- Les core des ati utilisent quoiqu'il arrive un mode 24 bits(96bits)
Le mode 24 bits d'ati est completé par une unité logique, ou par l'api qui peut fait aussi faire la convertion/complement abritraire 24bits -> 32 bits (masquage et shiftage des bits puis écriture en mémoire).
Au niveau programme, on a une api: Directx8 ou Opengl qui utilise des shaders 8/16 bits, Directx9 qui utilise et requière des shaders 32 bits.
Quoiqu'il arrive les types de données sont toujours calculés en puissance de 2, et sont calqués sur la norme Ansi et conforme à l'IEEE: on a donc du 8/16/32/64/128 bits.
bool true or false
int 32-bit signed integer
half 16-bit floating point value
float 32-bit floating point value
double 64-bit floating point value
Directx utilise en mode high precision, des vecteurs ou des matrices de 4 floats.
Quand il a été question de passer aux shaders2, Microsoft n'a pas donné les spécificités assez tot aux constructeurs. Ils se sont posés la question, les shaders2 seront ils en 16bits ou passeront -ils en 32 bits.
Du coté de nvidia, la question a été résolu de cette façon: La carte gera aussi bien le 16 , que le 32.
Chez Ati, ils ont coupé la poire en deux:
32 bits - 16 = 16 bits / 2 = 8 bits
32 - 8 = 24 ou 16 + 8 = 24 bits
Le 24 bits d'Ati est née de ça
Plus sérieusement, historiquement parlant, les buffers des cartes grand publique utilisaient auparavant que 24 bits (colorimétrie) sur les 32 bits, les 8 bits restant étant reservé au canal alpha. Chose que l'on ne prendra pas en compte, tellement c'est devenu absurde d'utiliser du 24bits, avec l'arrivée des shaders.
Ca serait donc beaucoup moins couteux de sortir une carte, et de lui rajouter une unité logique qui convertit les données au dernier moment, que des unités axé 32 bits qui ne seraient pas entièrement utilisées. Dans le meilleur des cas, l'Ati serait plus rapide en 16 bits, et dans le pire un peu moins rapide en 32.
Maintenant, si on regarde les conséquences que ça entraine au niveau des jeux avec les shaders 2, ça donne à peu près ça.
Chez Nvidia, le mode 16 bits est utilisé pour crée des petits shaders dynamique qui ne demandent pas des gros calculs, le mode 32 bit est utilisé pour les shaders complexes, par exemple les fonctions logarythmique ou exponentielle qui demandent au minimun 22 bits de précision.
Pour ati quoiqu'il arrive le traitement est de 24bits.
Prenons un exemple vulgaire(fictif pour que tout le monde comprenne) avec une simple division. On doit donc operer une division qui doit donner un resultat avec un nombre de chiffres donnés après la virgule :
en 16 bits, pas de problemes, le resultat doit avoir 2 chiffres après la virgule et donne 2 chiffres après la virgule.
en 24 bits, pas de problemes, on a 3 chiffres après la virgule de demandé, et 3 chiffres après la virgule de renvoyé
en 32 bits, la division est effectué avec des nombres à 3 chiffres max après la virgule (le quatrième étant zappé), et la division nous renvoit un resultat avec trois chiffres après la virgule completé par un 0.
D'autres problemes interviennent avec des problemes d'arrondi sur le 0, ou sur les types de données signés en limite de typage, le signe s'inverse.
En gros, quand une Ati doit executer un shader en 32bits, les erreurs d'arrondi se propagent sur l'intégralité du calcul, il y a ce qu'on appelle un overflow ou underflow. Visuellement, il y a l'apparition d'artefacts, ou on peut dire simplement que les shaders partent en vrille.
C'est assez flagrant sur le bench de anandtech de gunmetal2 qui utilise les vertex shaders2(qui peut requerir des fonctions mathématiques qui demandent une precision importante), on voit entre autre un probleme d'artefact au niveau du canal alpha et de la colorimétrie:
L'image en full precision 32 bits nvidia:
L'image avec les artefacts 24 bits ati:
Regardez la luminosité générale, la couleur du sol, des flames.
Anandtech a aussi parlé de ces artefacts: clignotement des textures des murs, disparition de l'eau, dans le bench de tombraider qui utilisent les pixels shaders2, sans savoir d'ou ça provenait.
En fait, les shaders2 quand ils simulent le comportement de l'eau d'une façon à peu près réaliste, requièrent une précision 32 bits. Et lorsque l'on s'approche d'un mur et que ça clignote, c'est le z-buffer qui n'a pas une précision suffisante pour arriver à determiner la profondeur de champs. Ca entraine que les pixels se superposent(et donc disparaissent et apparaissent).
Toutes ces choses ne devraient pas arrivé, si le programme utilisait un mode dégradé de l'api directx avec les bias, complement, saturate etc... ou tout simplement si la carte ne masquait pas sa précision réelle. Dans ce cas, le compilo de directx refuserait tout simplement de compiler le shaders pour une archi 32bits.
L'ide rendermonkey permet de transformer les shaders vers une precision amoindrie 24 bits pour les ati.
Mais bon Tomberaider, est un jeu qui est sorti à la va vite, non optimisé pour le 24bits ati, mais qui nous en dit quand meme assez sur les performances des ati en 32bits avec le path générique dx9.
Au niveau shader(je ne parle pas du reste), les cartes Ati sont donc plus lente en 16 bits(car elles opèrent le calcul en mode 24bits), plus rapide en 32 bits sur des shaders car elles font les calculs en 24 bits(24->32), et ne peuvent pas utiliser tel quel les shaders 32 bits.
C'est entre autre pour ça, et à cause de l'exigeance des utilisateurs envers les jeux dx9, qu'Ati a eu des grosses sueurs froides. Tout le monde voyait le dx9 à la porte avec les radeons, alors qu'il était bien loin.
Ati en voyant ça, s'est rapprochés de Valve, createur du plus gros jeu de l'année directx9. Il aurait été plus bénéfique pour Ati que ça soit des jeux du style: tomberaider, etc qui sortent en premier car ils utilisent très peu les shaders 2, et ça aurait justifié au bout d'1 ans, que l'archi etant vieillissante, il faudrait donc passer maintenant en full 32 bits pour faire peter les shaders 2.
Mais la, ils etaient mal, le deuxieme jeu dx9 qui sort, c'est THE monstre qui va tapper directement dans les ressources de la carte graphique avec des shaders 32 bits.
Ca n'était donc pas dans l'interet d'Ati que le jeu sorte trop tot (imaginez tout le monde se rend compte que les radeons forcent le mode 32bits en trompant le compilo de l'api et font donc en réalité du 24bits ce qui entraine des bugs). En plus, dans l'état de half life, avec un path générique dx9 32 bits, les ati n'avaient clairement aucune chance.
Cette alliance leur a permis de commencer à implanter dans le jeu, un path 24 bits spécifique, qui corrigeait les problemes de calculs dont j'ai parlé au dessus en réduisant la precision générale. Path qui a été caché à la presse, jusqu'a la semaine dernière ou le leakage des sources a montré qu'un developpeur d'ati etait intervenu dans les phases de developpement. Dans ce mode 24bits, les nvidias ne peuvent pas avoir des performances équitables, et visuellement correctes.
En fait, les nvidias font les calculs 24bits, à la vitesse du 32bits avec une qualité dégradée, tandis que les ati tournent à plein régime.
Mais, bon tout ceci n'est pas le seul probleme des ati, il y a aussi le nombre d'emplacements pour les instructions qui constituent un fragment shaders: 160 pour les ati , contre 1024 pour les nvidias(qui collent aux spécifications fragment shaders 3).
Carmack avait d'ailleurs fait une petite reflexion en janvier, les shaders2 des ati sont plus rapides car ils sont calculés en 24 bits, la ou les fx font du 32bits, mais les ati atteignent rapidement leurs limites du fait du petit nombres d'emplacement pour les instructions ...
Il a complété en parlant des modes dégradés, qu'il y a peu de chances pour que les jeux dx9 dans l'avenir utilisent que des shaders de faibles precisions (il parlait du mode 16bits, et 24bits pour ceux qui n'ont pas compris). Ce qui est tout à fait normal, car Carmack se bat depuis des années pour travailler avec des shaders 32bits et qu'il est en quelque sort le père spirituel des fx.
Tout ceci, n'est donc pas le fruit du hasard, Ati avait planifié la sortie d'une architecture qui devait introduire le directx9, et non le supporter à toc.
En gros, les radeons actuelles supportent des petits shaders 2 simples quand ils sont optimisés pour, et parfaitement les shaders 1.x. Mais, ces cartes ne sont pas du tout faites pour supporter, les shaders 2 high precision 32bits de directx ou opengl, et des jeux qui arrivent.
Regardez un peu le parcours de ces cartes, ça fait quand meme 1 an qu'elles sont là, et elles ont gagné leur pari: faire tourner les jeux de leur époque à des vitesses respectables.
J'espere n'avoir déçu personne, mais on le savait tous au fond de nous, que le trucage mathématique 24 bits, ne pouvait pas faire de miracle et était une solution provisoire à un probleme concret. Les shaders requièrent 23 bits de mantisse, 1 bit de signe, et 8 bits d'exposants.
Combien de sites ont posé la question pourquoi "le 24 bits des Ati est plus performant que le 32" etc... Au point que le 24 bits était devenu quasimment la norme informatique
Mais les articles ont zappés l'essentiel. Pourquoi Nvidia utilise des unités 32 bits pour des calculs qui demandent une précision de 32 bits. Pourquoi les gens qui travaillent dans les jeux vidéos et dans l'infographie utilisent du 32 bits au détriment du 24 bits.
Enfin, voila toujours est il que chez Ati, ils font bien marrer. Leur dernière invention pour tenir la route, c'est l'overdrive. En gros maintenant, ils overclockent les cartes pour tenir la route face aux nvidias, est ce qu'il faudra overclocker aussi les nvidias pour faire des benchs ? Et ça, bien que l'idée sortie du contexte ati vs nvidia soit séduisante, ça sent le cramage à plein nez, ou l'usure du matos acceleré.
Message édité par nicolas_b le 11-10-2003 à 04:10:02