web-dev-qa-db-fra.com

Intel JCC Erratum - Quel est l'effet des préfixes utilisés pour l'atténuation?

Intel recommande Utilisation des préfixes d'instructions pour atténuer les conséquences de la performance de JCC Erratum.

MSVC si compilé avec /QIntel-jcc-erratum suit la recommandation et insère des instructions préfixées, comme ceci:

3E 3E 3E 3E 3E 3E 3E 3E 3E 48 8B C8   mov rcx,rax ; with redundant 3E prefixes

Ils disent MSVC recours à NOPS lorsque des préfixes ne sont pas possibles.

Clang a -mbranches-within-32B-boundaries option pour cela et préfère nop, multi-octets si nécessaire ( https://godbolt.org/z/399nc5msq avis xchg ax, ax)

Quelles sont les conséquences des préfixes 3E, spécifiquement:

  • Pourquoi Intel recommande-t-il cela et NOPS multi-octets?
  • Quelles sont les conséquences pour les processeurs non affectés?
  • Apparemment, un programme fonctionne plus rapidement avec /QIntel-jcc-erratum sur AMD, quelles pourraient être des explications possibles?
5
Alex Guteniev

J'ai maintenant un point de données. Le résultat de l'analyse comparative pour /QIntel-jcc-erratum sur AMD FX 8300 est mauvais.

Le ralentissement est d'un ordre de grandeur décimal pour une référence spécifique, où la prestation sur Intel Skylake pour la même référence est d'environ 20%. Cela aligne les commentaires de Peter:

J'ai vérifié le guide de microarch d'Agner FOG et AMD ZEN n'a aucun problème avec un nombre de préfixes sur une seule instruction, comme le général Intel depuis Core2. AMD Bulldozer-Family a une sanction "très grande" pour décoder des instructions avec plus de 3 préfixes, comme 14-15 cycles pour 4-7 préfixes

Il est quelque peu valable de considérer la famille de Bulldozer - assez obsolète pour ne pas s'en soucier beaucoup à ce sujet, bien qu'il y ait encore un peu APU des ordinateurs de bureau et des ordinateurs portables, mais ils montrent certainement de grandes régressions dans des boucles où Le compilateur a mis 4 préfixes ou plus sur une instruction à l'intérieur d'une boucle interne chaude (y compris les préfixes existants tels que REX ou 66H). Beaucoup pire que le décodeur de 3% du héritage Mite sur SKL.

Bien que, en effet, la famille Bulldozer est obsolète-ish, je ne pense pas pouvoir me permettre tant d'impact. J'ai aussi peur des autres processeurs qui peuvent s'étouffer avec des préfixes supplémentaires de la même manière. Donc, la conclusion pour moi est non à utiliser /QIntel-jcc-erratum pour logiciel généralement ciblé. Sauf si elle est activée dans des unités de traduction spécifiques et que la répartition dynamique est faite, ce qui est trop difficile de la plupart du temps.

1
Alex Guteniev