AMD K8 - Partie 3 : Etude de l'Architecture | ||||
By Franck D. - 16/02/2003 | ||||
Performances du K8 en 64 bits
Le plus difficile a certainement consisté à trouver le code le plus approprié à ce genre de tests. Nous avons essayé de nombreuses routines faisant intervenir des calculs entiers et des calculs flottants, et nous sommes tombés sur quelques constatations, dont il a fallu tenir compte pour donner toute la validité souhaitée aux tests que nous avons effectués.
En résumé, autant de désagréments liés au caractère "béta" de ces compilateurs et qui ont rendu ce test assez délicat afin de ne pas fournir des résultats erronés. Nous espérons que la version définitive du compilateur AMD64 de Microsoft corrigera tous ces petits désagréments. Nous avons donc retenu les routines suivantes :
Toutes ces routines ont été compilées au sein de
deux exécutables, une version 32 bits et une version AMD64. La
première constatation concerne la taille des deux fichiers binaires
: 33280 octets pour la version 32 bits, et 41472 octets pour la même
version AMD64. Le binaire 64 bits est donc 24% plus volumineux que son
homologue 32 bits. Pas de doute, la recompilation 64 bits fait bien grossir
le code !
Le gain de performance en 64 bits est donc principalement du à la diminution du nombre d'instructions par rapport au code 32 bits. La routine utilisant de nombreuses variables, le compilateur 32 bits a besoin de nombreuses instructions pour les récupérer depuis la pile (à partir du registre [esp], ce qui rend ces instructions facilement identifiables). Ce qui n'est pas le cas dans le code 64 bits, où chaque variable ou constante se voit stockée dans un registre. Cela apparait clairement dans le code, où l'on remarque l'usage des 8 GPR supplémentaires, r8 à r15. Comme nous le voyons, la diminution du nombre d'instructions apporte d'importants gains de performances. Mais un autre facteur peut intervenir, qui permet de gagner quelques cycles processeurs. Celui-ci apparaît dans la routine de calculs arithmétiques, dont nous n'afficherons qu'un extrait des codes générés :
Le compilateur 32 bits n'a pas utilisé cette instruction et a
donc généré un branchement (jle SHORT $L22360). Pourquoi
cela ? Le compilateur 64 bits en revanche génère du code pour une architecture débutant avec l'Athlon 64, et peut donc générer toutes les instructions que celui-ci supporte, en l'occurrence le cmovg dans notre exemple. Voyons maintenant les résultats obtenus avec les deux routines en virgule flottante.
Cela dit, nous voilà rassurés quant au comportement du K8 en code SSE/SSE2. A condition d'utiliser des instructions scalaires, le K8 ne perdra pas sa suprématie en calcul flottant. Seule ombre au tableau : les fonctions trigonométriques. Comme nous l'avons évoqué plus haut, le compilateur 32 bits utilise les instructions x87 pour générer un sinus, un cosinus ou un tangente, là où la version 64 bits utilise les fonctions standards de la librairie C, qui ne propose qu'une approximation des fonctions trigonométriques à l'aide de suites (donc très lente). Espérons que la version définitive du compilateur de Microsoft adoptera une méthode plus rapide.
Les résultats obtenus après recompilation 64 bits nous ont agréablement surpris, et on est en droit d'espérer que les valeurs que nous avons obtenues soient généralisables. La condition étant bien sûr d'avoir à disposition un compilateur efficace, et celui de Microsoft est prometteur. Si la version définitive corrige les quelques problèmes d'optimisation que nous avons rencontrés, le nouveau Visual C++ 8.0 risque de devenir rapidement une référence dans les compilateurs utilisés par l'industrie, notamment celle du jeu vidéo, comme c'est le cas aujourd'hui pour la version 6.0. Comme vous l'avez compris, la sortie d'un bon compilateur AMD64 sera
le facteur déclenchant de l'apparition de drivers matériels
et d'API performantes destinées à l'AMD64, qui elles-mêmes
rendront les environnements 64 bits attractifs aux utilisateurs.
|
||||
Fermer |