Maison >développement back-end >C++ >Comment pouvons-nous désoptimiser intentionnellement un programme pour les processeurs Intel Sandybridge ?

Comment pouvons-nous désoptimiser intentionnellement un programme pour les processeurs Intel Sandybridge ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-02 11:43:09957parcourir

How Can We Intentionally Deoptimize a Program for Intel Sandybridge CPUs?

Désoptimisation d'un programme pour le pipeline dans les processeurs Intel de la famille Sandybridge

Introduction

Le but de cette mission est de modifier un programme donné pour diminuer ses performances, appelé désoptimisation. Cette tâche nécessite une compréhension de l'architecture du pipeline Intel i7 et de la manière de réorganiser les chemins d'instructions pour introduire des dangers.

Techniques de désoptimisation

1. Faux partage :
Faire en sorte que les variables non atomiques soient stockées dans la même ligne de cache, ce qui entraîne des blocages de transfert de stockage.

2. Étals de transfert de magasin :
Utilisez XOR pour inverser le bit de signe d'un double au lieu d'utiliser l'opérateur "-", forçant un magasin étroit à un seul octet du double.

3. Désambiguïsation de la mémoire :
Placez les données 4096B à part pour déclencher de fausses dépendances sur les magasins vers différentes pages.

4. Données mal alignées :
Utilisez __attribute__((packed)) pour forcer le désalignement des variables à travers les limites de la ligne de cache ou de la page, augmentant ainsi les échecs de cache.

5. Stride :
Boucle sur les tableaux avec un pas de 4096 octets, provoquant un accès à la mémoire non contigu et réduisant l'utilisation du cache.

6. Liste chaînée :
Stockez les résultats dans une liste chaînée, introduisant des dépendances de charge de poursuite de pointeur et des nœuds potentiellement dispersés en mémoire.

Déoptimisations basées sur le compilateur

1. Variables atomiques :
Utilisez std::atomic et std::atomic pour un code plus lent et plus de surcharge en raison des barrières de mémoire.

2. Double long :
Utilisez des variables doubles longues pour forcer l'émulation x87, même avec des processeurs compatibles SSE2.

3. Conversions entières :
Convertissez à plusieurs reprises entre les types entiers et flottants, en introduisant des instructions de conversion avec une latence élevée.

4. Appels système :
Introduisez des appels système fréquents et inutiles pour forcer les changements de contexte et les échecs de cache/TLB.

Conclusion

En employant ces techniques, il est possible de pessimiser considérablement le donné programme et le faire fonctionner beaucoup plus lentement que sa version originale. La clé d'une désoptimisation réussie est de justifier chaque étape par une « incompétence diabolique » plutôt que par une intention malveillante.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn