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:
/QIntel-jcc-erratum
sur AMD, quelles pourraient être des explications possibles?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.