Renversement d'une variable

Je ne sais pas ce que c'est, mais ça plaît pas à Linus

L'auteur de ce sujet a trouvé une solution à son problème.
Staff
Auteur du sujet

Salut,

Sur développez un petit billet nous parle d'un bug sur GCC 4.9.

Il est question qu'un renversement de constante intempestif. Mais malgré quelques recherches, je n'ai pas trouvé de réponse satisfaisante.

Qu'est-ce qu'un renversement de variable ? A quoi sert-il ?

+0 -0

Salut,

En regardant la version originale de la ML, le terme utilisé par Torvald est « spilling a constant ». On peut donc déduire qu'une variable « renversée », c'est une variable qu'on a mise en RAM plutôt que de la laisser dans un registre. Ce genre de cas est rendu nécessaire, car on a un nombre limité de registres (Wikipedia). Cependant, il faut choisir intelligemment comment faire cette allocation de registre, et la manière avec laquelle gcc fait cela ne mérite apparemment pas de sortir de maternelle. :p

Si je dis pas de bêtises : dans le code qu'on peut lire ici, $load_balance_mask est une constante « immédiate » qu'on met sur la pile à l'adresse -136(%rbp). Puis, quelques lignes plus loin, on récupère sa valeur pour la mettre dans le registre rax (movq correspondant à un déplacement de 64 bits). Évidemment, ç'aurait plus rapide de la manipuler si elle était restée disponible dans un registre, plutôt que de devoir aller la chercher dans une mémoire plus lente.

ÉDIT : Grillé, mais je poste quand même.

Édité par Lucas-84

Je me permets de déférer un peu le sujet. Le spilling, comme l'indiquait Lucas, c'est quand on vient stocker une variable en RAM pour libérer un registre su processeur pour d'autres calculs. Ce qui fait râler Linus, c'est que, dans le code qu'il a étudié, la variable sauvegardée en RAM était en fait une constante, cz qui fait que l'opération de sauvegarde et celle de restauration qui suit un peu plus loin auraient pu être remplacées par une seule opération de chargement de valeur fixe dans le registre (en adressage immédiat). C'est un bête manque d'optimisation. Par contre, c'est fonctionnel, c'est juste lent. Le bug qui a fait que Linus est allé voir le code source généré, c'est pas celui là, le bug, c'est que le code stocke les variables sur la pile avant de modifier le pointeurs de pile, ce qui fait que les valeurs se retrouvent corrompues si une IT tombe entre le spilling et le redimensionnement de la pile. (et je vous épargne le passage sur le red-zoning, qui ne nous concerne pas ici).

+2 -0

Au passage on peut noter que cette traduction sur DVP est spectaculairement mauvaise. La question se pose de savoir si l'auteur de l'actualité comprend les termes techniques anglais traduits à la rache, et sinon (ce qui n'est pas du tout un problème en soi) pourquoi choisir d'en faire une traduction littérale incompréhensible au lieu de ne pas rentrer du tout dans les détails techniques.

Une bonne raison en tout cas de se méfier de la couverture francophone des sujets techniques, et d'aller toujours consulter la source originale pour des informations précises. Si tu avais cherché "compiler spilling" tu aurais trouvé des résultats pertinents tout de suite.

+0 -0

Je pense que l'auteur de DVP a juste fait une news "buzz" sur un coup de gueule de Linus. C'est contraire à toute l'éthique journalistique, mais, à priori, il n'est pas journaliste, et la difficulté de faire vivre un site de news me fait comprendre la démarche (à défaut de l'approuver).

Pour ce qui est de la couverture francophone, effectivement, on y perd à la traduction, et, pour les anglophones, la meilleure source d'information reste le lien de dinosaure sur le bugtracker de gcc (où Linus est bien plus courtois que sur LKML), et je ne destinais mon message qu'à ceux pour qui l'anglais technique n'est pas accessible. Je pense que si les gens doivent attendre d'avoir un bon niveau d'anglais pour commencer à étudier l'informatique, on va perdre beaucoup de temps inutilement. A terme, la maitrise de l'Anglais est indispensable, mais s'il fallait commencer par là, on n'aurait pas créé ZDS.

+0 -0

Ce n'est en aucun cas une critique des sites francophones. Je comprends que tout le monde ne soit pas forcément à l'aise avec l'anglais, et par ailleurs c'est une bonne idée dans l'absolu de faire vivre des espaces de qualité dans notre langue maternelle, quelle qu'elle soit. Vu l'effort que ça demande et le déséquilibre de ressources, c'est quelque chose que j'admire et je respecte. Par contre il n'empêche que (même si on suit en général l'actualité par les canaux francophones) il est important de remonter à la source.

Au sujet de DVP : je ne critiquais pas l'aspect "buzz" de la news en soit. On peut le faire (tu le fais sans doute à juste titre), mais on peut aussi se dire "hoho des insultes fleuries ça va intéresser notre lectorat même non-technique" (d'ailleurs puisque personne dans les commentaires de la news n'a relevé l'absurdité du contenu technique, on peut supposer que le lectorat est en très grande majorité non-technique). Par contre si on fait ce choix de faire du buzz, pourquoi essayer d'ajouter quand même des détails techniques et le faire mal ? Intrigué par cette news, je suis allé regarder de près la couverture journalistique (majoritairement anglophone) de ce petit non-événement; la plupart des sites ne sont pas rentrés dans les détails, et c'est très bien. Le défaut de cet article est de vouloir le faire sans en avoir, il semble, les moyens.

(Après il est difficile de jouer aux devinettes sur les compétences techniques de l'auteur et je ne voudrais pas trop m'avancer. Ça peut être quelqu'un qui comprend l'aspect technique mais qui était crevé ou bourré et n'a pas trouvé qu' "indexer un problème de renversement de constante" ça faisait un peu Google-Translate. Des erreurs ça arrive chez tout le monde. Ça semble quand même assez peu probable.)

Édité par gasche

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte